7

Próbowałem, bez powodzenia, wstrzykiwać aktywność w ViewUtils klasy. Obserwowałem kilka różnych stanowisk, ale nie mogę zrozumieć, czego brakuje mi w mojej implementacji.Sztylet 2.10/2.11 Niepowodzenie działania wtrysku

Wiem, że to prawdopodobnie powtórzenie postów poniżej i naprawdę przepraszam za to, ale szczerze mówiąc nie widzę tego, czego mi brakuje. Są to słupy znalazłem:

Moje wdrożenia jest w następujący sposób:

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

a błąd Dostaję brzmi:

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) 

Co jest nie tak? Dzięki za pomoc!

Edit: Zapomniałem wspomnieć mój LoginActivity ma zastrzyk z AndroidInjection

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

Odpowiedz

9

jak określono w dagger android documentation:

Pro-Tip: Jeśli podkomponent i jego budowniczy nie mają innych metod lub supertypów niż te wymienione w kroku 2, można użyć @ContributesAndroidInjector, aby wygenerować je dla ty. Zamiast kroków 2 i 3, dodaj metodę modułu abstrakcyjnego, która zwraca twoją aktywność, dodaj ją za pomocą @ContributesAndroidInjector i określ moduły, które chcesz zainstalować w podskładniku. Jeśli podskładnik wymaga zakresów, zastosuj także adnotacje zakresu do metody.

W ten sposób możemy pozbyć LoginSubcomponent i wykonaj następujące zmiany w ActivityBindingModule:

 


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

 

Niestandardowa klasa aplikacja:

 


    public class MyApp extends DaggerApplication { 

     @Inject 
     DispatchingAndroidInjector dispatchingActivityInjector; 

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

    } 

 
+1

Tak! Dziękuję Ci. Nie zrozumiałem dobrze, co mówi ta część dokumentacji, która doprowadziła mnie do zamieszania. Teraz rozumiem. ContributesAndroidInjector pozwala mi pomijać podskładnik (który jest przez niego tworzony). Rozumiem! Dzięki za pomoc, teraz działa :) – Peddro