每次返回片段时都会调用livedata观察器

时间:2020-08-20 08:37:04

标签: 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。

如何解决问题?我会很感激每个答案。

1 个答案:

答案 0 :(得分:1)

如果实时数据是观察者多次,请使用 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>()