Как добавить DI (Dagger 2) в Activity и его родителя - PullRequest
0 голосов
/ 04 сентября 2018

Я использую Dagger 2 в своем проекте android и хочу использовать @Inject в Деятельности и внутри другой Деятельности, которая расширяет первую -> MainActivity extends NetworkBaseActivity. В обеих операциях внутри onCreate() методов у меня есть это:

AndroidInjection.inject(this);

Также у меня есть следующая структура:

@Singleton
@Component(modules = {
    AndroidInjectionModule.class,
    AppModule.class,
    ActivityBuilderModule.class,
    WebServiceModule.class})
public interface AppComponent {

    @Component.Builder
    interface Builder {

        @BindsInstance
        Builder application(Application application);

        AppComponent build();
    }

    void inject(App app);

}

@Module
public abstract class ActivityBuilderModule {

    @ContributesAndroidInjector(modules = {NetworkActivityModule.class})
    public abstract NetworkBaseActivity bindNetworkBaseActivity();

    @ContributesAndroidInjector(modules = {MainActivityModule.class})
    public abstract MainActivity bindMainActivity();    
}

@Module
public class NetworkActivityModule {

    @Provides
    public NetworkViewModelFactory 
    provideNetworkViewModelFactory(AuthRepository authRepository) {
    return new NetworkViewModelFactory(authRepository);
    }

    @Provides
    public AuthRepository provideAuthRepository(WebServiceApi webServiceApi, 
    SharedPreferencesManager sharedPreferencesManager) {
        return new AuthRepository(webServiceApi, sharedPreferencesManager);
    }
}

@Module
public class MainActivityModule {

}

И в обратном вызове onCreate() моего класса Application у меня есть это:

DaggerAppComponent
            .builder()
            .application(this)
            .build()
            .inject(this);

Но получите эту ошибку:

error: [Dagger/MissingBinding] [dagger.android.AndroidInjector.inject(T)] 
com.example.android.view.base.NetworkViewModelFactory cannot be provided 
without an @Inject constructor or an @Provides-annotated method.
A binding with matching key exists in component:  
com.example.android.data.di.ActivityBuilderModule_BindNetworkBaseActivity
.NetworkBaseActivitySubcomponent
com.example.android.view.base.NetworkViewModelFactory is injected at
com.example.android.view.base.NetworkBaseActivity.mViewModelFactory
com.example.android.view.main.MainActivity is injected at
dagger.android.AndroidInjector.inject(T)
component path: com.example.android.data.di.AppComponent ?  
com.example.android.data.di.ActivityBuilderModule_BindMainActivity
.MainActivitySubcomponent

Есть предложения? :)

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Вы должны добавить конструктор вашего класса NetworkViewModelFactory. Конструктор должен выглядеть примерно так:

@Inject
public NetworkViewModelFactory(AuthRepository authRepository) { }

Но я не уверен, было бы лучше увидеть код класса NetworkViewModelFactory.

0 голосов
/ 04 сентября 2018

Поскольку MainActivity выходит за пределы NetworkBaseActivity, вам просто необходим AndroidInjector для MainActivity. NetworkBaseActivity затем вводится через MainActivity.

@Module
public class NetworkActivityModule {
    @ContributesAndroidInjector(modules = { NetworkActivityModule.class })
    public abstract MainActivity bindMainActivity();    

}
...