问题描述
我想知道用房间数据库中的数据填充任何微调器的最佳实践/方法。
我也想使用 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