2017-09-21 30 views
0

我試圖用Dagger 2來注入我的應用程序類MyApplication,因爲我在各個地方使用它。這是使用Dagger 2.11Dagger 2 - 提供應用程序類

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; 
    } 
} 

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); 
    } 
    } 

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); 
} 
我的設置

然而,每次我嘗試在構造函數中使用@Inject MyApplication application時間,匕首拋出一個錯誤,它沒有辦法提供它沒有@Provides

Furthure多,我不知道我應該到處使用應用程序,而只有它的Context?如果是這樣,我將如何提供Context

+0

嘗試觀看https://github.com/iammert/dagger-android-injection/tree/master – eurosecom

回答

2

有一個在你的構建程序...

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

所有匕首知道是你Application,你從來沒有提MyApplication,因此注入將失敗。


我不知道爲什麼你必須明確注入MyApplication,但最簡單的解決辦法是將它更改爲綁定你MyApplication,而不是...

@Component.Builder 
interface Builder { 
    @BindsInstance Builder application(/** --> */ MyApplication application); 
    AppComponent build(); 
} 

然後匕首知道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); 
} 

而只是將此模塊添加到您的組件。

+0

@Tander,我認爲這應該被標記爲正確的答案。 – azizbekian