2017-07-27 4 views
2

Je suis nouveau à Dagger 2. J'ai déjà essayé de mettre en place le même. Voici mon ActivityModule:Dague 2: Le module doit être réglé

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

    @ContributesAndroidInjector 
    abstract ProductDetailsActivity contributeProductDetailsActivity(); 
} 

Mon AppModule:

@Module 
class AppModule { 

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

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

Mon application:

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

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

}

Il jette une exception inject:

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) 

Quelqu'un peut-il me aider à avoir une idée où en fait le problème dans ma configuration?

+0

Est-ce 'AppModule' ont un constructeur? – azizbekian

+0

Aucun constructeur @azizbekian –

+0

Le constructeur est-il rqd? pour AppModule? @azizbekian –

Répondre

0

Toute la structure de votre Di semble un peu étrange. Une raison particulière pour utiliser toutes ces complications (en ayant en tête que vous dites que vous êtes nouveau à Dagger et que tous les tutoriels n'ont rien de proche de votre implémentation)?

+2

J'essaie d'implémenter Google nouveaux composants d'architecture en utilisant Dagger 2. Je suis effectivement suivi GithubBrowserSample donné par GoogleSamples –

1

Vous devez ajouter @ContributesAndroidInjector à vos méthodes abstraites dans le ActivityModule

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

    @ContributesAndroidInjector 
    abstract ProductDetailsActivity contributeProductDetailsActivity(); 
} 
+0

Je me demande pourquoi op [supprime toujours] (https://stackoverflow.com/questions/45326775/dagger-illegalargumentexception- no-injector-factory-bound-for-class/45327464 # 45327464) que l'annotation – azizbekian

+0

Lol, vous avez raison: D i + +1 votre réponse car était déjà correcte – MatPag

+0

J'ai oublié de mentionner en question. C'était déjà là dans Studio. –

1

Je crois AppModule doit être réglé dans l'interface Builder de AppComponent et devraient être fournis lors de la création 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:

intérieur init méthode:

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