代码之家  ›  专栏  ›  技术社区  ›  MrVasilev

如何在活动及其父级中添加DI(匕首2)

  •  0
  • MrVasilev  · 技术社区  · 7 年前

    我在我的Android项目中使用了匕首2,我想使用 @Inject 在一个活动中以及在扩展第一个活动的另一个活动中-> MainActivity 延伸 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 {
    
    }
    

    而且在 创建()) 我的应用程序类的回调有:

    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 回复  |  直到 7 年前
        1
  •  1
  •   Chris    7 年前

    由于MainActivity从NetworkBaseActivity扩展而来,您只需要为MainActivity提供一个AndroidInjector。然后,NetworkBaseActivity将通过MainActivity注入。

    @Module
    public class NetworkActivityModule {
        @ContributesAndroidInjector(modules = { NetworkActivityModule.class })
        public abstract MainActivity bindMainActivity();    
    
    }
    
        2
  •  0
  •   LaVepe    7 年前

    您必须注入 NetworkViewModelFactory 类。构造函数应该如下所示:

    @Inject
    public NetworkViewModelFactory(AuthRepository authRepository) { }
    

    但我不确定,最好看看 网络视图模型工厂 类代码也是。