如何解决如何使用 MVVM 架构用房间中的数据填充微调器
我想知道用房间数据库中的数据填充任何微调器的最佳实践/方法。
我也想使用 viewmodel 和 LiveData(然后我将转向 StateFlow!),但我对定义变量的正确顺序感到困惑。
首先我在视图模型中有这个:
val aniosLiveData = anioRepository.anios.asLiveData() // return LiveData<List<Anio>>
然后在片段上,首先是视图模型声明:
private val ensayosviewmodel: Ensayosviewmodel by viewmodels()
然后,在 onViewCreated() 中,我有一个包含绑定元素的块:
binding.apply {
recyclerViewEnsayos.apply {
adapter = ensayosAdapter
layoutManager = linearlayoutmanager( requireContext())
setHasFixedSize(true)
}
spinnerAnio.apply {
adapter = aniosAdapter // <- Spinner adapter
}
}
我重写了 onCreate() 来定义一个观察者,然后我放了这几行:
ensayosviewmodel.aniosLiveData.observe(viewLifecycleOwner,{spinnerData ->
aniosAdapter = ArrayAdapter<Anio>(requireContext(),R.layout.spinner_text_item,spinnerData)
})
我需要在何处/何时声明“aniosAdapter”?像这样:?
//At class level
private lateinit var aniosAdapter : ArrayAdapter<Anio>
这是正确的方法吗? 还有另一种 ??更简单?
提前致谢! 最好的问候
解决方法
如果您需要在生命周期挂钩之外引用 aniosAdapter
,我建议您使用您提到的 private lateinit var
。当您首先正确初始化 spinnerAnio
的适配器时,它不会追溯识别您在执行生命周期挂钩后对 aniosAdapter
所做的任何更改。相反,您需要调整您的 aniosLiveData
观察者以显示如下:
ensayosViewModel.aniosLiveData.observe(viewLifecycleOwner,{
binding.spinnerAnio.adapter = ArrayAdapter<Anio>(
requireContext(),R.layout.spinner_text_item,it
)
})
在您确实需要引用生命周期钩子范围之外的 aniosAdapter
的情况下,您的观察者可能会与您引用的 private lateinit var
结合起来:
ensayosViewModel.aniosLiveData.observe(viewLifecycleOwner,{
aniosAdapter = ArrayAdapter(
requireContext(),it
)
binding.spinnerAnio.adapter = aniosAdapter
})
如果您可以保证您的观察者会立即触发,那么将 aniosAdapter
声明为 private lateinit var
是安全的。如果您不确定,将其视为可选字段会更安全,如下所示。干得好!
private var aniosAdapter: ArrayAdapter<Anio>? = null
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。