android - 每次返回 fragment 时都会调用livedata观察器

标签 android kotlin android-livedata

我有fragment1,从中我进入fragment2。
问题是我无法从fragment2回到fragment1
这就是我处理按钮点击的方式

val onClickLiveData = MutableLiveData<OnClick>()

fun onClick() {
    onClickLiveData.value = OnClick.CLICK
}
这就是我处理过渡到fragment2的方式
   private fun subscribeToClickCallbacks() {
    viewModel.onClickLiveData.observe(viewLifecycleOwner, Observer {
            findNavController().navigate(R.id.action_home_fragment_to_repositories_fragment)
    })
}
我这样处理过渡
 navController.popBackStack()
在调试的帮助下,我发现每次转换到fragment1时,都会调用livedata并立即打开fragment2。
该如何解决?我会很感激每个答案。

最佳答案

如果实时数据是观察者多次,请使用 SingleEvent 处理这种情况。
像这样为SingleLiveData创建一个全局类。

class SingleLiveEvent<T> : MutableLiveData<T>() {

    private val mPending = AtomicBoolean(false)

    @MainThread
    override fun observe(owner: LifecycleOwner, observer: Observer<T>) {

        if (hasActiveObservers()) {
            Log.w(TAG, "Multiple observers registered but only one will be notified of changes.")
        }

        // Observe the internal MutableLiveData
        super.observe(owner, object : Observer<T> {
            override fun onChanged(t: T?) {
                if (mPending.compareAndSet(true, false)) {
                    observer.onChanged(t)
                }
            }
        })
    }

    @MainThread
    override fun setValue(t: T?) {
        mPending.set(true)
        super.setValue(t)
    }

    /**
     * Used for cases where T is Void, to make calls cleaner.
     */
    @MainThread
    fun call() {
        setValue(null)
    }

    companion object {

        private val TAG = "SingleLiveEvent"
    }
}
现在像这样使用此类
val onClickLiveData = SingleLiveEvent<OnClick>()

关于android - 每次返回 fragment 时都会调用livedata观察器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63501331/

相关文章:

android - SCREEN_BRIGHTNESS_MODE 不适用于许可

共享首选项的 Android 空指针异常

java - 方法...必须覆盖父类(super class)方法(最新 SDK)

android - 临时禁用 WorkManager 的 Workers

android - 从autocompletetextview onItemClickListener项目获取Firestore文档ID

android - 即使观察者 Activity 被破坏,MutableLiveData 也会保留旧值

android - 修改从 Room 获取的 LiveData 项目

java - 这个语法在 Kotlin 中意味着什么?

Android:需要手动更新注释处理器以添加对 androidx 错误的支持

android - 刷新 fragment 回到上一个 fragment