【问题标题】:How to pass Events/Data between Nested Navigation Controllers Fragments如何在嵌套导航控制器片段之间传递事件/数据
【发布时间】:2018-08-29 21:43:43
【问题描述】:

我正在计划这样的视图层次结构:

基本上主 Fragment 将能够触发 Bottom Sheet Navigation Controller 内的导航,Bottom Sheet Fragment 也将能够触发 Bottom Sheet Navigation Controller 内的导航并将事件/数据发送到 Main Fragment。

例如,假设 Main Fragment 有一个项目网格,而 Bottom Sheet Fragment 显示最后单击的项目详细信息。用户可能会单击底部工作表片段中详细信息内的按钮,比如说“立即订购”按钮,现在必须将这个事件执行到主片段。请不要拘泥于这个特定的用例,这只是我为了说明需要而做的一个例子。

我的问题是如何克服 Android Jetpack 中导航控制器提供的分离?有很多关于如何使用常见的Activity 等来管理共享同一屏幕的Fragments 之间的通信的文档,但是现在有新的导航控制器带来了新的抽象解耦Fragment 处理所以我我不太确定如何进行。

我考虑过可能使用Singleton 来传递事件/数据,可能在其中使用LiveData,但我认为可能有一些更优雅的解决方案。

【问题讨论】:

    标签: android android-fragments android-architecture-components android-architecture-navigation


    【解决方案1】:

    使用 LiveData 和 ViewModel 的解决方案是一个非常好的解决方案,MainFragment 和 BottomSheetFragment 将附加到同一个 ViewModel 实例。 MainFragment 将观察 ViewModel 中的一些 LiveData 对象,当用户单击 Bottom Sheet Fragment 中的详细信息内的按钮时,ViewModel 中的 LiveData 对象将被更改并通知 MainFragment。

    【讨论】:

    • 这就是 Viewmodel 文档中提出的解决方案,我一开始就考虑使用它,我的问题是我相信这个“​​全局”Viewmodel”将是一个非常复杂的类。因为Bottom Sheet 里面有一个 Navigator,Bottom Sheet 里面会有几个 Fragment,被替换,所有这些都会使用同一个 ViewModel。所以这个 ViewModel 会有 Main Fragment 的逻辑,所有的 Fragment 都由底页。它必须有某种排序状态机或条件才能了解它在底页导航中的位置....
    • ..... 恐怕它会变得过于凌乱和庞大,难以阅读、维护和测试。
    • 简而言之:使用文档中提供的 1 个 ViewModel 的 Master-Detail (2 Fragments) 解决方案很好,但在我的情况下,我可以在底部工作表中有大约 6 个导航目标(片段)+ Main Fragment,总共有 7 个 Fragment 供这个 Main ViewModel 管理,恐怕对于一个 ViewModel 来说太多了,你不觉得吗?
    • 您可以为不同的用例使用多个 Viewmodel 类,其中一些可以是“全局的”,这样就不是一个大类而是多个小类。
    • 是的,我只是想有时让内部 ViewModel 与另一个 ViewModel 交换信息,而不必在其中一个或另一个之间做出选择
    猜你喜欢
    • 2020-04-19
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 2020-05-18
    • 2014-05-24
    相关资源
    最近更新 更多