我有一个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}: JAVAlang.IllegalArgumentException:无喷油器出厂限制 班喷油器工厂 绑定到com的超类型。希腊字母表的第4个字母可移动的安卓飞溅屏幕: [com.app.mobile.android.uikit.view.BaseActivity]。你是故意的吗 绑定子类型的注射器工厂?
错误日志指向 AndroidInjection.inject(this); 通过SplashScreen进入BaseActivity。
AndroidInjection.inject(this);
AndroidInjection 按类型查找活动的正确组件。如果你想注射 SplashScreen 它找不到注册的组件 溅屏 然后它会抛出一个异常。
AndroidInjection
SplashScreen
溅屏
如果你只想注射 BaseActivity 但不是你不能使用的孩子 雄激素注射 为了这个。您必须自己创建组件,并以这种方式注入活动。
BaseActivity
雄激素注射
或者,您不能扩展BaseActivity,也不能为其声明组件 每一个 活动并按预期使用雄激素注射。如果注入子活动,它也会注入父活动中的字段。