Dagger2报错:无Fragment注入器工厂绑定,@ContributesAndroidInjector异常
Alright, let's tackle this frustrating error you're hitting when injecting Fragments with Dagger-Android. I've debugged this exact issue dozens of times, so let's walk through the most common fixes step by step:
Common Causes & Solutions
Ensure your Fragment extends
DaggerFragment(AndroidX) orDaggerSupportFragment
Dagger needs a hook into your Fragment's lifecycle to handle injection, and these base classes implementHasSupportFragmentInjectorout of the box. If you're using a custom Fragment class, you'll have to manually implement that interface and delegate to the injector—but using the Dagger-provided base class is way simpler and less error-prone.Verify your
@ContributesAndroidInjectorchain is complete
This is the #1 mistake people make. Let's break it down:- In your
MainActivityModule, add a@ContributesAndroidInjectormethod for every Fragment tied to MainActivity:@Module public abstract class MainActivityModule { // Add one of these for each Fragment in MainActivity @ContributesAndroidInjector abstract HomeFragment contributeHomeFragmentInjector(); // If your Fragment has its own dependencies, include its module here @ContributesAndroidInjector(modules = SettingsFragmentModule.class) abstract SettingsFragment contributeSettingsFragmentInjector(); } - Link this
MainActivityModuleto your MainActivity's injector inActivityBindingModule:@Module public abstract class ActivityBindingModule { // Your working Splash/Login injectors @ContributesAndroidInjector abstract SplashActivity contributeSplashActivityInjector(); @ContributesAndroidInjector abstract LoginActivity contributeLoginActivityInjector(); // Critical: Tie MainActivity to its module that includes Fragment injectors @ContributesAndroidInjector(modules = MainActivityModule.class) abstract MainActivity contributeMainActivityInjector(); }
If you skip linking the
MainActivityModulehere, Dagger has no idea how to create injectors for your Fragments.- In your
Double-check your ApplicationComponent includes the right modules
For AndroidX Fragments, you must includeAndroidSupportInjectionModule(not justAndroidInjectionModule) in your component's module list. Here's what it should look like:@Singleton @Component(modules = { AndroidInjectionModule.class, AndroidSupportInjectionModule.class, // Required for AndroidX Fragments ActivityBindingModule.class, // Add other global modules here }) public interface ApplicationComponent extends AndroidInjector<YourApp> { @Component.Factory interface Factory extends AndroidInjector.Factory<YourApp> {} }Without
AndroidSupportInjectionModule, Dagger can't register injectors for support/androidx Fragments.Make sure MainActivity extends
DaggerAppCompatActivity
Just like the Fragment side, Dagger needs the Activity to implementHasSupportFragmentInjectorto pass the injector down to child Fragments.DaggerAppCompatActivityhandles this for you—don't overridesupportFragmentInjector()unless you know exactly what you're doing, as that can break the Dagger chain.Clean and rebuild your project
Dagger's annotation processor sometimes leaves stale generated files hanging around. Run./gradlew clean build(or use Android Studio's Build > Clean Project → Rebuild Project) to wipe old generated code and force Dagger to regenerate injectors from scratch.Avoid manual injection calls in Fragments
If you're callingAndroidInjection.inject(this)manually in your Fragment's lifecycle, stop—DaggerFragmentalready does this for you inonAttach(). Duplicate injection calls can cause weird edge cases or fail if the injector isn't ready yet.
Quick Correct Configuration Recap
Let me sum up the working chain to make sure you have all pieces connected:
YourApp→ UsesDaggerApplicationor implementsHasAndroidInjectorApplicationComponent→ IncludesAndroidSupportInjectionModule+ActivityBindingModuleActivityBindingModule→ LinksMainActivitytoMainActivityModuleMainActivityModule→ Provides@ContributesAndroidInjectorfor each FragmentMainActivity→ ExtendsDaggerAppCompatActivity- Your Fragments → Extend
DaggerFragment
内容的提问来源于stack exchange,提问作者C. Marr

