android - 如何使用 Dagger Android 创建自定义范围并共享相同的实例
问题描述
所以这是我从文档中知道的事情
- 引擎盖下的 Dagger Android 正在为每个带有注释的 Activity 创建子组件
ContributesAndroidInjector
- 您可以将自定义范围应用于
ContributesAndroidInjector
注释到的方法 - 如果两个同级子组件具有相同的作用域,它们仍将具有不同的作用域实例
- 如果 Activity 在子组件中,它可以有自己的子组件,其中可以包含 Fragments。这些 Fragments 将共享 Activity 具有的作用域实例。
现在我的问题是:如何使用 Dagger Android 让一个 Activity 成为另一个 Activity 的子组件?
我想这样做是因为我想实现@UserScope/@SessionScope 之类的东西。
由此我知道我可以只用 Dagger 而不是 Dagger Android 来做到这一点。但是使用Dagger Android,你只能让Application(也就是AndroidInjector)来注入Activity。您不能将 Activity 用作父子组件的持有者或宿主来注入另一个 Activity。
我理解正确吗?
2018 年 5 月 14 日更新:
我最终摆脱了 Dagger Android。所以没有更多ContributesAndroidInjector
,只是纯粹的匕首。为了注入 Activity/Fragment,我使用这里推荐的方式。它会是这样的:
class MyActivity : AppCompatActivity() {
private val factory: ViewModelProvider.Factory = Injector.myCustomScope().factory()
}
我们正在努力确保工厂是 Activity/Fragment 唯一需要的东西。
到目前为止,一切都很好。
解决方案
如何使用 Dagger Android 让一个 Activity 成为另一个 Activity 的子组件?
tl;博士你不能。Dagger Android 遵循严格的AppComponent > ActivityComponent > FragmentComponent
方案,无法在两者之间添加自定义范围。
建议你看一下 Dagger Android 源码,真的没那么多。对于您在其中查找组件构建器并构建子组件的每一层,它基本上都是一个 HashMap。一个片段查看其父 Activity,一个 Activity 查看应用程序。没有可以在图层之间添加自定义组件的功能。
您可以做的是创建自己的“Dagger Android”变体,您可以在其中实现自己的接口并根据需要混合/匹配组件。但这是相当多的额外工作。如果您有兴趣了解如何做这样的事情,我创建了一个@PerScreen
可以在配置更改后继续存在的范围作为概念证明。
推荐阅读
- reactjs - React、Redux、NextJS 奇怪的状态竞争覆盖
- python - 如何使用 setuptools 安装可写共享和用户特定数据文件?
- firebase - 如果收到 Firebase 安全规则信函,我该怎么办?
- python - 在 Pandas DataFrame 上应用函数
- android - 使用弹出消息覆盖后退按钮
- r - R中的外部联盟
- cmake - 我想知道如何使用 cmake 查找依赖项来编译最可爱的测试
- asp.net-core - 如何添加所有 Razor 页面都可以访问的功能?
- java - Java 类是用调试符号编译的,但堆栈跟踪中没有显示行号?
- angular - 如何使角度 mgl-timeline-entry 的开始扩展