我有一个由多个Activity扩展的BaseActivity。我需要在BaseActivity中注入一个对象(InputProvider.java),但在其子活动中并不需要它。
@Subcomponent
public interface BaseActivityInjector extends AndroidInjector<BaseActivity> {
@Subcomponent.Builder
abstract class Builder extends AndroidInjector.Builder<BaseActivity> {}
}
@Module(
includes = {
AppModule.class,
AndroidSupportInjectionModule.class,
InitializerModule.class},
subcomponents = {
BaseActivityInjector.class
})
public abstract class AppInjectionModule {
@Binds
@IntoMap
@ActivityKey(BaseActivity.class)
abstract AndroidInjector.Factory<? extends Activity> bindBaseActivityInjectorFactory(BaseActivityInjector.Builder builder);
}
@Module
public class InitializerModule {
@Provides
public InputProvider getInputProvider() {
return new InputProviderImpl();
}
}
public abstract class BaseActivity extends FragmentActivity {
@Inject
InputProvider inputProvider;
protected void onCreate(Bundle savedInstanceState) {
AndroidInjection.inject(this);
}
}
一旦我运行我的应用程序,它就会在第一个屏幕(启动屏幕)上崩溃,这也扩展了BaseActivity,并显示以下消息:
无法开始活动 ComponentInfo {com.app.mobile.android.dev/com.app.mobile.android.SplashScreen}: java.lang.IllegalArgumentException:没有注入器工厂绑定到 类。喷油器厂 绑定com.delta.mobile.android.SplashScreen的超类型: [com.app.mobile.android.uikit.view.BaseActivity]。你是说要 为该子类型绑定注射器工厂?
错误日志通过SplashScreen指向BaseActivity中的AndroidInjection.inject(this);
。
答案 0 :(得分:1)
AndroidInjection
按类型查找适合您的活动的组件。如果您尝试注入SplashScreen
,但找不到为SplashScreen
注册的组件,则它将引发异常。
如果您只想注入BaseActivity
而不是孩子,则不能使用AndroidInjection
。您将必须自行创建组件,然后以这种方式注入您的Activity。
或者,您不能扩展BaseActivity,也不能为每一个 Activity声明一个组件,并按预期使用AndroidInjection。如果您注入子活动,它还将在父项中注入字段。