首页 > 解决方案 > EventBus postSticky() 的 Android/Kotlin 替代品

问题描述

我正在寻找postSticky()方法替换。它被用于简单地将值传递给前一个片段,但事情是我使用 BackStackUtil 进行导航,因此instance()只有在返回之前以某种方式清除堆栈时才调用方法。

前一个 Fragment 持有List项目,当下一个 Fragment 可以修改拾取的项目而另一个 Fragment 可以做其他事情时,当每个 Fragment 都被传递给前一个 Fragment 时,它是一个粘性事件链。
应用程序结构不允许我在当前阶段应用 Coordinator 模式,而且我不想将 Bundle 附加到堆栈上的 Fragments。

我一直在寻找解决方案,但找不到任何解决方案。我也不想将值存储在某些静态字段或 SharedPreferences/Data 存储中。
我正在考虑共享 ViewModel,但老实说我不太喜欢这个想法,所以如果共享 VM 是唯一/最好的方式,我将不胜感激任何想法或只是确认。

你还有其他建议吗?

标签: androidkotlineventsgreenrobot-eventbus

解决方案


在您的 A 片段中,在导航到 B 片段之前,请收听 savedStateHandle:

 findNavController()
      .currentBackStackEntry
      ?.savedStateHandle?.getLiveData<Bundle>("DATA_KEY")
      ?.observe(viewLifecycleOwner) { result ->
        // Result from fragment B
    }

在您的 B 片段中,在返回之前,将数据设置为传递给 A 片段:

findNavController()
    .previousBackStackEntry
    ?.savedStateHandle
    ?.set("DATA_KEY", result)

您可以使用以下方法删除观察者:

findNavController()
      .currentBackStackEntry
      ?.savedStateHandle?.remove<Bundle>

请注意,此处传递的类型是Bundle(getLiveData<Bundle> 中的类型),但您可以使用任何您想要的类型。


推荐阅读