用于从导航栏发送到片段到任意片段的 Android/Kotlin 设计模式?

时间:2021-01-30 10:42:34

标签: android kotlin android-fragments android-activity android-viewmodel

我的导航栏有几个按钮,当用户启动应用程序时,他们会看到一个选项卡式视图。每个选项卡显示相同的初始屏幕(具有不同数据和列的表),导航栏中的按钮用于创建新记录和搜索。

                  +-------------+
                  |MainViewModel|
                  +-------------+

                  +------------+
                  |MainActivity|
                  +------------+


+--------------+                     +--------------+
|AlphaViewModel|                     |BettaViewModel|
+--------------+                     +--------------+

+-------------+                      +-------------+
|AlphaFragment|                      |BettaFragment|
+-------------+                      +-------------+

开始研究当用户点击 + 导航栏按钮时打开的模式,我已经在 Bundle 周围进行了黑客攻击,所以现在在这个新的 class CreateAnythingFragment: BottomSheetDialogFragment() 中它知道 {{3 }} 名称和 action(在这种情况下为 +)。因此,我可以使用 Fragment 对此进行模式匹配,并弄清楚如何将数据发送回片段、关闭模式并刷新表格。

但我觉得这种模式匹配不应该出现在 CreateAnythingFragment 中,因为这只会将它与已知片段耦合。那么我是否应该拥有某种所有片段都订阅的全局/根事件流,然后在 CreateAnythingFragment 中发送到该流? - 这似乎非常低效。我应该使用 when 吗?

这里推荐的方法是什么?

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:-1)

我觉得如果您将关注点进一步分开一点,整个问题会得到更好的解决。

您的“操作”(将 X 添加到“数据 X”)应该被抽象化。

如果我正确理解了您的问题,那么您有一个“通用”方法(在您的“NavBar”中)可以“添加”,但是您需要知道哪个片段是可见的,才能知道将哪种类型的数据添加到哪个表中稍后显示在正确的片段中。

我觉得这是一个 ViewModel 的问题,然后是一个 Repository 问题。你知道哪个片段是可见的,所以你真的不需要太担心它;每个片段的最终责任应该是将“添加项目”(通过其视图模型)发送到公共存储库中,在该存储库中新数据以 100100 或类似的形式公开。

每个 Fragment 还“读取”(又名:观察)此数据流,因此如果该 Fragment 启动/可见/订阅,它将侦听此公共存储库。

所以对我来说,在我的脑海中,解决方案包括每个 viewModel 都有一个“用例/交互器/行为”(根据你的需要命名),它知道要插入什么/如何插入。

每个片段观察其视图模型以获取新数据。

每个 ViewModel 都与您拥有的“事物存储库”对话(每个用例都在其中插入数据)。

所有 Activity(以及它的 viewModel)必须做的,就是将信息传递给现有的片段“嘿,你必须插入你类型的数据”,然后片段就会知道与谁交谈(它的 viewModel)它将知道要做什么(将其插入到事物存储库中)。

我认为您正试图通过 Fragment -> Activity -> Fragment 或什至“Fragment <-> Fragment”采取“快捷方式”来反对 Android 框架,而实际上,LiveData/LifeCycle 感知信息流会在我看来更适合。