【问题标题】:Dagger 2 - how to inject only to base activity/fragmentDagger 2 - 如何仅注入基础活动/片段
【发布时间】:2015-11-27 01:06:52
【问题描述】:

我正在研究来自许多来源的 Dagger 2,例如:http://fernandocejas.com/2015/04/11/tasting-dagger-2-on-android/ 但我仍然没有找到我的问题的答案。

我在非常复杂的应用程序中工作,其中包含数十个片段和几个活动,我想在其中使用 DI(匕首 2)。对于所有这些片段和活动,我有一个 BaseActivity 和一个 BaseFragment。但是,据我阅读和尝试,为了在我的 MainActivity 中使用 @Inject,我必须在 Component 接口中指定它,并在 onCreate 方法中调用 getApplicationComponent().inject(this)。当我仅对 BaseActivity 执行此操作时,MainActivity 中的 @Inject 注释字段永远不会被注入。更糟糕的是,直到执行代码的特定部分并抛出 NPE,我才知道这一点。

到目前为止,这对我来说是一个交易破坏者,因为这可能是许多崩溃的根源。我需要在 Component 接口中指定数十个片段和活动,并且不要忘记在每个 onCreate 方法中调用注入。

我很高兴听到任何解决方案,因为我真的很想使用 DI..

代码示例:

@Singleton
@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {
    void inject(BaseActivity baseActivity);
    Analytics analytics();
}

public class BaseActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.getApplicationComponent().inject(this);
    }
}

public class MainActivity extends BaseActivity {
    @Inject
    Analytics analytics;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        analytics.log("event1"); // THROWS NPE!
    }
}

【问题讨论】:

  • 可能analytics 为空

标签: android dependency-injection dagger-2


【解决方案1】:

您可以不通过注入 super 来在子类中注入属性(因为 dagger2 在编译时工作,并且无法动态检查子类的注释属性。)

您可以将analytics 移动到super,然后它将被注入那里。要在子类中注入带注释的字段,您必须再次调用那里的注入。

你可以在你的基类中创建一个抽象方法,例如inject(App app)你刚刚处理注射的地方。这样你就不会“错过”它。

如官方documentation所说:

虽然类型的成员注入方法将接受其子类型的实例,但只会注入参数类型及其超类型的注解成员;子类型的成员不会。

【讨论】:

  • 好吧,我还必须将它放到 ApplicationComponent 接口中,这是必须始终做的两件事。对我来说似乎很痛苦:(
  • 是的。但至少它是可测试的;)
  • 如果你不介意一些痛苦,一切都是可以测试的:)
【解决方案2】:

移动

@注入 分析分析;

对于您的 BaseActivity 类,Analytics 对象在超类中初始化并由子类自动继承,因此您不会再获得 null。

 public class MainActivity extends BaseActivity {
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         analytics.log("event1");
     } }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多