我正在开发一个 android 项目并使用 Dagger2 进行依赖注入(inject)?我正在尝试将 Fragment 注入(inject)到 Activity 中,但我不想创建 fragment 实例,using newInstance 或 new SomeFragment 并希望实例由 dagger 创建并注入(inject)。
我也想知道如果想传递一些参数,我该怎么做。
最佳答案
即使您不想调用new
,Android 也会:这就是为什么Fragment is required to have a zero-arg public constructor ,因为如果你从一个 bundle 中恢复一个 FragmentActivity,Android 将 reflectively call the Fragment constructor .
因此,您创建的大多数 Fragment 不应该声明它们自己的构造函数,当然也不应该有一个带有参数的 @Inject
注释构造函数:只要有零参数公共(public)构造函数,但 Dagger 不会以这种方式参与创建您的 Fragment,如果有两种不相关的方法来创建您的 Fragment,它会降低您阅读和理解代码的能力。
相反,您可以使用 newInstance
创建一个 Fragment 实例,并在 Bundle 中设置参数,然后您可以在 Fragment#onCreate
中读取和扩展它.如果您没有要传递的任何参数,您可以显式调用 new
,但 newInstance
可能是一个很好的一致做法,因此如果 Fragment 接受参数,则无需更改.
要在 Fragment 实例中获取 Dagger 提供的依赖项,标准做法是在 onAttach
,如 dagger.android docs on injecting Fragment .执行此操作的简单方法是 inheriting from DaggerFragment ,但也欢迎您自己这样做。为了找到一个组件来注入(inject)你的 Fragment,AndroidSupportInjection 将递归地检查父层次结构以查找扩展 HasSupportFragmentInjector 的 Fragment,然后将尝试 Activity,然后是 Application;如果您使用带有 ContributesAndroidInjector 的 dagger.android 的标准设计,Dagger 将为您的 Fragment 创建一个子组件实例,允许您引入 Fragment 范围的依赖项。
关于android - 我怎样才能将 fragment 注入(inject)到 Activity 中,这样我就不必手动创建它的实例了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55493834/