【问题标题】:Fragment livedata observer called only once with default value片段 livedata 观察者只用默认值调用一次
【发布时间】:2019-06-26 03:09:43
【问题描述】:

我只是无法弄清楚这段代码有什么问题,以及为什么在更新值时没有调用观察者。我正在使用带有 livedata 的 Fragment,这是完整的代码。当应用程序启动片段时,它从默认数据中获取值,在这种情况下为 100。但是在使用 queueChannelId(channelId) 方法更新该值之后,不会调用观察者。我放了一条打印语句,我可以看到方法在主线程中执行。请帮忙

片段:

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    viewModel = 
ViewModelProviders.of(this).get(SomeViewModel::class.java)

    viewModel.getChannelId().observe(this, Observer {
        // Only called with default value of mutablelivedata

    })
}

我可以保证在任何时候都没有调用 onDestroyView 和 onDestroy。

视图模型:

fun getChannelId() : MutableLiveData<Int> {
    return repository.getChannelId()
    }

存储库:

var channelIdObservable = MutableLiveData(100)

fun queueChannelId(channelId: Int) {
    channelIdObservable.value = channelId
}
fun getChannelId() : MutableLiveData<Int> = channelIdObservable

【问题讨论】:

  • 修复这一行:var channelIdObservable = MutableLiveData(100) 与这一行:var channelIdObservable = MutableLiveData&lt;Int&gt;()
  • @DHAVALASODARIYA 这不是问题。
  • 如果你是从其他线程调用queueChannelId 试试channelIdObservable.postValue (channelId) 无论如何试试这个。我在这里看不到任何其他问题。
  • 我的盲目猜测是,您要么重新分配channelIdObservable,要么在不同的存储库实例上调用queueChannelId
  • @SanlokLee 你说得对,经过一些调试,我发现存储库实例不同。我以为我的实例是单例的,但显然它是为每个视图模型创建的。所以我想这就是错误。感谢您的帮助。

标签: android viewmodel android-architecture-components android-livedata


【解决方案1】:

如果您是从其他线程调用queueChannelId,请尝试

channelIdObservable.postValue (channelId)

P.S:我在这里看不到任何其他问题。分享你的代码,告诉你你如何打电话给queueChannelId

【讨论】:

  • 感谢 Anmol,我发现了问题并更新了上面的评论部分。问题是我有不同的存储库对象实例。我想我必须将 repo 对象设为单例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-22
  • 2020-04-02
  • 1970-01-01
相关资源
最近更新 更多