Android Dagger跨模块注入Fragment遇MissingBinding错误求解决方案
问题分析
你使用@ContributesAndroidInjector只是告诉Dagger如何为DotsFragment生成注入器,但Dagger不会直接提供DotsFragment的实例对象给其他类注入。直接在HomeFragment中通过@Inject声明DotsFragment实例,Dagger找不到对应的实例提供者,因此抛出缺少绑定的错误。
解决方案一:规范的Fragment加载与注入(推荐)
1. 给DotsFragment添加自动注入逻辑
在DotsFragment的onAttach方法中触发Dagger注入:
class DotsFragment : Fragment() { // 这里可以声明需要注入的成员变量 // @Inject lateinit var someDependency: SomeDependency override fun onAttach(context: Context) { AndroidInjection.inject(this) super.onAttach(context) } // 你的业务代码 }
2. 在HomeFragment中通过FragmentManager加载DotsFragment
不需要直接注入DotsFragment实例,而是在视图创建完成后,将其添加到FragmentContainerView中:
class HomeFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 避免重复创建Fragment实例 if (childFragmentManager.findFragmentById(R.id.dots_container) == null) { val dotsFragment = DotsFragment() childFragmentManager.beginTransaction() .replace(R.id.dots_container, dotsFragment) .commit() } } }
此时Dagger会通过@ContributesAndroidInjector生成的注入器,在DotsFragment的onAttach阶段自动完成成员注入。
解决方案二:通过@Provides直接提供实例(不推荐)
如果一定要在HomeFragment中直接注入DotsFragment实例,可以修改DotsModule,添加@Provides方法手动提供实例并完成注入:
@Module class DotsModule { // 改为普通类,不再是抽象类 @FragmentScoped @Provides fun provideDotsFragment(context: Context): DotsFragment { val fragment = DotsFragment() // 手动触发注入 AndroidInjection.inject(fragment, context) return fragment } }
之后在HomeFragment中保持@Inject lateinit var dotsFragment: DotsFragment的声明,将注入得到的实例添加到FragmentContainerView即可。
注意:这种方式需要严格匹配作用域,且手动注入可能引发生命周期不匹配的问题,因此更推荐第一种方案。
内容的提问来源于stack exchange,提问作者Bruse
相关产品推荐
相关产品推荐

