问题标签 [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 回答
337 浏览

java - 单例 Dagger2 组件

我在一个谷歌 appengine 项目中使用 Dagger2,我有几个 servlet 使用给定对象 (MyObject) 的单例实例,应该是什么。

然后我需要 DaggerMyComponent.create() 也是一个单例,以便我可以在所有 servlet 中获得相同的 IMyObject。为此,我添加了一个

到我的 MyComponent 界面。但是,这仍然允许错误地再次调用 create() 并且它对我来说不一定是一个很好的解决方案。

有任何想法吗?

谢谢!

0 投票
1 回答
2247 浏览

dagger-2 - Dagger 2 命名集注入

我有一个注入点:

此外,我有这个模块提供依赖:

但是 dagger 2 APT 无法创建适当的类。我从 APT 得到这个异常:

有没有人有同样的问题?有没有好的解决方法?

如果我删除 Named 注释,它确实有效。我正在使用匕首 2.0

谢谢

0 投票
0 回答
368 浏览

jackson - 在使用 Jackson 反序列化时使用 Dagger 2 注入值

@JacksonInject反序列化时,Jackson 将从提供给 的映射ObjectMapper而不是从 JSON 中获取标记为 的对象的任何属性的值。此映射是通过调用 ObjectMapper.setInjectableValues() 并提供一个InjectableValues对象来指定的,该对象可以根据请求查找要注入的值。

用 Guice 创建这样一个对象是相当容易的(就像jackson-module-guice那样)。首先,当您创建对象映射器时,您注入Injector并将其包装在一个InjectableValues实现中,该实现只是将请求转发给Injector(要注入的事物的类及其注释可用)。

为了在 Dagger 2 中实现这一点,我们需要能够获取一个Class对象(和相关的注释)并在运行时注入一个实例。然而,鉴于 Dagger 2 的代码生成方法,这似乎是不可能的。我错过了什么吗?

0 投票
3 回答
1033 浏览

android-studio - 在 Android Studio 中为单元测试构建生成代码

使用android-apt 插件时,是否可以为测试构建生成代码?具体来说,我正在使用 Dagger 并且有一些仅在单元测试中需要的 TestModules,并且只需要在测试版本中使用。似乎该插件不支持 testApt 'my-dependency'。

0 投票
1 回答
1016 浏览

android - Dagger2 组件作为静态全局变量

我的 Android 应用程序有多个活动。MainActivity 在其 onCreate() 方法中构造了一个 Dagger2 组件并将其分配给一个静态变量,因此任何类都可以调用静态方法 MainActivity.getDaggerComponent() 来为自己注入依赖项。

我发现的问题是,当我启动 VideoPlayerActivity 时,MainActivity 对象有时会调用其 onPause()。如果发生这种情况,静态组件变量将设置为 null。稍后,VideoPlayerActivity 需要注入它的依赖项,但是没有组件,所以事情就搞砸了。

如何确保 Dagger2 组件始终可用于所有活动?

0 投票
2 回答
19967 浏览

android - 每个片段(或活动等)的 Dagger 2 自定义范围

我看过几篇不同的文章,这些文章似乎暗示了在 Dagger 2 中进行自定义范围界定的两种不同方法:

  1. 在配置更改中幸存的 MVP 演示者第 2 部分Github 存储库):

    • 为每个片段使用唯一的自定义范围,例如@Hello1Scope@Hello2ScopeforHello1FragmentHello2Fragment分别
  2. 在 Android 上品尝 Dagger 2

    • 对所有片段使用单个自定义范围,例如@PerFragment.

据我了解,似乎与方法 2 一样,定义一个可用于所有片段(即@PerFragment)的范围应该没问题。事实上(如果我错了,请纠正我),似乎自定义范围的名称无关紧要,只有创建子组件的位置(即在应用程序、活动或片段中)才重要。

是否有任何用例可以为每个片段定义唯一范围,例如案例 1?

0 投票
1 回答
2236 浏览

android - Dagger 2 组件继承和错误

我正在尝试创建以下场景:

匕首编译器给了我以下错误作为响应:

RestModule包含一个方法,@Provides @Singleton RestClient provideRestClient()还值得注意的是,当我extends DaggerInjectionFactoryMyPreferencesComponentdagger 中删除时,编译器在生成组件构建器时没有问题。

我想要做的是创建一个包含所有可注入类的接口,我想在其中使用@Inject注释,并在我的“所有”组件中实现它们,这样我就不必将它们添加void inject(MyActivity myActivity);到我的所有组件中.

因为我是该框架的新手,所以我不知道正确的术语是什么,因此对于我需要搜索的内容没有真正的线索。

所以我的问题是:是否可以创建这样的结构,定义一个接口,自动将所有void inject()方法添加到我的“所有”组件中?如果是这样,怎么办?

-- 编辑 -- 预期的用法是这样的:

0 投票
1 回答
2253 浏览

dagger-2 - Dagger 2 中的单例作用域

我正在尝试在 Dagger 2 中设置以下内容:
AnEventFinder有两个部分:aTriggerFinder和 anArgFinder每个部分都有许多不同的实现,它们本身就是具有许多依赖关系的复杂对象。下面的代码示例成功构建了一个EventFinderwith 示例TriggerFinder,并且ArgFinder它们都依赖于另一个对象WordNet. 但是,WordNet它是一个非常大、昂贵、恒定的对象,我想在模型之间作为单例共享。当前的实现WithWordNetEventFinderComponent加载了WordNet两次。如果我尝试将@Provides方法标记WordNetModule为 as @Singleton,则会收到错误消息:

但是在组件树上向上传播@Singleton注释只会导致其他错误。如果这样做的正确方法怎么办?

完整代码:

0 投票
3 回答
1027 浏览

android - 使用 Flow + Mortar + Dagger2 保存/恢复屏幕状态的首选方法是什么?

我正在尝试将 Acticity + Fragments 应用程序转换为 Flow + Mortar + Dagger2

我想在从一个屏幕跳到另一个屏幕(至少向后)时保存和恢复屏幕状态。首选/推荐的方法是什么?

我花了很多时间查看流程和砂浆自述文件和示例,但无法弄清楚(文档和示例很少,只处理简单/静态/独特的数据)。

例如,您有一个类似浏览器的应用程序,它从一个页面移动到另一个页面,其中每个页面使用相同的 PageView 类、相同的 PagePresenter 类,但根据用户键入的 url 字符串具有不同的动态内容

使用 Dagger2(编译类型注释)通过注入来保存/恢复状态非常复杂/困难,对吧?(这将需要一个复杂的父/缓存结构)

我用谷歌搜索了一下,偶然发现: https ://github.com/lukaspili/flow-navigation

然而,这主要是一个实验......如果可能的话,我宁愿将我的生产赚钱应用程序建立在官方/可靠/测试/支持/由 square 支持的解决方案上

我还看了:

1) https://github.com/square/flow/issues/11 但是该示例在具有不同视图类的 2 个屏幕中使用 Dagger 注入数据(不是有效答案)

2)https://github.com/square/flow/issues/76(没有给出答案)

3) Mortar / Flow 在后台保存视图和演示者

我也看到了这一点:我们现在在内部通过简单地向我们的屏幕对象添加一个可变字段来执行此操作:

当一个 View 被换出时,我们获取它的实例状态并将其设置在屏幕对象上(它已经在 backstack 上)。在将其推广到库之前,我们将使用这种模式一段时间。

但是流动样本和砂浆样本都没有使用这个解决方案(他们使用 dagger2 来注入列表......再次不是有效的解决方案)

那么,在砂浆+流(+ dagger2)应用程序中恢复/保存屏幕状态的最新最佳/推荐方式是什么?

0 投票
1 回答
428 浏览

android-studio - 在 Dagger2 中查找提供者的便捷方式

我有一个非常大的项目,我遇到的问题是我希望更容易找到供应商。

我有很多模块,在大多数情况下,它们是在应用程序启动时注入到对象图中的全局模块。这是问题所在:假设我找到了一个标有@Inject注释的属性,那么我希望能够立即找到提供者。我怎样才能做到这一点?我正在使用 Android Studio 2.0