如何做一些事情后,我初始化lateinit?



我有一个AutoCompleteTextView自定义适配器,自定义适配器从LiveData中获得它的列表,所以我在观察方法中初始化它。

问题是,我甚至需要通过使用adapter.getItem()来设置它的值,但当我试图转换它时,我得到了适配器未初始化的错误:

lateinit属性adapterFornitori未初始化

所以什么是最好的方式来调用我的函数设置AutoCompleteValue只有在我的适配器已经初始化后?

下面是我的代码:
// function which initialize my adapter
private lateinit var adapterFornitori: AutoCompleteAdapter
private fun initFornitori(testata: Testata) {
corpoViewModel.selectFornitori().observe(viewLifecycleOwner, {
adapterFornitori =
AutoCompleteAdapter(requireContext(), it.toMutableList(), R.layout.list_item)
autocompleteFornitore.setAdapter(adapterFornitori)
}).also {
setFornitore(testata.cod_fornitore)
}
}
private fun setFornitore(codFornitore: String?) {
if (codFornitore != null) {
autocompleteFornitore.tag = "SET"
autocompleteFornitore.setText(
adapterFornitori.getItemByCode(codFornitore).desc,
false
) // getting value from my adapter
}
}

我从片段的onViewCreated中调用该函数,如:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

... // code code code
.observe(viewLifecycleOwner, {
when (it.tipo) {
"Carico" ->
initFornitori(testata)
...
}
}
}

那么初始化适配器并只调用setFornitore的正确方法是什么呢?

代码:

also {
setFornitore(testata.cod_fornitore)
}

在你设置观察者的时候调用,也就是在观察者被调用之前,所以属性还没有被设置。你应该把这些代码移到观察者中:

private fun initFornitori(testata: Testata) {
corpoViewModel.selectFornitori().observe(viewLifecycleOwner) {
adapterFornitori =
AutoCompleteAdapter(requireContext(), it.toMutableList(), R.layout.list_item)
autocompleteFornitore.setAdapter(adapterFornitori)
setFornitore(testata.cod_fornitore)
}
}

与你的问题无关:

在我看来,这是不正确的使用lateinit。它适用于不能在构造函数中初始化的属性,但可以在onCreate()中初始化(或等价的类的第一个入口点,其中构造函数不是您自己代码的可用入口点)。所以你应该总是直接在onCreate()中初始化所有的lateinit属性。

因为在这种情况下,你不能初始化它,直到以后,更合适的是使它成为一个可空的属性,并用null初始化它。然后,无论在哪里使用它,都必须适当地处理它尚未被设置为非空值的可能性。

可以设置

if (::adapterFornitori.isInitialized){
autocompleteFornitore.tag = "SET"
autocompleteFornitore.setText(
adapterFornitori.getItemByCode(codFornitore).desc,false)
}

最新更新