我正在开发一个android项目,并使用Dagger2进行依赖注入?我试图将Fragment注入Activity,但我不想创建片段实例,使用新实例 或 new SomeFragment 并希望由匕首创建实例并注入。
如果要传递一些参数,我也想知道该怎么做。
答案 0 :(得分:1)
即使您不想呼叫new
,Android也会:Fragment is required to have a zero-arg public constructor的原因,因为如果从捆绑包中恢复FragmentActivity,Android将会reflectively call the Fragment constructor。
因此,您创建的大多数Fragment都不应声明自己的构造函数,并且当然也不应具有带有参数的带有@Inject
注释的构造函数:只要存在零参数公共,Android就不会抱怨。构造函数,但Dagger不会以这种方式参与创建Fragment,并且如果有两种不相关的方式来创建Fragment,则会降低您阅读和理解代码的能力。
相反,您可以使用newInstance
创建一个在Bundle中设置参数的Fragment实例,然后可以在Fragment#onCreate
中读取和扩展该实例。如果没有要传递的参数,则可以显式调用new
,但是newInstance
可能是一个很好的一致做法,因此,即使Fragment接受参数,更改的内容也很少。
要在Fragment实例中获得Dagger提供的依赖关系,标准做法是像在dagger.android docs on injecting Fragment中一样,在{{1}中调用AndroidInjection.inject(this)
或AndroidSupportInjection.inject(this)
。最简单的方法是使用inheriting from DaggerFragment,但也欢迎您自己这样做。为了找到一个注入片段的组件,AndroidSupportInjection将递归地检查父层次结构中扩展了HasSupportFragmentInjector的Fragment,然后尝试Activity和Application。如果您将dagger.android的标准设计与ContributesAndroidInjector一起使用,则Dagger将为您的Fragment创建一个子组件实例,从而允许您引入Fragment范围的依赖项。