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:
- Dagger 2.10 Android subcomponents and builders
- How to create custom scoped modules in dagger 2.10
- https://google.github.io/dagger/subcomponents.html
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);
}
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