Android 匕首2碎片通信范围

Android 匕首2碎片通信范围,android,android-fragments,dagger-2,Android,Android Fragments,Dagger 2,我有现有的单活动应用程序。我正在努力让它好一点,因为有一个案例让我感到最不舒服。让我们想象一下应用程序当前如何在示例上工作,只是为了更好地了解: F1向我们显示联系人列表 F2显示我们的联系方式(按编辑btn) F3显示联系人的编辑表单(选择更改国家) F4显示要选择的国家/地区列表(选择器) 所有这些都被替换并添加到backback中。因此,该流程中的问题是,不存在将结果从F4传递到F3的可能性。也许有,但我看不到。以前的开发人员决定允许每个片段在每个屏幕上更新db模型。这意味着,当您选择co

我有现有的单活动应用程序。我正在努力让它好一点,因为有一个案例让我感到最不舒服。让我们想象一下应用程序当前如何在示例上工作,只是为了更好地了解:

F1向我们显示联系人列表

F2显示我们的联系方式(按编辑btn)

F3显示联系人的编辑表单(选择更改国家)

F4显示要选择的国家/地区列表(选择器)

所有这些都被替换并添加到backback中。因此,该流程中的问题是,不存在将结果从F4传递到F3的可能性。也许有,但我看不到。以前的开发人员决定允许每个片段在每个屏幕上更新db模型。这意味着,当您选择countryF4时,会更新仅为在F3中编辑而创建的联系人模型,这是在F2上可见的原始模型的副本

我非常想改变,因为它最让我恼火。谢天谢地,我有匕首2,大致结构如草图所示。

@PickerScope是我试图为解决我的问题添加的东西。也许命名不够清晰,因为它将用于片段通信,命名始终是一个问题:)我想创建
XPickerSubComponent是将为每次通信创建的组件。其中的模块只允许我保存用于通信的数据。你对这种方法有什么看法?还有更好的办法吗?对我来说最重要的是,我应该如何管理@PickerScope生命周期以及在哪里?对我来说,活动是唯一可以做到的地方。进入F3时将调用创建,在F3中保存/取消时调用销毁。我明白这个问题是纯粹的,我在寻求创造性的解决方案。但我只需要知道光明的一面是否足够强大,是否能找到更好的方法来实现它。

另一种选择是使用匕首为你们提供一个物体。假设您有一个对象FormData。您可以在appmodule中对其进行初始化

@provides @Singleton FormData provideFormData { return new FormData() }

@Singleton
Public class FormData {

@Inject public FormData() {}

}
然后,在片段中只需注入formdata

--------


您还可以为表单创建一个作用域和一个组件,其中包含片段F1、F2等。如果您遵循现有的Android设计模式,则必须为所有不属于FormScope的片段创建另一个作用域

记住这一点,你确定你想进入一个痛苦的世界,让你的片段彼此交流结果吗?报告说:

所有片段到片段的通信都是通过相关的 活动。两个片段不应该直接通信

您似乎主张在片段之间使用某种共享对象进行通信。这可能会违反《开发人员指南》中的指导原则:

为了重用片段UI组件,您应该将每个组件构建为 完全独立的模块化组件,定义自己的布局 和行为

让仇恨在你憎恨另一个开发人员的代码中蔓延比试图理解它更容易。再看一看——可能没那么糟。我不知道你在问题中所说的“模型”是什么意思,但如果所有片段都有自己独特的视图模型,该模型是从
onActivityCreated()
中的db查询实例化的(例如,使用加载程序)或从
setArguments(Bundle)
中的活动传入的数据实例化的,那么这可能不是那么糟糕。在这种情况下,添加/替换可确保每次片段可见时都会调用
onActivityCreated()
,并且片段将根据开发人员指南的建议保持自治。您始终可以使用Dagger 2通过注入片段和/或活动之间共享的依赖项来清理代码


然而,我怀疑您当前的设置对于片段来说不是一个很好的用例。至少,您的“联系人列表”应该与“编辑联系人”处于单独的活动中。然后,如果有必要,您可以使用onActivityResult()将EditContactActivity的结果传递给ContactListActivity。

您可以发布模型和更新的代码吗?那么这个问题可能会得到更好的答案