Внедрение зависимостей только для базовой активности приводит к сбою дочерней активности - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть BaseActivity, которая расширяется несколькими действиями.У меня есть требование внедрить объект (InputProvider.java) в BaseActivity, но это не требуется в его дочерних действиях.

@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].Вы хотели связать фабрику инжекторов для подтипа?

Журнал ошибок указывает на AndroidInjection.inject(this); в BaseActivity через SplashScreen.

1 Ответ

0 голосов
/ 28 ноября 2018

AndroidInjection ищет правильный компонент для вашей деятельности по типу.Если вы попытаетесь внедрить SplashScreen и он не сможет найти компонент, зарегистрированный для SplashScreen, он выдаст исключение.

Если вы хотите ввести только BaseActivity, но не дочерние элементы, тогда вы можетеНе используйте AndroidInjection для этого.Вам придется создать компонент самостоятельно и таким образом внедрить свою активность.

В качестве альтернативы вы не можете расширять BaseActivity или объявлять компонент для каждой активности и использовать AndroidInjection так, как это предусмотрено.,Если вы внедрите дочернее действие, оно также внедрит поля в родительском.

...