【问题标题】:ViewModel return clear object when i try to get data from it当我尝试从中获取数据时,ViewModel 返回清除对象
【发布时间】:2019-04-14 01:38:29
【问题描述】:

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

我需要你帮助了解问题所在。

【问题讨论】:

  • 当您想在同一活动上的片段之间传递数据时,您需要通过将 getActivity() 作为 Activity 上下文而不是 this 传递给它来创建 ViewModel 实例 作为Fragment 上下文..
  • 是的,它有效。杰出的。你可以组成它来回答。

标签: android kotlin viewmodel


【解决方案1】:

当您想在同一 Activity 中的 Fragments 之间共享数据时,您需要创建带有 Activity 上下文的 ViewModel 实例。

以下语法为您提供了 ViewModel 的实例,该实例仅在 Fragment 级别(您可以在 Fragment 本身与该 Frament 内的一些子 Fragment 共享它)

ViewModelProviders.of(this@Fragment)[SomeViewModel::class.java] // This will give you view model at fragment level

在将Activity 对象传递给ViewModelProvider 时,您的Fragment 中会在Activity 级别为您提供ViewModel。因此,您在同一个 Activity 内有多个片段,这意味着 Activity 的上下文 是相同的,在两个 Fragments 上都有相同的 ViewModel 对象。

所以要在片段之间共享ViewModel,请使用以下语法:

ViewModelProviders.of(activity)[SomeViewModel::class.java] // This will provide you shared view model across multiple fragments.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多