首页 > 解决方案 > 如何将片段注入活动,以便我不必手动创建它的实例?

问题描述

我正在开发一个 android 项目并使用 Dagger2 进行依赖注入?我正在尝试将 Fragment 注入 Activity 但我不想创建片段实例,使用 newInstancenew SomeFragment并希望实例由 dagger 创建并注入。

我也想知道如果想传递一些论点,我该怎么做。

标签: androidandroid-fragmentsdagger-2dagger

解决方案


即使您不想调用new,Android 也会:这就是为什么Fragment 需要具有零参数的公共构造函数的原因,因为如果您从包中恢复 FragmentActivity,Android 将反射性地调用 Fragment 构造函数

因此,您创建的大多数 Fragment 不应该声明它们自己的构造函数,当然也不应该有一个@Inject带参数的带注释的构造函数:只要有一个零参数的公共构造函数,Android 就不会抱怨,但 Dagger 不会参与以这种方式创建您的 Fragment,如果有两种不相关的方法来创建您的 Fragment,它将降低您阅读和理解代码的能力。

相反,您可以使用newInstance在 Bundle 中设置参数来创建 Fragment 实例,然后您可以在Fragment#onCreate. 如果您没有要传递的任何参数,则可以new显式调用,但这newInstance可能是一种良好的一致做法,因此如果 Fragment 接受参数,则更改较少。

要在 Fragment 实例中获取 Dagger 提供的依赖项,标准做法是 [调用AndroidInjection.inject(this)AndroidSupportInjection.inject(this)in onAttach,如dagger.android 文档中关于注入 Fragment的内容。实现这一点的简单方法是从 DaggerFragment 继承,但也欢迎您自己这样做。为了找到一个组件来注入你的 Fragment,AndroidSupportInjection 将递归地检查父层次结构中扩展 HasSupportFragmentInjector 的 Fragment,然后尝试 Activity,然后是 Application;如果您将 dagger.android 的标准设计与 ContributesAndroidInjector 一起使用,Dagger 将为您的 Fragment 创建一个子组件实例,允许您引入 Fragment 范围的依赖项。


推荐阅读