Dagger 2片段通信的范围

时间:2016-11-24 08:11:07

标签: android android-fragments dagger-2

我现有单活动应用程序。我试图让它变得更好一些,因为有最让我感到恶心的情况。让我们想象一下应用程序当前如何工作的例子,只是为了获得更好的图片:

F1 会向我们显示联系人列表

F2 向我们展示了联系方式(按编辑btn)

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

F4 向我们展示了要选择的国家/地区列表(选择器)

所有这些都被替换并添加到backstack中。因此,此流程中的问题是,清除没有可能将结果从 F4 传递到 F3 。或许有,但我没有看到它。以前的开发人员决定允许每个片段在每个屏幕上更新db模型。表示当您选择国家 F4 更新时,仅为 F3 中的版本创建的联系人模型,这是在 F2

上可见的原始模型的重复>

我非常想改变,因为它最让我烦恼。值得庆幸的是,我有Dagger 2,在素描上有或多或少的结构。 enter image description here

@PickerScope 是我想要添加的东西,用于解决我的问题。也许命名不够明确,因为它将用于片段通信,命名总是一个问题:)我想创建 XPickerSubComponent 是将为每个通信创建的组件。其中的模块只允许我保留应该用于通信的数据。您如何看待这种方法有什么更好的想法?对我来说最重要的是,我应该如何管理 @PickerScope 生命周期以及在哪里?我的活动是一个单一的地方。创建将在输入 F3 时被调用,并在 F3 中的保存/取消时销毁。我知道这个问题是纯粹的,我要求创造性的解决方案。但我只需要知道轻量级是否足够强大并且可以找到更好的方法来做它。

2 个答案:

答案 0 :(得分:1)

其他选项是使用匕首为您提供一个物体。假设您有一个对象FormData。您可以在appmodule中初始化它。

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

@Singleton
Public class FormData {

@Inject public FormData() {}

}

然后,在你的片段中注入formdata。

--------

您还可以为表单创建一个范围和一个组件,其中包含片段F1,F2等。这样您就必须为不属于FormScope的所有片段创建另一个范围

答案 1 :(得分:1)

如果您遵循现有的Android设计模式,Dagger 2效果很好。

考虑到这一点,你确定你想要进入一个痛苦的世界让你的碎片相互沟通结果吗? developers' guide说:

  

所有片段到片段的通信都是通过关联的方式完成的   活动。两个碎片永远不应该直接沟通。

你似乎在提倡片段之间进行通信的某种共享对象。这可能违反了开发人员的指导原则。导:

  

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

更容易让仇恨流过你讨厌另一个开发代码,而不是试图理解它。再看看 - 它可能不是那么糟糕。我不确定你的意思是" model"在您的问题中,但是如果所有片段都有自己独特的视图模型,这些视图模型是从onActivityCreated()中的数据库查询(例如,使用Loader)或从{{1}中的活动传入的数据实例化的那么也许那不是那么糟糕。在这种情况下,添加/替换可确保每次碎片变得可见时调用setArguments(Bundle bundle),并且碎片将根据开发人员保持自治状态。指导建议。您始终可以通过注入片段和/或活动之间共享的依赖关系来使用Dagger 2来清理代码。

但是,我怀疑你当前的设置并不是一个非常好的Fragments用例。至少,您的"联系人列表"可能应该在"编辑联系人"的单独活动中。然后,如果需要,可以使用onActivityCreated()将EditContactActivity的结果传递给ContactListActivity。