Dagger 2 - 如何仅注入基础活动/片段

use*_*412 4 android dependency-injection dagger-2

我正在研究来自许多来源的 Dagger 2,例如:http : //ferndocejas.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!
    }
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*jak 5

你可以注射注射超在子类属性(因为在编译时dagger2作品,有没有办法动态检查子类注释属性。)

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

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

如官方文档所述

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