gpt4 book ai didi

android - Dagger 2 - 如何只注入(inject)基本 Activity/fragment

转载 作者:太空宇宙 更新时间:2023-11-03 13:52:28 25 4
gpt4 key购买 nike

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

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

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

我很高兴听到任何解决方案,因为我真的很想使用 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!
}
}

最佳答案

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

你可以将 analytics 移到 super 上,然后它将被注入(inject)那里。要在您的子类中注入(inject)带注释的字段,您将不得不在那里再次调用注入(inject)。

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

如官方所述documentation :

While a members-injection method for a type will accept instances of its subtypes, only Inject-annotated members of the parameter type and its supertypes will be injected; members of subtypes will not.

关于android - Dagger 2 - 如何只注入(inject)基本 Activity/fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33529373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com