问题标签 [dagger-2]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
307 浏览

java - 无法使用 Dagger 2 构建图形

我正在尝试根据 dagger 2 网站的示例使用 Dagger 2 创建依赖关系图(coffeeMaker 和源代码在这里:https ://github.com/google/dagger/tree/master/examples/simple )。

我按照网站中的说明创建了组件:

注释处理器正确生成文件(在目标目录中),但我无法找到DaggerCoffeeShop该类。(Ctrl + 空格)不起作用。

我怎么解决这个问题?

0 投票
5 回答
19453 浏览

java - 找不到 Dagger 2 的符号类“已生成”

我刚开始使用Dagger 2. 当我启动我的modulescomponents并尝试构建我的应用程序时,gradle抛出了错误

Error:(4, 24) error: cannot find symbol class Generated

我深入研究了它,发现错误出现在Dagger生成的类之一中DI。缺少的特定类是javax.annotation.Generated,抛出错误的行是将Dagger生成的类注释为的行@Generated("dagger.internal.codegen.ComponentProcessor")

这个问题有助于找到解决方案,即通过将行添加到我的 gradle 构建文件来将javax包添加为依赖项。compile 'org.glassfish:javax.annotation:10.0-b28'这导致了成功的构建。

我的问题是,为什么没有将其添加为传递依赖项,Dagger或者为什么没有其他人面临这个特定问题(我假设是这样,因为我在这里找不到任何关于这个的问题?

0 投票
1 回答
1598 浏览

android - Dagger2 多模块设计

对于Dagger2版本,我计划将模块拆分为几个小模块,以便在其他项目中重复使用。

应用模块包含很多东西,我可以将它分为三种类型。A型相关,B型相关,C型相关。

所以我想把它放到三个不同的模块中,因此如果需要其他项目,它可以重复使用其中的一部分。

来自Google's Fork 的参考资料

应用程序的 build.gradle

应用程序模块的 build.gradle

完成上述步骤后,我将创建我的应用程序模块

和我的组件

当我在活动中使用它时,它看起来像

有编译问题

错误:(22, 10) 错误:没有 @Provides- 或 @Produces-annotated 方法无法提供 XXXXXX。com.myapplication.mXXX [注入的字段类型:XXX]

我想当我配置活动组件从应用程序组件扩展时有问题。

我的目的是 Application Component 中的一些单例对象,活动将注入相同的对象以减少每次在活动上创建的一些对象。我的设计错了吗??还是需要为配置做任何其他事情?

0 投票
2 回答
9072 浏览

java - Dagger 2 和接口实现

我有一个简单的 Dagger 2 测试设置,基于http://konmik.github.io/snorkeling-with-dagger-2.html。它注入了一个输出所有首选项的 PreferenceLogger。在注入的类中,我可以@Inject 更多的类。

当我运行它时,设置了记录器,并且在 PreferencesLogger.log 中正确设置了 OkHttpClient。所以这个例子按预期工作。现在我正在尝试建立一个 MVP 结构。有一个带有实现的 MainPresenter 接口。在 MainActivity 我设置了一个:

所以我可以用另一种(调试或测试)实现来切换这个 MainPresenter。当然,现在我需要一个 Module 来指定我想要使用的实现。

现在出现了一个问题,即不再注入 OkHttpClient。当然,我可以更改模块以接受参数 OkHttpClient,但我认为这不是建议的方法。MainPresenterImpl 没有正确注入有什么原因吗?

0 投票
1 回答
1044 浏览

android - 与匕首 2 的动态绑定

Dagger我在将我的 Android 应用程序从Dagger2.

我在测试期间使用 Dagger 在不同的层注入模拟(单元、功能设备以及介于两者之间的所有内容)。

例如,我有一个NetworkingModule提供 aHttpTransport和 a 的 a ServerConnector。对于某些测试,我只是模拟 http 层,对于其他测试,我模拟 . ServerConnector,而其他测试使用发布类来测试与真实测试服务器的集成。

这些测试可以在所有构建风格(调试、发布等)上运行。

我只找到了对Dagger2每个构建类型设置单个静态注入配置的描述 - 即绑定真实类的发布组件和绑定一组模拟的调试组件。

我需要找到一种方法让测试用例在应用程序启动阶段替换模块。

我怎样才能做到这一点?在我的想法中,当应用程序触发构建图时,我总是陷入困境,它必须使用一个组件,该组件是某个接口的实现,它的模块有静态注释???

换个说法:是否可以在同一个构建中编译多个提供相同注入的模块?然后我将如何在运行时注入正确的模块?

有人可以为我的NetworkingModule.

顺便说一句:我大量使用Espresso,RobolectricMockito.

谢谢。

0 投票
2 回答
735 浏览

java - 使用注释处理延迟绑定到 Dagger2 图形

在这个问题中,我谈论Dagger2。Dagger2 基本上由组件和模块组成。这是一个例子:

假设我有一个界面:

和一个可能的实现:

我可以使用 Dagger2 生成将实现与接口链接:

这是对 Dagger2 的简要介绍。现在假设我有以下界面:

代码中没有实现MySecondCoolServiceImplMySecondCoolService相反,我有一个注释@JustForCoolStuff来标记字段和方法。我创建了一个注释处理器,它收集所有这些注释并生成MySecondCoolServiceImpl哪个实现MySecondCoolService

MySecondCoolService我编译器在注释处理器运行之前就知道新接口。所以我可以将我的组件更改为:

问题是我在代码中还没有实现,而且我不知道MySecondCoolService注释处理器将生成的实现的名称。因此,我无法在MyModule. 我能做的是更改我的注释处理器,以便它为我生成一个新模块。我的注释处理器可以生成这样的模块(MyGeneratedModule):

再次MyGeneratedModule由注释处理器生成。在运行注释处理器之前我无权访问它,我也不知道它的名称。

这就是问题所在:注解处理器必须以某种方式告诉 Dagger2 有一个 Dagger2 应该考虑的新模块。由于注释处理器无法更改文件,因此无法扩展@Component(modules = {MyModule.class})注释并将其更改为如下内容:@Component(modules = {MyModule.class, MyGeneratedModule.class})

有没有办法以MyGeneratedModule编程方式添加到 dagger2 依赖图?如上所述,我的注释处理器如何告诉 Dagger2 在接口和实现之间应该有新的连接?


Foray: 我知道类似的事情可以在Google GuiceGoogle Gin中完成。一个这样做的项目是GWTP。那里有一个演示者:

它有一个接口的@NameToken注释。ProxyPlace在您的AbstractPresenterModule情况下,您将视图与演示者和代理连接:

可以看到没有MyProxy给出接口的实现。由生成器创建的实现(类似于注释处理器,但用于 GWT)。Generator 生成实现StartPagePresenter.MyProxy并将其添加到 guide/gin 系统:


0 投票
1 回答
7962 浏览

dagger-2 - 如何使用构造函数注入创建对象?

我将如何创建一个带有提供 Cat 的组件的 Dog 实例。

在用 Dagger 2 试验了一段时间后,我不知道如何使用构造函数注入 - 一个提示会很好,谢谢。

编辑:
这个问题有什么问题?使用 Dagger 2 之后,看了几个教程并阅读了官方文档,我不知道如何使用构造函数注入功能,这就是我在这里问的原因。我可以编写一个提供 Dog 对象的 DogModule,而不是使用 @Inject 将 Cat 依赖项注入到 Dog 中,但是 Dog 将只是一个常规 Java 类。字段注入效果很好(有很多例子展示了如何使用它)但是我需要做什么才能使用构造函数注入?

0 投票
1 回答
2412 浏览

android - 无法使用 Dagger 2 注入类

我正在尝试将 Dagger 2 添加到我的 Android 项目中。我想我理解这些概念直到我构建图表的位置。那时我在黑暗中拍摄,这就是我出错的地方。
一切都可以编译,但注入的字段在运行时为空。

我试图通过将 Presenter 注入我的 MainActivity 来开始。我已经编写了以下代码,希望能帮助我找出哪里出错了。

我的 PresenterModule.java:

我的应用程序类还包括我的组件,遵循 Dagger2 示例代码:

最后是我的 MainActivity。

要注入的实际对象是接口的实现,但在其他方面是 POJO 对象:

0 投票
1 回答
912 浏览

android - Dagger2 androidTest 错误重复条目:javax/annotation/Generated.class

我将 Dagger2 用于 DI。我的项目有 2 个模块,一个:common模块是库,一个:app模块是实际应用程序。

在库模块中,我拥有AndroidApp扩展并在模块MultiDexApplication中继承。:app我已经按照 Google 的 dagger2示例将 DI 添加到 Dagger2。

每次运行应用程序时,我都会收到以下消息作为错误:

但奇怪的是 Android Studio 说BUILD SUCESSFULL并且应用程序运行没有问题。

当我尝试在:common库模块上运行测试(androidTest)时,出现以下错误:

我假设这两个错误之间没有联系,但是有没有人知道发生了什么以及如何修复测试?

0 投票
2 回答
14320 浏览

android - Dagger2 自定义范围:自定义范围(@ActivityScope)如何实际工作?

我正在 GitHub 上阅读Dagger2 Component Scopes Test的源代码,并且我看到了为名为 的活动定义的“自定义范围” @ActivityScope,但我在其他项目中看到了它,包括具有其范围的 4 模块CleanArchitecture 。@PerActivity

但从字面上看,@ActivityScope注释的代码如下:

它在模块中“神奇地”可用:

CleanArchitecture示例:

我可以清楚地看到这与 JSR-330 自定义范围有关,但我真的不明白这里到底发生了什么,以便此代码启用给定模块和/或给定模块提供的内容取决于实际的Activity生命周期,并且仅存在一个实例,但前提是该给定活动处于活动状态。

文档是这样说的:

它说要查看组件文档页面,但这给了我 404。我也看到了这个,但是......

我可以请求一些帮助来澄清为什么指定这个自定义范围神奇地使Activity-level scopes工作没有问题吗?

(答案是,子作用域可以从其超作用域接收依赖关系,只要组件存在,子作用域就存在。并且您需要在模块上指定作用域,并且需要将组件依赖关系指定为子作用域一个超作用域。 )