仅针对基本活动的依赖项注入会使子活动崩溃

时间:2018-11-27 22:23:10

标签: android dependency-injection dagger-2

我有一个由多个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);

1 个答案:

答案 0 :(得分:1)

AndroidInjection按类型查找适合您的活动的组件。如果您尝试注入SplashScreen,但找不到为SplashScreen注册的组件,则它将引发异常。

如果您只想注入BaseActivity而不是孩子,则不能使用AndroidInjection。您将必须自行创建组件,然后以这种方式注入您的Activity。

或者,您不能扩展BaseActivity,也不能为每一个 Activity声明一个组件,并按预期使用AndroidInjection。如果您注入子活动,它还将在父项中注入字段。