简体   繁体   English

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

[英]ViewModel return clear object when i try to get data from it

I'm trying to use ViewModel , for saving data to share between Fragments .我正在尝试使用ViewModel来保存数据以在Fragments之间共享。 That is it:这就对了:

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
    }
}

So I've filled non-null object (checked it) and I write before transaction:所以我已经填充了非空对象(检查它)并在交易前写:

ViewModelProviders.of(this).get(AnimalViewModel::class.java).setData(animalWithHints)

I see "Saved?"我看到“已保存?” when it happens, so I think save working good.当它发生时,所以我认为保存工作很好。 I logged some field of AnimalWithHints , and I saw it was correct.我记录了AnimalWithHints一些字段,我看到它是正确的。

Then I try to get my object:然后我尝试获取我的对象:

val animalWithHints = ViewModelProviders.of(this).get(AnimalViewModel::class.java).getData().value

And I see "Null?"我看到“空?” . . And it's true, data.value is rly new empty AnimalWithHints object.这是真的, data.value是一个新的空AnimalWithHints对象。

Strange thing is I have only two lines of code, using ViewModel .奇怪的是我只有两行代码,使用ViewModel I only save and get object, there is no place when I can clear it or modify somehow.我只保存和获取对象,没有地方可以清除或以某种方式修改。

I need you help to understand what's wrong.我需要你帮助了解出了什么问题。

When you want to share data between your Fragments that are in same Activity , you'll need to create instance of ViewModel with context to Activity .当您想在同一个Activity Fragments之间共享数据时,您需要创建ViewModel实例,并带有Activity上下文。

Below syntax provides you instance of ViewModel that is at Fragment level only (You can share it at Fragment itself with some child fragments inside of that Frament) :以下语法为您提供了仅处于Fragment级别的ViewModel实例(您可以在 Fragment 本身与该 Frament 内的一些子片段共享它)

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

While passing Activity object to your ViewModelProvider inside your Fragment gives you ViewModel at Activity level.虽然传递Activity对象添加到您ViewModelProvider您的内部Fragment让你ViewModelActivity水平。 Hence You're having multiple Fragments inside same Activity meaning context of Activity is same gives your same ViewModel object at both Fragments .因此,您在同一个Activity有多个 Fragment ,这意味着Activity上下文是相同的,在两个Fragments上都给出了相同的ViewModel对象。

So for sharing ViewModel between fragments, use below syntax :因此,要在片段之间共享ViewModel ,请使用以下语法:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 当我尝试从 ViewModel 更改 ModalBottomSheetState 时,此 CoroutineContext 中没有 MonotonicFrameClock - A MonotonicFrameClock is not available in this CoroutineContext when I try to change ModalBottomSheetState from ViewModel 当我尝试从文件读取损坏的对象时获取StreamCorruptedException - Get StreamCorruptedException when I try to read cripted object from a file 尝试从服务器获取数据时出现改造错误 - Retrofit Error when I try to get the data from the server 当我尝试从数据库中获取所有数据时,应用程序冻结 - App freezes when I try to get all data from database 为什么我返回活动时ViewModel不提供数据? - Why ViewModel is not providing data when I return to activity? 当我尝试获取SQLite数据时出现StringIndexOutOfBoundsException - StringIndexOutOfBoundsException when I try to get SQLite data 当我尝试从Facebook获取用户个人资料数据时,为什么会得到无效的令牌“我”? - Why do i get invalid token “me”,when i try to get user profile data from facebook? 我无法从列表中提取对象? 当我尝试将其存储到另一个对象时,我得到一个空值 - i am unable to extract an object from a list? i get a null value when i try to store it another object 尝试从首选项数据存储中读取数据时返回 null - Return null when try to read data from preferences datastore 为什么当我从 Firebase 获取数据时它返回 NULL? - Why When i get the data From Firebase it return NULL?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM