我正在尝试使用ViewModel
,以保存数据以便在Fragments
之间共享。这就对了:
class AnimalViewModel : ViewModel() {
private var data = MutableLiveData<AnimalWithHints>()
fun setData(animalData: AnimalWithHints) {
data.value = animalData
Timber.e("Saved?")
}
fun getData(): LiveData<AnimalWithHints> {
if (data.value == null) {
Timber.e("Null?")
data.value = AnimalWithHints()
}
return data
}
}
所以我填充了非null对象(检查过它)并在事务之前写入:
ViewModelProviders.of(this).get(AnimalViewModel::class.java).setData(animalWithHints)
我看到“已保存?”当它发生时,我认为保存工作正常。我记录了AnimalWithHints
的一些领域,我看到它是正确的。
然后我尝试得到我的对象:
val animalWithHints = ViewModelProviders.of(this).get(AnimalViewModel::class.java).getData().value
我看到“Null?”。这是真的,data.value
是新的空AnimalWithHints
对象。
奇怪的是我使用ViewModel
只有两行代码。我只保存并获取对象,当我可以清除它或以某种方式修改时,没有地方。
我需要你帮助理解什么是错的。
当你想在Fragments
中的Activity
之间共享数据时,你需要创建ViewModel
的实例,其中包含Activity
的上下文。
下面的语法为您提供仅在ViewModel
级别的Fragment
实例(您可以在Fragment本身与该Frament内部的一些子片段共享它):
ViewModelProviders.of(this@Fragment)[SomeViewModel::class.java] // This will give you view model at fragment level
将Activity
对象传递到ViewModelProvider
内的Fragment
时,在ViewModel
级别给你Activity
。因此,你在同一个Activity
中有多个Fragment意味着Activity的上下文相同,在ViewModel
上给出了相同的Fragments
对象。
因此,要在片段之间共享ViewModel
,请使用以下语法:
ViewModelProviders.of(activity)[SomeViewModel::class.java] // This will provide you shared view model across multiple fragments.