当我尝试从中获取数据时,ViewModel返回清除对象

时间:2019-04-13 17:07:27

标签: android kotlin viewmodel

我正在尝试使用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。我只保存并获取对象,没有地方可以清除或修改对象。

我需要您的帮助来了解问题所在。

1 个答案:

答案 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.