2017-07-27 83 views
2

我是Dagger 2的新手。我已經嘗試設置相同。這裏是我的ActivityModuleDagger 2:模塊必須設置

@Module 
public abstract class ActivityModule { 
    @ContributesAndroidInjector 
    abstract ProductListActivity contributeProductListActivity(); 

    @ContributesAndroidInjector 
    abstract ProductDetailsActivity contributeProductDetailsActivity(); 
} 

的AppModule

@Module 
class AppModule { 

@Provides 
    @Singleton 
    RedMartProductService provideRedMartProductService() { 
     ........ 
    } 
    ........ 
    ....... 
} 

AppComponent

@Singleton 
@Component(modules = {AndroidInjectionModule.class, ActivityModule.class, AppModule.class}) 
public interface AppComponent { 
    @Component.Builder 
    interface Builder { 
     @BindsInstance 
     Builder application(Application application); 

     AppComponent build(); 
    } 

    void inject(MartApplication martApp); 
} 

應用

public class MartApplication 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

public class AppInjector { 
private AppInjector() { 
} 

public static void init(MartApplication application) { 
    DaggerAppComponent.builder().application(application) 
      .build().inject(application); 
    application 
      .registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() { 
       @Override 
       public void onActivityCreated(Activity activity, Bundle savedInstanceState) { 
        handleActivity(activity); 
       } 

       ............ 
      }); 
} 

private static void handleActivity(Activity activity) { 
    if (activity instanceof Injectable) { //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); 
    } 
} 

}

它是注射拋出異常:

java.lang.RuntimeException: Unable to create application com.kaushik.myredmart.MartApplication: java.lang.IllegalStateException: com.kaushik.myredmart.di.AppModule        must be set at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4710) 
               at android.app.ActivityThread.-wrap1(ActivityThread.java) 
               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405) 
               at android.os.Handler.dispatchMessage(Handler.java:102) 
               at android.os.Looper.loop(Looper.java:148) 
               at android.app.ActivityThread.main(ActivityThread.java:5417) 
               at java.lang.reflect.Method.invoke(Native Method) 
               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
               Caused by: java.lang.IllegalStateException: com.mymart.di.AppModule must be set 
               at com.kaushik.myredmart.di.DaggerAppComponent$Builder.build(DaggerAppComponent.java:180) 
               at com.kaushik.myredmart.di.AppInjector.init(AppInjector.java:30) 
               at com.kaushik.myredmart.MartApplication.onCreate(MartApplication.java:28) 
               at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1013) 
               at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4707) 
               at android.app.ActivityThread.-wrap1(ActivityThread.java)  
               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405)  
               at android.os.Handler.dispatchMessage(Handler.java:102)  
               at android.os.Looper.loop(Looper.java:148)  
               at android.app.ActivityThread.main(ActivityThread.java:5417)  
               at java.lang.reflect.Method.invoke(Native Method) 

誰能幫我拿個主意,其中實際問題在我的設置?

+0

是否'AppModule'有一個構造函數? – azizbekian

+0

沒有構造函數@azizbekian –

+0

構造函數是rqd。爲AppModule? @azizbekian –

回答

0

你的Di的整個結構看起來有點奇怪。使用所有這些複雜因素的任何特殊原因(考慮到你說你是Dagger的新手,並且它的所有教程沒有任何與你的實現相近的東西)?

+2

我正在嘗試使用Dagger 2實現Google新的架構組件。我實際上是遵循GoogleSamples給出的GithubBrowserSample –

1

您需要添加@ContributesAndroidInjector到您的抽象方法在ActivityModule

@Module 
public abstract class ActivityModule { 
    @ContributesAndroidInjector 
    abstract ProductListActivity contributeProductListActivity(); 

    @ContributesAndroidInjector 
    abstract ProductDetailsActivity contributeProductDetailsActivity(); 
} 
+0

我想知道爲什麼op [always removed](https://stackoverflow.com/questions/45326775/dagger-illegalargumentexception- no-injector-factory-bound-for-class/45327464#45327464)那註釋 – azizbekian

+0

大聲笑,你是對的:D我+1了你的答案,因爲已經是正確 – MatPag

+0

我忘了提及的問題。它已經在Studio中。 –

1

相信AppModule必須在AppComponent的構建器界面來設置,並在創建AppComponent應當提供。

AppComponent:

@Singleton 
@Component(modules = {AndroidInjectionModule.class, ActivityModule.class, AppModule.class}) 
public interface AppComponent { 
    @Component.Builder 
    interface Builder { 
     @BindsInstance 
     Builder application(Application application); 

     Builder appModule(AppModule appModule); // add this 

     AppComponent build(); 
    } 

    void inject(MartApplication martApp); 
} 

AppInjector:

init方法:

DaggerAppComponent.builder() 
.application(application) 
.appModule(new AppModule()) // add this 
.build() 
.inject(application);