【问题标题】:livedata observe event triggered at each fragment onStart在每个片段 onStart 触发的 livedata 观察事件
【发布时间】:2020-09-30 12:56:19
【问题描述】:

我在使用 LiveData 时遇到问题。

我有 3 个片段 A (menuFragment)、B (doThingsFragment)、C (displayMessageFragment)。 我们可以从 A 移动到 B,从 B 移动到 C,最后从 C 移动到 A。

在 doThingsFragment 的 onStart 方法上,我观察来自 doThingsViewModel 的 LiveData,并在此值更改时移动到 displayMessageFragment。

doThingsViewModel :

private var _message : MutableLiveData<String> = MutableLiveData()
var message : LiveData<String> = _message 

fun someFunction() {
    _message.value = "blablabla"
}

doThingsFragment:

override fun onStart() {
    super.onStart()

    mViewModel!!.message.observe(
        viewLifecycleOwner,
        Observer<String>
        {
            msg ->
            if(!msg.isNullOrEmpty() && mViewModel!!.toastType.value != null){
                val args = Bundle()
                args.putString("message", msg)

                Navigation.findNavController(requireView()).navigate(R.id.mountUnmountValidationFragment, args)
            }
        })
}

我第一次更新 _message 时效果很好(我们按预期从 B 转到 C)。 但是,当我再次尝试从 A 移动到 B 时,我们再次进入 doThingsFragment 观察者回调,并且在片段 B 甚至显示之前,我继续移动到片段 C。

由于 _message 值没有改变,我希望每次调用 doThingFragment.onStart 方法时都不会触发观察者回调...

我错过了什么?

非常感谢!

【问题讨论】:

    标签: android kotlin fragment android-livedata mutablelivedata


    【解决方案1】:

    这就是 livedata 的行为方式,如果您只需要一次接收者事件,google 或 stackoverflow 关于SingleLiveData

    【讨论】:

      【解决方案2】:

      LiveData 在观察者模式下工作,其中某事物注册为观察者,并且每次它所观察的事物发生变化时,它都会收到通知。值得reading the docs on this

      在给定所有者的生命周期内将给定的观察者添加到观察者列表中。事件在主线程上调度。 如果 LiveData 已经有数据集,则将其交付给观察者

      当所有者 [LifecycleOwner,例如Activity] 未激活,它不会收到任何更新。如果它再次激活,它将自动接收最后的可用数据

      这些是重点 - 当您注册到 observe 数据时,您会立即收到最新值(如果有)的通知,不仅仅是在发生变化时 .所以你不能依赖回调触发作为你需要从B移动到C的信号。

      您实际需要做什么取决于您的应用逻辑,如何区分“刚刚显示的片段 B,这里是一个值,现在我需要显示片段 C”和“刚刚显示的片段 B,这里是值,但我碰巧知道这次我不需要显示片段 C”。您可以在第一次收到一些数据时设置initialised 标志(可能需要在onSaveInstanceState 中保持该状态)或保持最后一次看到的值(更难保持),但你明白了

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多