AndroidInjector<android.app.Activity> cannot be provided without an @Provides- or @Produces-annotated method

匿名 (未验证) 提交于 2019-12-03 08:51:18

问题:

I'm getting the error while trying to get the new Android dagger classes from Dagger v2.11 working in our project. I'm not exactly sure what the problem is, as I've taken into account the Android documentation over at https://google.github.io/dagger//android.html and still cannot get over this issue. Any ideas on what's wrong with this setup?

MyApplication:

public class MyApplication extends Application implements HasActivityInjector {     @Inject     AndroidInjector<Activity> androidInjector;      @Override     public void onCreate()     {         super.onCreate();         AppInjector.init(this);     }      @Override     public AndroidInjector<Activity> activityInjector()     {         return androidInjector;     } } 

AppComponent:

@Singleton @Component(modules = {         AndroidSupportInjectionModule.class,         AppModule.class,         ActivityModule.class, }) public interface AppComponent {     @Component.Builder     interface Builder     {         @BindsInstance         Builder application(Application application);          AppComponent build();     }      void inject(MyApplication myApplication); } 

ActivityModule:

@Module abstract class ActivityModule {     @ContributesAndroidInjector(modules = FragmentModule.class)     abstract MainActivity contributeMainActivity();      // all other activities defined as above } 

FragmentModule:

@Module abstract class FragmentModule {     @ContributesAndroidInjector     abstract MyFragment contributeMyFragment(); } 

AppInjector:

 public static void init(MyApplication myApplication)     {         DaggerAppComponent.builder().application(myApplication)                           .build().inject(myApplication);         myApplication                 .registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks()                 {                     @Override                     public void onActivityCreated(Activity activity, Bundle savedInstanceState)                     {                         handleActivity(activity);                     }                      @Override                     public void onActivityStarted(Activity activity)                     {                      }                      @Override                     public void onActivityResumed(Activity activity)                     {                      }                      @Override                     public void onActivityPaused(Activity activity)                     {                      }                      @Override                     public void onActivityStopped(Activity activity)                     {                      }                      @Override                     public void onActivitySaveInstanceState(Activity activity, Bundle outState)                     {                      }                      @Override                     public void onActivityDestroyed(Activity activity)                     {                      }                 });     }      private static void handleActivity(Activity activity)     {         if (activity instanceof HasSupportFragmentInjector)         {             AndroidInjection.inject(activity);         }         if (activity instanceof FragmentActivity)         {             ((FragmentActivity) activity).getSupportFragmentManager()                                          .registerFragmentLifecycleCallbacks(                                                  new FragmentManager.FragmentLifecycleCallbacks()                                                  {                                                      @Override                                                      public void onFragmentCreated(FragmentManager fm, Fragment f,                                                                                    Bundle savedInstanceState)                                                      {                                                          if (f instanceof Injectable)                                                          {                                                              AndroidSupportInjection.inject(f);                                                          }                                                      }                                                  }, true);         }     } 

AppModule:

@Module(includes = ViewModelModule.class) class AppModule {     @Singleton     @Provides     UserDao provideUserDao(MyDatabase db)     {         return db.userDao();     }      // all other DAOs } 

ViewModelModule:

@Module abstract class ViewModelModule {     @Binds     @IntoMap     @ViewModelKey(UserViewModel.class)     abstract ViewModel bindUserViewModel(UserViewModel userViewModel); } 

MainActivity:

public class MainActivity extends AppCompatActivity implements HasSupportFragmentInjector {      @Inject     AndroidInjector<Fragment> androidInjector;      @Override     public AndroidInjector<Fragment> supportFragmentInjector()     {         return androidInjector;     } } 

Stack trace:

Error:(29, 10) error: dagger.android.AndroidInjector<android.app.Activity> cannot be provided without an @Provides- or @Produces-annotated method. dagger.android.AndroidInjector<android.app.Activity> is injected at com.myapp.MyApplication.androidInjector com.myapp.MyApplication is injected at com.myapp.dagger.AppComponent.inject(myApplication) 

回答1:

Try to replace AndroidInjector to DispatchingAndroidInjector of your androidInjector variable. That's work for me. Here is mine ( kotlin)

class PodcastApp : Application(), HasActivityInjector {  @Inject lateinit var dispatchingAndroidInjector : DispatchingAndroidInjector<Activity>   companion object {     lateinit var instance: PodcastApp }   override fun onCreate() {     super.onCreate()      instance = this     FirebaseApp.initializeApp(this)      if (BuildConfig.DEBUG) {         Timber.plant(Timber.DebugTree())         Stetho.initializeWithDefaults(this)          AppInjector.init(this)     } }  override fun activityInjector(): AndroidInjector<Activity> {     return dispatchingAndroidInjector } 

}



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!