7

Ich habe versucht, die Aktivität in einer Klasse ViewUtils, erfolglos zu injizieren. Ich habe ein paar verschiedene Posts verfolgt, aber ich verstehe nicht, was ich in meiner Implementierung vermisse.Dolch 2.10/2.11 Injektion Aktivität fehlgeschlagen

Ich weiß, das ist wahrscheinlich eine Wiederholung der Posts unten und ich entschuldige mich wirklich dafür, aber ich kann ehrlich nicht sehen, was ich vermisse. Dies sind die Beiträge, die ich gefunden habe:

Meine Implementierung ist wie folgt:

AppComponent

@Component(modules = { 
     AppModule.class, AndroidSupportInjectionModule.class, ActivityBindingModule.class 
}) @Singleton public interface AppComponent extends AndroidInjector<EmblyApp> { 

    @Component.Builder abstract class Builder extends AndroidInjector.Builder<EmblyApp> {} 
} 

ActivityBindingModule

@Module public abstract class ActivityBindingModule { 

    @ContributesAndroidInjector 
    abstract LoginActivity loginActivity(); 
} 

LoginSubcomponent

@Subcomponent(modules = LoginSubcomponent.LoginActivityModule.class) 
public interface LoginSubcomponent extends AndroidInjector<LoginActivity> { 

    @Subcomponent.Builder abstract class Builder extends AndroidInjector.Builder<LoginActivity> {} 

    @Module abstract class LoginActivityModule { 

     @Binds abstract Activity bindActivity(LoginActivity activity); 

     @Provides @ActivityScope static ViewUtils viewUtils(Activity activity) { 
      return new ViewUtils(activity); 
     } 
    } 
} 

ViewUtils

public class ViewUtils { 

    private final Activity activity; 

    @Inject public ViewUtils(Activity activity) { 
     this.activity = activity; 
    } 
} 

Und der Fehler ich erhalte ist:

Error:(14, 22) error: [dagger.android.AndroidInjector.inject(T)] android.app.Activity cannot be provided without an @Inject constructor or from an @Provides-annotated method. 
android.app.Activity is injected at 
com.emblyapp.app.ui.helpers.ViewUtils.<init>(activity) 
com.emblyapp.app.ui.helpers.ViewUtils is injected at 
com.emblyapp.app.ui.authentication.login.LoginActivity.viewUtils 
com.emblyapp.app.ui.authentication.login.LoginActivity is injected at 
dagger.android.AndroidInjector.inject(arg0) 

Was ist hier falsch? Danke für die Hilfe!

Edit: Ich habe mein LoginActivity hat die Injektion mit dem AndroidInjection

@Override protected void onCreate(Bundle savedInstanceState) { 
     AndroidInjection.inject(this); 
     super.onCreate(savedInstanceState); 
    } 

Antwort

9

wie angegeben in dagger android documentation zu erwähnen:

Pro-Tipp: Wenn Ihr Subkomponente und seine builder Wenn Sie keine anderen Methoden oder Supertypen als die in Schritt 2 erwähnten verwenden, können Sie sie mit @ContributesAndroidInjector erzeugen Sie. Fügen Sie statt der Schritte 2 und 3 eine abstrakte Modulmethode hinzu, die Ihre Aktivität zurückgibt, versehen Sie sie mit @ContributesAndroidInjector, und geben Sie die Module an, die Sie in die Unterkomponente installieren möchten. Wenn die Unterkomponente Bereiche benötigt, wenden Sie die Bereichsanmerkungen ebenfalls auf die Methode an.

So können wir loswerden LoginSubcomponent erhalten und folgende Änderungen in ActivityBindingModule ausführen:

 


    @Module 
    public abstract class ActivityBindingModule { 

     @ActivityScope 
     @ContributesAndroidInjector(modules = LoginActivityModule.class) 
     abstract LoginActivity loginActivity(); 
    } 

 

LoginActivityModule. java

 


    @Module 
    abstract class LoginActivityModule { 

     @Binds 
     abstract Activity bindActivity(LoginActivity activity); 

     @Provides 
     @ActivityScope 
     static ViewUtils viewUtils(Activity activity) { 
      return new ViewUtils(activity); 
     } 
    } 

 

Ihre individuelle Anwendungsklasse:

 


    public class MyApp extends DaggerApplication { 

     @Inject 
     DispatchingAndroidInjector dispatchingActivityInjector; 

     @Override 
     protected AndroidInjector applicationInjector() { 
      return DaggerAppComponent.builder().create(this); 
     } 

    } 

 
+1

Ja! Vielen Dank. Ich verstand nicht gut, was dieser Teil der Dokumentation sagte, was zu meiner Verwirrung führte. Ich verstehe es jetzt. Der ContributesAndroidInjector erlaubt mir, die Subkomponente (die von ihr erzeugt wird) zu überspringen. Ich verstehe das! Danke für die Hilfe, es funktioniert jetzt :) – Peddro

Verwandte Themen