- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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/
我有一个 fragment : class MyFragment : BaseFragment() { // my StudentsViewModel instance lateinit
我正在与一个触发两次的 LiveData 观察器作斗争。在我的 fragment 中,我正在观察如下的 LiveData,使用 viewLifeCycleOwner 作为 LifeCycleOwner
我正在从 Fragment 启动协程,我的理解是 lifecycleScope.launch {} 和 viewLifecycleOwner.lifecycleScope.launch {} 在大多数
我想观察实时数据viewlifecycleowner代替 this 但它没有解决。它的依赖是什么? 最佳答案 https://developer.android.com/jetpack/android
Flow有很多运营商,LiveData只有 3 个(转换)。除了 StateFlow 仍处于试验阶段之外,还有什么理由继续使用 LiveData? UPD。 StateFlow、SharedFlow
我是一名优秀的程序员,十分优秀!