Dagger 2-提供应用程序类

Rob*_*egg 1 java android dagger-2

我试图用来Dagger 2注入我的应用程序类,MyApplication因为我在各种地方都使用它。这是我使用的设置Dagger 2.11

MyApplication.java

public class MyApplication extends Application  implements HasActivityInjector {

  @Inject
  DispatchingAndroidInjector<Activity> dispatchingAndroidInjector;

  @Override
  public void onCreate() {
    super.onCreate();
    AppInjector.init(this);
  }

  @Override
  public DispatchingAndroidInjector<Activity> activityInjector() {
    return dispatchingAndroidInjector;
  }
}
Run Code Online (Sandbox Code Playgroud)

AppInjector.java

public class AppInjector {

  public static void init(MyApplication application){

    //Initialize dagger and inject the application
    DaggerAppComponent.builder().application(application).build().inject(application);

    application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
      @Override
      public void onActivityCreated(Activity activity, Bundle aBundle) {
        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 aBundle) {

      }

      @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) {
                            Log.i("LifecycleCallbacks", "injected:" + f);

                            AndroidSupportInjection.inject(f);
                          }
                        }
                      }, true);
    }
  }
Run Code Online (Sandbox Code Playgroud)

AppComponent.java

@Singleton
@Component(modules = {
        AndroidInjectionModule.class,
        ActivityBuilder.class,
        AppModule.class
})

public interface AppComponent {
  @Component.Builder
  interface Builder {
    @BindsInstance Builder application(Application application);
    AppComponent build();
  }

  void inject(MyApplication application);
}
Run Code Online (Sandbox Code Playgroud)

但是,每次我尝试@Inject MyApplication application在构造函数中使用dagger时,都会抛出一个错误,即如果没有@Provides,它就无法提供它

更进一步,我不确定是否应该在所有地方都使用该应用程序,而不仅仅是它的Context?如果是这样,我将如何提供Context

Dav*_*jak 5

看看您的Builder ...

@Component.Builder
interface Builder {
--> @BindsInstance Builder application(Application application);
    AppComponent build();
}
Run Code Online (Sandbox Code Playgroud)

Dagger所知道的只是您的信息Application,您从未提及MyApplication,因此注入它会失败。


我不知道您为什么要MyApplication专门注入,但是最简单的解决方案是将其更改为绑定您的绑定MyApplication...

@Component.Builder
interface Builder {
    @BindsInstance Builder application(/** --> */ MyApplication application);
    AppComponent build();
}
Run Code Online (Sandbox Code Playgroud)

然后匕首知道MyApplication却不知道Application。为了解决这个问题,您可以添加一个绑定其他类型的模块,这很容易,因为您拥有子类型...例如

@Module interface AppModule { // could also be an abstract class
  @Binds Application bindApplication(MyApplication application);

  // if you also want to bind context
  @Binds Context bindContext(MyApplication application);
}
Run Code Online (Sandbox Code Playgroud)

并将此模块添加到您的组件中。