android - Dagger 模块包含周期

标签 android dagger

我对 Dagger 还是个新手,正在努力掌握一些东西。我想将我的模块分成逻辑组,每个组都提供自己的功能,但基本上就像在一个模块中一样。

例如,假设我的主要应用程序模块定义如下:

//com.example.android.MyAppModule.java
@Module(
   includes = AnalyticsModule.class,
   injects = { <snip> }
)
public class MyAppModule {
   // various provides
}

我还有另一个这样定义的模块,它设置了一个 ErrorReporter 接口(interface)并为其提供了具体的实现。

// com.example.android.analytics.AnalyticsModule.java
@Module(
   addsTo = MyAppModule.class,
   injects = { MyApp.class }
)
public class AnalyticsModule(){

    // ErrorReporter is a public interface and ErrorReporterImpl is a package-local final concrete class that implements it
    @Provides @Singleton
    ErrorReporter providesErrorReporter(ErrorReporterImpl reporter) { return reporter };
}

在我的应用程序类中,我像这样设置对象图:

// com.example.android.MyApp.java
public class MyApp extends Application {
    @Inject ErrorReporter errorReporter;

    @Override
    public void onCreate() {
        super.onCreate();
        applicationGraph = ObjectGraph
            .create(new MyAppModule())
            .plus(new AnalyticsModule());
        applicationGraph.inject(this);
        errorReporter.initialize();
    }
}

当我运行 dagger 编译器时,我得到如下信息:

Graph validation failed: Module Inclusion Cycle:
0. com.example.android.analytics.AnalyticsModule included by com.example.android.MyAppModule
1. com.example.android.modules.MyAppModule included by com.example.android.analytics.AnalyticsModule
0. com.example.android.analytics.AnalyticsModule

我在这里做错了什么?我假设它与 includes/addsTo 有关,但是当我删除它们时,我会遇到其他错误。

如果我从 MyAppModule 中删除 includes = AnalyticsModule.class,我会得到如下内容:

com.example.android.analytics.ErrorReporter could not be bound with key com.example.android.analytics.ErrorReporter required by com.example.android.MyApp for com.example.android.MyAppModule

如果我完全放弃 AnalyticsModule,然后将 providesErrorReporter 移交给 MyAppModule,一切都很好,但是我必须公开我的具体 impl 类,以便我可以在其他模块中使用它。

最佳答案

@Module(includes = AnalyticsModule.class) 对于将多个模块组合成一个模块很有用。在这种情况下,使用 .plus(new AnalyticsModule()) 是错误的,因为 AnalyticsModule 已经包含在注释中的 includes 行中。所以你应该删除对 plus() 的调用。

@Module(addsTo = MyAppModule.class) 用于允许调用 .plus(new AnalyticsModule())。由于我们已经删除了该调用,因此我们也应该删除 addsTo

@Module(complete = false)AnalyticsModule 所必需的,因为它的某些依赖项无法单独满足。这没关系;只要 MyAppModule 具有 complete = true(默认值),Dagger 就会进行必要的错误检查。

不可否认,“模块包含周期”错误有点不清楚。这个循环是由 A 包含 B 添加到 A 引起的。

关于android - Dagger 模块包含周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21535407/

相关文章:

android - Dagger 2 不生成组件

android - 如何在自定义 View 或其他 android 类中使用 AndroidInjection 类?

java - Dagger 2,MVVM : Adding a third tab and going back and forth crashes the app

java - 触摸主 Activity 中的任何位置时无法启动 Activity

android - 在 Android 中的 ProgressDialog/AlertDialog 上禁用背景暗淡

Android动态改变布局大小

java - Android - 我可以对同一个按钮使用 setOnLongClickListener 和 setOnClickListener 吗?

android - 使用 BindingAdapter 时数据绑定(bind)器无法识别 lambda 中的类型化参数

android - 何时调用 Dagger 2 inject in android component lifecycle

android - 从 Fragment 调用 Hilt-Dagger ViewModel