2017-09-21 5 views
0

私はMyApplication私はさまざまな場所で使用するように私のアプリケーションクラスを注入するためにDagger 2を使用しようとしています。これはDagger 2.11ダガー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をどのように提供するのですか?

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

すべてのダガーについてのごApplicationであることを知っている

+0

https://github.com/iammert/dagger-android-injection/tree/master – eurosecom

答えて

2

は...あなたのビルダーを見てください、あなたはそれ故に、それは失敗します注入し、MyApplicationを言及することはありませんしています。


あなたは、具体的MyApplicationを注入する必要があるだろう、なぜ私は知らないが、最も簡単な解決策は...代わりに

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

をごMyApplicationをバインドするためにそれを変更することですその後、ダガーを約知っています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

を見てみてください。@タンダー、これは正解とマークする必要があります。 – azizbekian

関連する問題