如何使用 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