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

Android/Kotlin设计模式,用于从导航栏发送到片段,再发送到任意片段?,android,kotlin,android-fragments,android-activity,android-viewmodel,Android,Kotlin,Android Fragments,Android Activity,Android Viewmodel,我的导航栏有几个按钮,当用户启动应用程序时,他们会看到一个选项卡式视图。每个选项卡显示具有不同数据和列的相同初始屏幕表,导航栏中的按钮用于创建新记录和搜索 +-------------+ |MainViewModel| +-------------+ +------------+ |MainActivity|

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

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

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


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

+-------------+                      +-------------+
|AlphaFragment|                      |BettaFragment|
+-------------+                      +-------------+
开始处理一个模式,当用户单击+navbar按钮时打开该模式,我已经在这个新类CreateAnythingFragment:BottomSheetDialogFragment中进行了黑客攻击,在这种情况下,它知道名称和action+。因此,我可以使用模式匹配,并找出如何将数据发送回片段、取消模式并刷新表

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


这里推荐的方法是什么?

事实上,我认为这就是我想要的

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

将X添加到数据X的操作应该被抽象掉

如果我正确理解了您的问题,您可以在导航栏中添加一个公共方法,但是您需要知道哪个片段是可见的,才能知道要添加到哪个表中的数据类型,该表稍后将显示在正确的片段中

我觉得这是ViewModel的问题,然后是存储库的问题。你知道哪个片段是可见的,所以你真的不需要太担心它;每个片段的最终责任应该是通过其viewModel向公共存储库发送添加项的信号,在该存储库中,新数据以流、liveData或类似形式公开

每个片段还读取aka:观察此数据流,因此如果片段启动/可见/订阅,它将侦听此公共repo

因此,在我看来,解决方案由每个视图模型组成,每个视图模型都有一个用例/交互器/行为名称,就像你想要的那样,知道插入什么/如何插入

每个片段都观察其viewModel以获取新数据

每个ViewModel与您拥有的每个用例插入数据的内容存储库进行对话

所有活动及其viewModel必须做的就是将信息传递给现有片段嘿,你必须插入你的类型的数据,然后片段将知道与它的viewModel对话的人,viewModel将知道要做什么将它插入到事物存储库中


我认为你试图通过Fragment->Activity->Fragment或甚至Fragment Fragment走捷径来对抗Android框架,而事实上,我认为LiveData/LifeCycle感知的信息流更适合你。

我听到了,但是在这种情况下,我可能会为我正在创建的每种类型创建一个不同的创建模式片段。目标是将其抽象出来,以便在一个地方处理所有公共代码,而专门的片段所做的就是定义自定义XML并加载/存储/搜索由表单数据[和远程数据]构建的列表。虽然其中的大部分也应该被抽象出来。也许他们应该只指定模式,其余的可以在更高的级别上处理?是的,我的意思是,你总是可以进一步委托,让公共代码来处理它。但是架构并不意味着没有抽象。每个片段/视图模型都知道自己的域,或者被告知您是否想进一步抽象它,最终,接口/契约定义了它们之间的通信方式,因此没有任何东西可以阻止您的VM调用代理/存储库等来执行工作并返回值。您说。。。在这种情况下,我可能只是为我正在处理的每种类型创建一个不同的创建模式片段,但至少根据您的图像Alpha/Beta,您已经有了不同的片段。我以为你有不同的。在任何情况下,您的片段都可以是相同的,它只是一个容器,用于显示一个片段列表。我想我们在这里谈论的不是同一个问题。您所需要的只是知道哪个T对应于它的泛型类型。我遗漏了什么吗?从CRUD的角度来看,所有3个选项卡都有一个:列表屏幕、新记录屏幕。每个都指不同的实体。导航栏中的+为与当前活动选项卡[fragment]关联的特定实体启动新记录屏幕[modal]。我有很多想法,过去我也做过类似的事情,但我工作很忙。如果我花的时间太长,似乎我已经忘记了,请告诉我这个问题,我们可以讨论我们双方的想法: