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

问题描述 投票:1回答:1

我正在尝试使用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只有两行代码。我只保存并获取对象,当我可以清除它或以某种方式修改时,没有地方。

我需要你帮助理解什么是错的。

android kotlin viewmodel
1个回答
1
投票

当你想在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.
© www.soinside.com 2019 - 2024. All rights reserved.