ViewModel return 当我尝试从中获取数据时清除对象
ViewModel return clear object when i try to get data from it
我正在尝试使用 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)
我看到 "Saved?" 当它发生时,所以我认为保存工作很好。我记录了 AnimalWithHints
的一些字段,我看到它是正确的。
然后我尝试获取我的对象:
val animalWithHints = ViewModelProviders.of(this).get(AnimalViewModel::class.java).getData().value
我看到了 "Null?"。没错,data.value
是一个新的空 AnimalWithHints
对象。
奇怪的是我只有两行代码,使用ViewModel
。我只保存和获取对象,没有地方可以清除它或以某种方式修改它。
我需要你帮助了解问题所在。
当您想要在同一个 Activity
中的 Fragments
之间共享数据时,您需要创建 ViewModel
的实例,并将上下文设为 Activity
。
下面的语法为您提供了 ViewModel
的实例,它仅处于 Fragment
级别 (您可以在 Fragment 本身与该 Frament 内的一些子片段共享它):
ViewModelProviders.of(this@Fragment)[SomeViewModel::class.java] // This will give you view model at fragment level
将 Activity
对象传递给 Fragment
中的 ViewModelProvider
时,您会在 Activity
级别获得 ViewModel
。因此,您在同一个 Activity
中有多个片段,这意味着 Activity 的 上下文相同,在两个 Fragments
处都提供了相同的 ViewModel
对象.
因此,要在片段之间共享 ViewModel
,请使用以下语法:
ViewModelProviders.of(activity)[SomeViewModel::class.java] // This will provide you shared view model across multiple fragments.
我正在尝试使用 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)
我看到 "Saved?" 当它发生时,所以我认为保存工作很好。我记录了 AnimalWithHints
的一些字段,我看到它是正确的。
然后我尝试获取我的对象:
val animalWithHints = ViewModelProviders.of(this).get(AnimalViewModel::class.java).getData().value
我看到了 "Null?"。没错,data.value
是一个新的空 AnimalWithHints
对象。
奇怪的是我只有两行代码,使用ViewModel
。我只保存和获取对象,没有地方可以清除它或以某种方式修改它。
我需要你帮助了解问题所在。
当您想要在同一个 Activity
中的 Fragments
之间共享数据时,您需要创建 ViewModel
的实例,并将上下文设为 Activity
。
下面的语法为您提供了 ViewModel
的实例,它仅处于 Fragment
级别 (您可以在 Fragment 本身与该 Frament 内的一些子片段共享它):
ViewModelProviders.of(this@Fragment)[SomeViewModel::class.java] // This will give you view model at fragment level
将 Activity
对象传递给 Fragment
中的 ViewModelProvider
时,您会在 Activity
级别获得 ViewModel
。因此,您在同一个 Activity
中有多个片段,这意味着 Activity 的 上下文相同,在两个 Fragments
处都提供了相同的 ViewModel
对象.
因此,要在片段之间共享 ViewModel
,请使用以下语法:
ViewModelProviders.of(activity)[SomeViewModel::class.java] // This will provide you shared view model across multiple fragments.