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

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

  •  1
  • LoveForDroid  · 技术社区  · 7 年前

    我有一个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。

    1 回复  |  直到 7 年前
        1
  •  1
  •   David Medenjak    7 年前

    AndroidInjection 按类型查找活动的正确组件。如果你想注射 SplashScreen 它找不到注册的组件 溅屏 然后它会抛出一个异常。

    如果你只想注射 BaseActivity 但不是你不能使用的孩子 雄激素注射 为了这个。您必须自己创建组件,并以这种方式注入活动。

    或者,您不能扩展BaseActivity,也不能为其声明组件 每一个 活动并按预期使用雄激素注射。如果注入子活动,它也会注入父活动中的字段。

    推荐文章