问题标签 [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.
java - 无法使用 Dagger 2 构建图形
我正在尝试根据 dagger 2 网站的示例使用 Dagger 2 创建依赖关系图(coffeeMaker 和源代码在这里:https ://github.com/google/dagger/tree/master/examples/simple )。
我按照网站中的说明创建了组件:
注释处理器正确生成文件(在目标目录中),但我无法找到DaggerCoffeeShop
该类。(Ctrl + 空格)不起作用。
我怎么解决这个问题?
java - 找不到 Dagger 2 的符号类“已生成”
我刚开始使用Dagger 2
. 当我启动我的modules
,components
并尝试构建我的应用程序时,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
或者为什么没有其他人面临这个特定问题(我假设是这样,因为我在这里找不到任何关于这个的问题?
android - Dagger2 多模块设计
对于Dagger2版本,我计划将模块拆分为几个小模块,以便在其他项目中重复使用。
应用模块包含很多东西,我可以将它分为三种类型。A型相关,B型相关,C型相关。
所以我想把它放到三个不同的模块中,因此如果需要其他项目,它可以重复使用其中的一部分。
应用程序的 build.gradle
应用程序模块的 build.gradle
完成上述步骤后,我将创建我的应用程序模块
和我的组件
当我在活动中使用它时,它看起来像
有编译问题
错误:(22, 10) 错误:没有 @Provides- 或 @Produces-annotated 方法无法提供 XXXXXX。com.myapplication.mXXX [注入的字段类型:XXX]
我想当我配置活动组件从应用程序组件扩展时有问题。
我的目的是 Application Component 中的一些单例对象,活动将注入相同的对象以减少每次在活动上创建的一些对象。我的设计错了吗??还是需要为配置做任何其他事情?
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 没有正确注入有什么原因吗?
android - 与匕首 2 的动态绑定
Dagger
我在将我的 Android 应用程序从Dagger2
.
我在测试期间使用 Dagger 在不同的层注入模拟(单元、功能设备以及介于两者之间的所有内容)。
例如,我有一个NetworkingModule
提供 aHttpTransport
和 a 的 a ServerConnector
。对于某些测试,我只是模拟 http 层,对于其他测试,我模拟 . ServerConnector
,而其他测试使用发布类来测试与真实测试服务器的集成。
这些测试可以在所有构建风格(调试、发布等)上运行。
我只找到了对Dagger2
每个构建类型设置单个静态注入配置的描述 - 即绑定真实类的发布组件和绑定一组模拟的调试组件。
我需要找到一种方法让测试用例在应用程序启动阶段替换模块。
我怎样才能做到这一点?在我的想法中,当应用程序触发构建图时,我总是陷入困境,它必须使用一个组件,该组件是某个接口的实现,它的模块有静态注释???
换个说法:是否可以在同一个构建中编译多个提供相同注入的模块?然后我将如何在运行时注入正确的模块?
有人可以为我的NetworkingModule
.
顺便说一句:我大量使用Espresso
,Robolectric
和Mockito
.
谢谢。
java - 使用注释处理延迟绑定到 Dagger2 图形
在这个问题中,我谈论Dagger2。Dagger2 基本上由组件和模块组成。这是一个例子:
假设我有一个界面:
和一个可能的实现:
我可以使用 Dagger2 生成将实现与接口链接:
和
这是对 Dagger2 的简要介绍。现在假设我有以下界面:
代码中没有实现MySecondCoolServiceImpl
。MySecondCoolService
相反,我有一个注释@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 Guice和Google Gin中完成。一个这样做的项目是GWTP。那里有一个演示者:
它有一个接口的@NameToken
注释。ProxyPlace
在您的AbstractPresenterModule
情况下,您将视图与演示者和代理连接:
可以看到没有MyProxy
给出接口的实现。由生成器创建的实现(类似于注释处理器,但用于 GWT)。Generator 生成实现StartPagePresenter.MyProxy
并将其添加到 guide/gin 系统:
dagger-2 - 如何使用构造函数注入创建对象?
我将如何创建一个带有提供 Cat 的组件的 Dog 实例。
在用 Dagger 2 试验了一段时间后,我不知道如何使用构造函数注入 - 一个提示会很好,谢谢。
编辑:
这个问题有什么问题?使用 Dagger 2 之后,看了几个教程并阅读了官方文档,我不知道如何使用构造函数注入功能,这就是我在这里问的原因。我可以编写一个提供 Dog 对象的 DogModule,而不是使用 @Inject 将 Cat 依赖项注入到 Dog 中,但是 Dog 将只是一个常规 Java 类。字段注入效果很好(有很多例子展示了如何使用它)但是我需要做什么才能使用构造函数注入?
android - 无法使用 Dagger 2 注入类
我正在尝试将 Dagger 2 添加到我的 Android 项目中。我想我理解这些概念直到我构建图表的位置。那时我在黑暗中拍摄,这就是我出错的地方。
一切都可以编译,但注入的字段在运行时为空。
我试图通过将 Presenter 注入我的 MainActivity 来开始。我已经编写了以下代码,希望能帮助我找出哪里出错了。
我的 PresenterModule.java:
我的应用程序类还包括我的组件,遵循 Dagger2 示例代码:
最后是我的 MainActivity。
要注入的实际对象是接口的实现,但在其他方面是 POJO 对象:
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)时,出现以下错误:
我假设这两个错误之间没有联系,但是有没有人知道发生了什么以及如何修复测试?
android - Dagger2 自定义范围:自定义范围(@ActivityScope)如何实际工作?
我正在 GitHub 上阅读Dagger2 Component Scopes Test的源代码,并且我看到了为名为 的活动定义的“自定义范围” @ActivityScope
,但我在其他项目中看到了它,包括具有其范围的 4 模块CleanArchitecture 。@PerActivity
但从字面上看,@ActivityScope
注释的代码如下:
它在模块中“神奇地”可用:
或CleanArchitecture示例:
我可以清楚地看到这与 JSR-330 自定义范围有关,但我真的不明白这里到底发生了什么,以便此代码启用给定模块和/或给定模块提供的内容取决于实际的Activity
生命周期,并且仅存在一个实例,但前提是该给定活动处于活动状态。
文档是这样说的:
它说要查看组件文档页面,但这给了我 404。我也看到了这个,但是......
我可以请求一些帮助来澄清为什么指定这个自定义范围神奇地使Activity-level scopes
工作没有问题吗?
(答案是,子作用域可以从其超作用域接收依赖关系,只要组件存在,子作用域就存在。并且您需要在模块上指定作用域,并且需要将组件依赖关系指定为子作用域一个超作用域。 )