我有一个 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/