问题标签 [dagger]

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 投票
2 回答
2406 浏览

android - Android Dagger - 没有无参数构造函数的模块

如何组合没有无参数构造函数的模块。我有一个包含多个模块的库,我想在我的应用程序中重用它们。但是,这些模块需要一些参数。以下示例描述了我的设置:

图书馆:

请注意,LibModule2 依赖于 LibModule1 提供的一些对象。

应用程序: 在我的应用程序中,我将来自 LibModule1 和 LibModule2 的对象注入到一个类中。但我不知道,如何组合这些模块。包含参数不起作用,因为两个模块都没有无参数构造函数。addTo不起作用,因为我需要两个库模块,但是参数让我只设置一个类。创建两个注入我的类MyClass.class的应用程序模块不起作用(一个类只能由一个模块注入,对吧?!)。

我该如何解决这个问题?

0 投票
1 回答
496 浏览

dagger - Dagger 和 Object Graph 范围与 Flow/Mortar

所以这个周末我花了很多时间在Mortar 和 Flow上,我想我终于把大部分时间都解决了。我发现它比我最初想象的要复杂一些,主要是因为我还没有完全了解 Dagger 的 ObjectGraph 范围,Mortar 非常依赖它。我已经在 Dagger 的网站上阅读了尽可能多的内容,但我发现当它与 Dagger 相关时,我发现缺乏关于这个主题的信息。

所以我有几个问题: 1. 我看到了他们对@Singleton 的范围界定的例子:

在这种情况下,Presenter 是否专门针对此模块,因为它是一个内部类?2. 如何确保它的一个实例只在这个对象图中创建,而不是在全局应用程序对象图中?2. 如果 Presenter 太大了,我想把它移到它自己的单独类中怎么办?我如何将其范围仅限于该模块?3. 我注意到他们示例中的一些 Module 类是静态的,而另一些则不是。这对范围界定有影响吗?4. 我在哪里可以阅读更多内容以更好地理解 Dagger 的对象图。我需要更好地理解包含、注入、addTo 以及它们如何在 ObjectGraph 创建等中使用:

0 投票
1 回答
1146 浏览

android - 我缺少一些匕首基础知识 [CoffeeMaker 应用示例]

任何喜欢匕首的人都可以提示我,因为我没有得到它。所以我按照咖啡机的例子,它工作正常,但是我想在这种情况下提供另一个依赖关系咖啡机:

它没有说:

但是它被注入到 CofeeApp 中,有人可以解释为什么会这样吗?更重要的是,除了官方文档和Jesse Wilson 的演讲之外,您还有其他关于匕首的好文档吗?

谢谢

0 投票
1 回答
1791 浏览

java - Dagger 的嵌套/递归注入

使用 Dagger 时,哪些方法允许在也通过注入实例化的对象上自由/轻松地实例化 @Inject 字段。

例如,下面的代码会将 Bar 类型的对象注入给定的 Foo 对象。它将以显示的两种方式之一执行此操作。但是,每个 Bar 对象的 Sly 字段与该行为不匹配。

狡猾

模块

测试

在任何一种情况下,Bar 的 Sly 都没有被实例化/@Injected。当然,Dagger 允许构造函数注入,从而解决了这个问题。我想知道是否有其他方法可以将这些类放入构造函数的参数列表中。什么适合你?

0 投票
2 回答
6023 浏览

android - 基于构建类型和风格的更好的 Dagger 依赖注入?

我正在使用方法为 Dagger 提供模块,在这个问题Android Customize Workflow for Product Flavors的回答中描述

我们的方法有点不同——我们有构建类型 inModules和构建类型 in 。我们的主要模块被称为它包括所有其他。debugsrc/debug/javareleasesrc/release/javaApplicationModule

Modulesinsrc/debug/java为调试、日志记录等和覆盖提供了一些自定义行为ApplcationModule

现在我们需要有基于应用程序风格的自定义行为。

这样做的正确方法是什么?

例如,风味 A 到 C 应该提供自定义行为,而风味 D 到 F 应该提供基本的默认行为。

到目前为止,我想出了这样的。

  • 所有口味(不是构建类型)在src/flavorX/java/com.application.FlavorModule
  • 为了避免代码重复,只有风味 A 到 C 提供自定义行为,而其他完全空的,以便项目可以编译。我的模块提供了默认行为src/main/java

有没有更好的方法来达到这样的结果?因为我不喜欢空src/flavorX/java/com.application.FlavorModule,也不喜欢重复代码……

0 投票
3 回答
7721 浏览

android - Robolectric 不使用测试应用程序

根据这个链接,我可以创建一个测试应用程序,Robolectric 将自动开始在测试中使用。我不能让它工作。

我正在使用 Dagger 进行依赖注入,并为ActivityApplication. 然后我的每个活动都扩展了包装活动类而不是普通的 old Activity

我遇到的问题是,在测试中,Application模块提供的依赖项无法解决,因此测试失败。这是因为我们的大多数测试只是构建一个活动(使用Robolectric.buildActivity()),而不是从Application.

我希望以某种方式修改 Robolectric 测试运行程序以在Application. 或者使用上面链接中概述的测试应用程序。

我创建了一个测试应用程序,但仍然收到相同的测试错误,因为测试没有在这个测试应用程序下运行。我尝试将测试应用程序移动到不同的包等,但没有任何变化。

我正在寻找一些关于如何去做我想做的事情的建议。对那些有 Dagger 经验以及他们如何进行测试的人特别感兴趣。

0 投票
1 回答
1062 浏览

android - 将参数从模块传递到模块

使用 Dagger,对于简单的事情来说效果很好,但是当我将参数传递给模块时,我不明白规则。基本上是想将应用程序上下文传递给提供者方法,并创建一个需要上下文的 Volles 请求队列。

我像这样创建我的模块:

应用上下文模块:

请求队列模块:

正如你所看到的,我玩了一些构造函数注入,看起来我想念第一次理解这一点。无论如何,使用 @ApplicationContext 注解来阐明应该注入 App Context。但我得到这个编译错误:

错误:com.app.android.application.modules.RequestQueueModule 的provideRequestQueue(android.content.Context) 需要@com.app.android.annotation.ApplicationContext()/android.content.Context 错误:com 上没有可注入成员。 android.volley.RequestQueue。你想添加一个可注入的构造函数吗?com.app.android.io.service.AutoCacheService 要求 com.app.android.application.modules.ReleaseModules

我花了几个小时来解决这个问题。但是真的看不出问题。我还尽量避免 library = true 开关,因为我的理解是它会在编译时禁用图形检查。一些食谱可以更好地理解这一点......

更新:看起来这个SO 问题与我的相似。

0 投票
1 回答
4370 浏览

java - 我什么时候应该使用工厂而不是提供者

Dagger 文档显示了使用 aProvider<Filter>来获取Filter实例,这似乎很有意义。

我正在编写一个ListAdapter实例化视图,我希望 Dagger 注入它。我很想将 aProvider<ViewType>注入我的ListAdapter, 并调用mViewProvider.get()实例化视图。

但是,Dagger 文档说:

注入Provider<T>可能会创建令人困惑的代码,并且可能是图形中范围错误或结构错误的对象的设计气味。通常你会想要使用 aFactory<T>或 aLazy<T>或者重新组织代码的生命周期和结构,以便能够只注入 aT

我可以看到如何与使用辅助注射时所需的方式类似的方式使用工厂。

但是,考虑到我必须自己编写前者,使用我自己Factory<T>的比使用 Dagger's 有什么优势?Provider<T>

0 投票
1 回答
1887 浏览

java - 如何从仅在运行时知道的类型中获取匕首实例

我正在处理具有类型参数的注释。此类型参数用于实例化一个新对象。

使用 Google Guice,我会注入“注入器”本身并使用它来查找正确的实例。但是我对 Dagger 有点陌生,我没有看到网上描述的任何解决方案。我知道 ObjectGraph 可以给我一个实例。我/我可以注入 ObjectGraph 本身吗?我该怎么做?

0 投票
3 回答
8688 浏览

android - Gradle dagger lint:被包忽略

我使用 Gradle 创建了一个 Android 项目。我添加了一个 Dagger 库:

尝试编译项目后,由于 lint 异常导致构建失败:

../../../../../../.gradle/caches/modules-2/files-2.1/com.squareup.dagger/dagger-compiler/1.2.1/c8bf6c2fda9b27f4d44a2aa4280df525a1408771/dagger-compiler -1.2.1.jar:库中的包引用无效;不包含在 Android 中:javax.annotation.processing。引用自 dagger.internal.codegen.GraphAnalysisErrorHandler。

../../../../../../.gradle/caches/modules-2/files-2.1/com.squareup.dagger/dagger-compiler/1.2.1/c8bf6c2fda9b27f4d44a2aa4280df525a1408771/dagger-compiler -1.2.1.jar:库中的包引用无效;不包含在 Android 中:javax.lang.model.type。引用自 dagger.internal.codegen.GeneratorKeys。

../../../../../../.gradle/caches/modules-2/files-2.1/com.squareup.dagger/dagger-compiler/1.2.1/c8bf6c2fda9b27f4d44a2aa4280df525a1408771/dagger-compiler -1.2.1.jar:库中的包引用无效;不包含在 Android 中:javax.lang.model.util。引用自 dagger.internal.codegen.GraphAnalysisErrorHandler。

../../../../../../.gradle/caches/modules-2/files-2.1/com.squareup/javawriter/2.3.0/4b290e394ea3109be5c0b7f08ff75de089125122/javawriter-2.3.0.jar : 库中的包引用无效;不包含在 Android 中:javax.lang.model.element。引用自 com.squareup.javawriter.JavaWriter。

因此,我必须修复或使 lint 忽略 Dagger 包。我已经设置lint.xml,但我想不出一种忽略的方法:

谢谢。