gpt4 book ai didi

android - ViewModelProviders 无法在我的 fragment 中工作

转载 作者:行者123 更新时间:2023-12-02 16:32:51 28 4
gpt4 key购买 nike

这就是我正在努力做的事情。

  • 在 Fragment 内设置对象的 ArrayList
  • FragmentActivity 中的观察者获取该数组容器(承载所有 fragment 的 Activity)

所以,我所做的如下。

首先,我创建了 SharedViewModel,我将在其中设置和获取数据:

SharedViewModel.kt

class SharedViewModel: ViewModel() {

var personArrayObj:MutableLiveData<ArrayList<Person>> = MutableLiveData()

fun setPersonArray(personArray:ArrayList<Person>){
personArrayObj.value = personArray
}

val getPersonArray:LiveData<ArrayList<Person>>
get() = personArrayObj

}

现在,我在托管所有 fragment 创建的 MainActivity 中实例化此 ViewModel,因此,我可以从任何 Fragment 获取 ArrayData它的集合:

MainActivity.kt

class MainActivity: FragmentActivity(){

private lateinit var viewModel:SharedViewModel

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

viewModel = ViewModelProviders.of(this).get(SharedViewModel::class.java)
viewModel.getPersonArray.observe(this, Observer { it:ArrayList<Person>
Log.d("Array:",""+it)
})
}

}

然后我需要做的最后一件事是从我想要的任何 Fragment 设置该数组的值,然后如果该值发生更改,将触发主机 Activity,因此,要做到这一点,我简单地执行 viewModel.setValue(personArray) 在我想要的 Fragment

问题

当我尝试在任何 fragment 中实例化 SharedViewModel 时,我遇到了这个问题:

enter image description here

我试图断言!对于 null,也使用 let,但不起作用,我想知道 FragmentActivity required 是从哪里来的

如果我使用viewLifecycleOwner而不是activity,它对我说它不能用FragmentFragmentActivity调用强>?

有什么线索吗?

谢谢。

最佳答案

Fragments 提供了一个用于检索非空 Activity 的辅助方法 - requireActivity()。使用它代替 activity:

viewModel = ViewModelProviders.of(requireActivity()).get(SharedViewModel::class.java)

作为替代方案,您可以在应用中包含 fragment-ktx 依赖项并使用 by activityViewModels() Kotlin 属性扩展而不是使用 ViewModelProviders.of() :

val viewModel: SharedViewModel by activityViewModels()

关于android - ViewModelProviders 无法在我的 fragment 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56811012/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com