Dagger 在模块上找不到可注入成员

2023-11-21

我在用着Dagger用于 Android 项目中的依赖注入,并且可以很好地编译和构建应用程序。对象图似乎是正确且有效的,但是当我添加 dagger-compiler 作为依赖项以在编译时获取错误时,它会报告一些奇怪的错误:

[ERROR] error: No binding for com.squareup.tape.TaskQueue<com.atami \
    .mgodroid.io.NodeIndexTask> required by com.atami \
    .mgodroid.ui.NodeIndexListFragment for com.atami.mgodroid \
    .modules.OttoModule
[ERROR] error: No binding for com.squareup.tape.TaskQueue<com.atami \
    .mgodroid.io.NodeTask> required by com.atami \
    .mgodroid.ui.NodeFragment for com.atami.mgodroid.modules.OttoModule
[ERROR] error: No injectable members on com.squareup.otto.Bus. Do you want 
     to add an injectable constructor? required by com.atami. \
     mgodroid.io.NodeIndexTaskService for 
     com.atami.mgodroid.modules.TaskQueueModule

奥托错误看起来就像埃里克·伯克在他的文章中提到的那样Android 应用程序剖析关于没有的演示@Provides注释,但正如你在下面看到的,我这样做了。

我的Otto和TaskQueue模块如下:

@Module(
        entryPoints = {
                MGoBlogActivity.class,
                NodeIndexListFragment.class,
                NodeFragment.class,
                NodeActivity.class,
                NodeCommentFragment.class,
                NodeIndexTaskService.class,
                NodeTaskService.class
        }
)
public class OttoModule {

    @Provides
    @Singleton
    Bus provideBus() {
        return new AsyncBus();
    }

    /**
     * Otto EventBus that posts all events on the Android main thread
     */
    private class AsyncBus extends Bus {
        private final Handler mainThread = new Handler(Looper.getMainLooper());

        @Override
        public void post(final Object event) {
            mainThread.post(new Runnable() {
                @Override
                public void run() {
                    AsyncBus.super.post(event);
                }
            });
        }
    }
}

...

@Module(
    entryPoints = {
        NodeIndexListFragment.class,
        NodeFragment.class,
        NodeIndexTaskService.class,
        NodeTaskService.class
    }
)
public class TaskQueueModule {

    private final Context appContext;

    public TaskQueueModule(Context appContext) {
        this.appContext = appContext;
    }

    public static class IOTaskInjector<T extends Task> 
        implements TaskInjector<T> {

        Context context;

        /**
         * Injects Dagger dependencies into Tasks added to TaskQueues
         *
         * @param context the application Context
         */
        public IOTaskInjector(Context context) {
            this.context = context;
        }

        @Override
        public void injectMembers(T task) {
            ((MGoBlogApplication) context.getApplicationContext())
                .objectGraph().inject(task);
        }
    }

    public static class ServiceStarter<T extends Task> 
        implements ObjectQueue.Listener<T> {

        Context context;
        Class<? extends Service> service;

        /**
         * Starts the provided service when a Task is added to the queue
         *
         * @param context the application Context
         * @param service the Service to start
         */
        public ServiceStarter(Context context, 
                              Class<? extends Service> service) {
            this.context = context;
            this.service = service;
        }

        @Override
        public void onAdd(ObjectQueue<T> queue, T entry) {
            context.startService(new Intent(context, service));

        }

        @Override
        public void onRemove(ObjectQueue<T> queue) {
        }
    }


    @Provides
    @Singleton
    TaskQueue<NodeIndexTask> provideNodeIndexTaskQueue() {
        ObjectQueue<NodeIndexTask> delegate = 
            new InMemoryObjectQueue<NodeIndexTask>();
        TaskQueue<NodeIndexTask> queue = new TaskQueue<NodeIndexTask>(
            delegate, new IOTaskInjector<NodeIndexTask>(appContext));
        queue.setListener(new ServiceStarter<NodeIndexTask>(
            appContext, NodeIndexTaskService.class));
        return queue;
    }

    @Provides
    @Singleton
    TaskQueue<NodeTask> provideNodeTaskQueue() {
        ObjectQueue<NodeTask> delegate = 
            new InMemoryObjectQueue<NodeTask>();
        TaskQueue<NodeTask> queue = new TaskQueue<NodeTask>(
            delegate, new IOTaskInjector<NodeTask>(appContext));
        queue.setListener(new ServiceStarter<NodeTask>(
            appContext, NodeTaskService.class));
        return queue;
    }
}

...

/**
 * Module that includes all of the app's modules. Used by Dagger
 * for compile time validation of injections and modules.
 */
@Module(
        includes = {
                MGoBlogAPIModule.class,
                OttoModule.class,
                TaskQueueModule.class
        }
)
public class MGoBlogAppModule {
}

Dagger 的完整图形分析来自一个完整的模块。即 @Module(complete = true),这是默认值。因为它是默认的,所以默认情况下 dagger 将假定所有绑定都可从该模块或它显式包含的那些模块中获得。

在这种情况下,您已经给出了两个您声称完整的模块,但 Dagger 无法在编译时将它们连接在一起,而无需额外的信号。简而言之,如果 OttoModule 不了解 TaskQueueModule,编译器将尝试分析 OttoModule 的完整性,但会失败,因为它现在不了解 TaskQueueModule。

修改 OttoModule 的注释如下:

@Module(
  includes = TaskQueueModule.class,
  entryPoints = {
    MGoBlogActivity.class,
    NodeFragment.class,
    NodeActivity.class,
    NodeCommentFragment.class,
    NodeIndexTaskService.class,
    NodeTaskService.class
  }
)

然后 Dagger 就会知道,为了使 OttoModule 完整,它包含另一个模块作为其完整定义的一部分。

Note:dagger-compiler 无法检测到 TaskQueueModule 存在于类路径中,并且只是“知道”开发人员打算将其与 OttoModule 一起使用而无需附加信号。例如,您可能有多个定义任务队列的模块,它会选择哪一个?声明必须明确。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dagger 在模块上找不到可注入成员 的相关文章

  • 设置文本视图 Android 的文本颜色

    在 string xml 文件中我使用以下标签
  • 检查 WebView 元素时的 UiAutomator 错误

    I have recently started automation testing in android and was using UiAutomator tool for inspecting UI elements Surprisi
  • 我在布局上看不到任何 FirebaseRecyclerAdapter 项目

    我试图将数据从 Firebase 数据库检索到我的布局 但我看不到任何项目FirebaseRecyclerAdapter在布局中 请帮忙 我按照一个教程展示了如何做到这一点 当我运行应用程序时 我没有看到任何项目 但我可以滚动 public
  • 从响应中获取标头(Retrofit / OkHttp 客户端)

    我正在使用 Retrofit 与 OkHttp 客户端和 Jackson 进行 Json 序列化 并希望获取响应的标头 我知道我可以扩展 OkClient 并拦截它 但这发生在反序列化过程开始之前 我基本上需要的是获取标头以及反序列化的 J
  • Android Studio:XML 布局中的“包装在容器中”

    编辑 XML 布局文件时 Eclipse 有一项称为 包裹在容器中 的功能 重新格式化 gt Android gt 可让您选择一个或多个视图并在其周围包裹您选择的布局 Android Studio中有类似的东西吗 目前正在实施中 问题 69
  • 将现有 VARCHAR 列与 Room 结合使用

    我正在尝试将现有的数据库与 Android Room 一起使用 但是 我的一个表有一个 VARCHAR 列 Room 似乎只支持 TEXT 不支持 VARCHAR 而且 sqlite 不允许修改列类型 那么 有没有办法使用Room中现有的带
  • 如何在我现有的 Android 应用程序中使用 Telegram API(包括聊天应用程序)?

    我想使用 telegram API 在我现有的 Android 应用程序中开发聊天功能 我不知道如何实施 我认为 看看Telegram 数据库库 测试版 从这里TDLib https core telegram org tdlib 俄语 但
  • 自定义首选项中的android首选项水平分隔线?

    我创建了自己的自定义首选项对象来扩展首选项 我创建它们只是因为这些自定义数据类型没有首选项 一切正常 但我的自定义首选项没有相同的外观 因为它们缺少系统首选项对象具有的水平分隔线 我已经查找了创建水平分隔线的代码 但我找不到它是在哪里完成的
  • Bitmap.getPixels() 中的 IllegalArgumentException

    我想将数据从位图复制到int using getPixels 这是我当前的代码 int pixels new int myBitmap getHeight myBitmap getWidth myBitmap getPixels pixel
  • 在 android 中建立与 MySQL 的池连接

    我需要从我的 Android 应用程序访问 MySQL 数据库 现在所有的工作都通过 DriverManager getConnection url 等等 但我必须从多个线程访问数据库 所以我必须使用连接池 问题1 是 com mysql
  • 当 OnFocusChangeListener 应用于包装的 EditText 时,TextInputLayout 没有动画

    不能比标题说得更清楚了 我有一个由文本输入布局包裹的 EditText 我试图在 EditText 失去焦点时触发一个事件 但是 一旦应用了事件侦听器 TextInputLayout 就不再对文本进行动画处理 它只是位于 editText
  • 图像作为电子邮件附件

    我想构建一个应用程序 我可以在电子邮件中附加图像 打开图像并将其设置为我的壁纸 我想让它跨平台 所以你能告诉我是否可以使用phonegap 或者我是否必须为iphone和android构建一个本机应用程序 您好 如果您只想通过电子邮件附加图
  • Android - AudioRecord类不读取数据,audioData和fftArray返回零

    我是 Android 新手 一直在开发音调分析器应用程序 最低 SDK 8 我读了很多关于如何实现 Audiorecord 类的文章 但我想知道为什么它在我录制时不读取任何数据 我尝试显示 audioData 和 fftArray 的值 但
  • 使用片段时应用程序崩溃

    我正在处理碎片和 我的代码中有一个我找不到的问题 logcat 指向我的一个片段中的这段代码 Override public View onCreateView LayoutInflater inflater ViewGroup conta
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • WorkManager 或 AlarmManager 用于日常请求然后通知工作?

    这是用例 用户设置具有特定时间的每日通知 在指定时间 发出网络请求以获取一些数据 然后使用检索到的数据显示通知 我不确定是否应该使用 AlarmManager 还是 WorkManager 来实现这个用例 据我了解 AlarmManager
  • 您使用什么物理 Android 设备进行测试?

    有什么好的推荐用于测试目的的物理 Android 设备吗 我正在苹果阵营寻找像 iPod touch 这样的设备 可以帮助 iOS 开发人员测试他们的东西 我知道有 Nexus One 但那东西相当昂贵 而且我并不真正关心手机的东西 而是可
  • Android 如何将总天数准确更改为年、月、日?

    我正在做一个应用程序 该应用程序与根据给定的生日日期输入获取一个人的年龄有关 为此 我从下面的代码中获取从该日期到当前日期的总天数 String strThatDay 1991 05 10 SimpleDateFormat formatte
  • Android - 以编程方式选择菜单选项

    有没有办法以编程方式选择菜单选项 基本上 我希望视图中的按钮能够执行与按特定菜单选项相同的操作 我正在考虑尝试调用 onOptionsItemSelected MenuItem item 但我不知道要为菜单项添加什么 是的 有一种方法可以选
  • 如何使用 AccessibilityService 在 Android 中模拟按键

    我正在编写一个辅助服务 我一直在尝试在应用程序上进行一些自动搜索 我使用accessibilityservice action paste来填充EditText 然后我需要模拟软键盘上的按键 但我不知道如何做 你们能帮我一下吗 你可以尝试A

随机推荐

  • Log4j 通过任何文件附加程序进行每日轮换和每月保留

    是否可以使用任何 log4j 附加程序来写入具有特定轮换时间和保留限制的日志 目标是 每天都有一个日志文件 在午夜创建一个新文件 新日志 保留日志文件并自动删除它们 经过一定时间后 因此删除超过 X 天 例如 30 天 的日志文件 看起来轮
  • 在 MongoDB 集合上为 Web 应用程序创建索引的推荐方法/位置

    我正在将 MongoDB 用于我们的 Web 应用程序 假设 MongoDB 上有一个用于传入请求的 find 在 MongoDB 集合上添加索引的推荐方式 位置是什么 我能想到的几个选择 1 初始化应用程序时集合上的 ensureInde
  • React 中的状态是什么?

    我知道状态允许我们创建动态和交互式的组件 但我想深入了解状态 有人可以帮助我使用现实生活中的例子来理解 React 中的状态吗 import React from react class App extends React Componen
  • 如何修复损坏的 HDFS 文件

    如何修复损坏的 HDFS 我查看了 Apache Hadoop 网站 它说fsck command 这并不能解决问题 希望以前遇到过这个问题的人可以告诉我如何解决这个问题 与本机文件系统的传统 fsck 实用程序不同 此命令不会纠正它检测到
  • 为什么这个 C++0x 代码不调用移动构造函数?

    由于某种原因 以下代码永远不会调用Event Event Event e Event a Event b Event temp temp move a a move b b move temp why not Using std swap调
  • 使用批处理脚本检查环境中是否存在 JAVA_HOME

    我想检查环境中是否存在 JAVA HOME 所以我写了下面的脚本a bat if JAVA HOME echo Enter path to JAVA HOME set p javahome if not JAVA HOME echo JAV
  • 如何实现 SetOnItemClickListener FirebaseRecyclerViewAdapter

    如何在 Firebase RecyclerView 适配器中实现 SetOnItemClickListener 事件 我使用文档聊天应用程序的示例 private FirebaseRecyclerViewAdapter mAdapter R
  • 如何使用 Apache POI XSSF Excel 的 IndexedColors 中没有的颜色?

    我正在查看一个我想要复制的 Excel 工作表 我遇到的唯一问题是颜色 我想要复制的颜色是Blue Accent 5 Lighter 40 and Light Green来自Standard Colors部分 我正在看docs在 XSSF
  • 来自 ElementUI 的 VueJs + Webpack 延迟加载模块

    我想在 Vue 组件中延迟加载 ElementUI 的特定元素 我试过这个 import Tree from webpackChunkName element ui element ui Vue component Tree name Tr
  • 如何在不使用 npm 的情况下安装 Node.js 模块?

    列出了相当多的模块在节点的 github 页面上但未通过 npm registry 发布 这些模块无法使用 npm 安装 从 Git 克隆这些 Nodejs 模块后 安装它们的正确方法是什么 您需要从 github 下载它们的源代码 找到主
  • Java 无法比较的数据类型 char 和 String

    当我运行 Javac 时 它告诉我 我有一个无法比较的数据类型 char 和 String while responseChar y 不确定要更改什么来修复此错误 import java util Scanner public class
  • 如何在 mule 中强制例外[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我用的是3 2版本 当肥皂故障从服务返回时 我想记录错误并强制全局异常 我尝试使用
  • PHP 动态命名空间

    我需要能够做到这一点 ns common components cfoBi i18n countryCode gimmea use USP 显然这行不通 那么我该怎么做呢 有 动态命名空间 吗 不可能 命名空间 导入和别名在编译时解析 但是
  • Canvas:遮盖图像并保留其 Alpha 通道?

    这就是我想做的 获取图像 A 和图像 B 图像 B 是黑白掩模图像 将图像 A 的 Alpha 通道替换为图像 B 的红色通道 在画布上绘制图像 C 在图像 C 上绘制图像 A 在步骤 4 之前 一切似乎都正常 图像 C 根本不可见 而图像
  • 使用目录版本和 kotlin dsl 时未找到 LibraryExtension

    我在 gradle 中使用目录版本时遇到问题 我正在尝试将其应用到我的项目中 我从这里举了一个例子https github com android nowinandroid但是当我收到如下错误时 Extension of type Libr
  • Objective-C 中的 Sscanf 等效项

    我目前正在用 Objective C 编写一个 wavefront OBJ 加载器 并试图弄清楚如何以与 C 中的 sscanf 函数类似的方式解析 NSString 中的数据 OBJ 文件以 x y z 三元组的顶点 纹理坐标和法线定义面
  • 如何让脚本在不破坏 CSP 的情况下使用 setAttribute 'style'

    我正在努力使我的 CSP 政策尽可能严格 我需要在我的捆绑包中包含 3d 派对组件 但它使用element setAttribute style 破坏CSP的方法 有没有办法允许这个特定的脚本以这种方式内联样式 是的 有办法 这里有很多关于
  • 如何将外部项目中的控制器和视图包含到 MVC6 中?

    我有一些带有控制器和视图的模块 它基本上是我的网络应用程序的扩展 每个模块都在一个类库中 我想从我的 Web 应用程序加载这些程序集 但我在这里运气不好 我的解决方案文件结构如下 src Web Common Class Library P
  • NSFetchedResultsController 返回重复项(相同的 objectID 和引用)

    我在 NSFetchedResultsController 中遇到了奇怪的行为 这是 iOS 10 中的新功能 开门见山 fetchedObjects包含重复的对象 按照我自己的标准 这绝不是 重复 它们实际上具有相同的 objectID
  • Dagger 在模块上找不到可注入成员

    我在用着Dagger用于 Android 项目中的依赖注入 并且可以很好地编译和构建应用程序 对象图似乎是正确且有效的 但是当我添加 dagger compiler 作为依赖项以在编译时获取错误时 它会报告一些奇怪的错误 ERROR err