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.