gpt4 book ai didi

android - 使用 viewLifecycleOwner 作为 LifecycleOwner

转载 作者:行者123 更新时间:2023-11-29 22:35:48 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com