android - 使用 viewLifecycleOwner 作为 LifecycleOwner

标签 android android-fragments android-livedata android-viewmodel

我有一个 fragment :

class MyFragment : BaseFragment() {

   // my StudentsViewModel instance
   lateinit var viewModel: StudentsViewModel

   override fun onCreateView(...){
        ...
   }

   override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
       super.onViewCreated(view, savedInstanceState)

       viewModel = ViewModelProviders.of(this).get(StudentsViewModel::class.java)
       updateStudentList()
   }

   fun updateStudentList() {
        // Compiler error on 'this': Use viewLifecycleOwner as the LifecycleOwner
        viewModel.students.observe(this, Observer {
            //TODO: populate recycler view
        })
    }
}

在我的 fragment 中,我有一个 StudentsViewModel 实例,它在 onViewCreated(...) 中启动。

StudentsViewModel中,students是一个LiveData:

class StudentsViewModel : ViewModel() {
    val students = liveData(Dispatchers.IO) {
          ...
    }
}

回到 MyFragment,在函数 updateStudentList() 中,我收到编译器错误,提示我传递给 .observe 的 this 参数(this, Observer{...}) 使用 viewLifecycleOwner 作为 LifecycleOwner

为什么会出现这个错误?如何摆脱它?

最佳答案

Why I get this error?

Lint 建议您使用 fragment View 的生命周期 (viewLifecycleOwner) 而不是 fragment 本身的生命周期 (this)。 Google 的 Ian Lake 和 Jeremy Woods 在 this Android Developer Summit presentation 中讨论了差异, Ibrahim Yilmaz 涵盖了 this Medium post 中的差异简而言之:

  • viewLifecycleOwner 绑定(bind)到 fragment 何时拥有(和失去)其 UI(onCreateView()onDestroyView())

  • this 与 fragment 的整个生命周期(onCreate()onDestroy())相关联,这可能会更长

How to get rid of it?

替换:

viewModel.students.observe(this, Observer {
        //TODO: populate recycler view
    })

与:

viewModel.students.observe(viewLifecycleOwner, Observer {
        //TODO: populate recycler view
    })

在您当前的代码中,如果 onDestroyView() 被调用,但 onDestroy() 未被调用,您将继续观察 LiveData,当您尝试填充不存在的 RecyclerView 时可能会崩溃。通过使用 viewLifecycleOwner,您可以避免这种风险。

关于android - 使用 viewLifecycleOwner 作为 LifecycleOwner,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59521691/

相关文章:

android - ImageView 不以 ConstraintLayout 为中心

android - 在没有 Surface View 的情况下使用 Android Camera

java - Android 上网抛出 IOException

android - 无法解析符号 PreferenceFragmentCompat

android - Google Calendar API V3 android - 免费获取全天事件BusyRequest

android - 内存问题 - fragment

android - 从 onPause 中的 fragment 中删除位置更新时发生内存泄漏

java - 进行单元测试时无法将Value 设置为 MutableLiveData - 抛出 java.lang.reflect.InvocableTargetException

android - 房间内存不足错误 R(OOM)

android - 将数据插入数据库时​​,我没有收到对 onChange 的更改