我正在尝试使用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
}
}
因此,我已填充非空对象 (已检查),然后我在交易之前写信:
ViewModelProviders.of(this).get(AnimalViewModel::class.java).setData(animalWithHints)
发生这种情况时,我会看到“已保存?” ,所以我认为保存工作良好。我记录了AnimalWithHints
的某个字段,发现它是正确的。
然后我尝试获取对象:
val animalWithHints = ViewModelProviders.of(this).get(AnimalViewModel::class.java).getData().value
然后我看到“为空?” 。没错,data.value
是新的空AnimalWithHints
对象。
奇怪的是,我只有两行代码,使用ViewModel
。我只保存并获取对象,没有地方可以清除或修改对象。
我需要您的帮助来了解问题所在。
答案 0 :(得分:1)
当您想在Fragments
中的同一Activity
之间共享数据时,您需要创建ViewModel
的实例,并具有Activity
的上下文。
以下语法为您提供了ViewModel
实例,仅在Fragment
级别(您可以在Fragment自身上与该Frament中的一些子片段共享该实例):< / p>
ViewModelProviders.of(this@Fragment)[SomeViewModel::class.java] // This will give you view model at fragment level
将Activity
对象传递到ViewModelProvider
内部的Fragment
时,会在ViewModel
级别给您Activity
。因此,您在同一个Activity
中有多个片段,这意味着活动的上下文是相同的,从而在两个ViewModel
处都具有相同的Fragments
对象。
因此,要在片段之间共享ViewModel
,请使用以下语法:
ViewModelProviders.of(activity)[SomeViewModel::class.java] // This will provide you shared view model across multiple fragments.