【问题标题】:Inject Map without any @IntoMap bindings在没有任何 @IntoMap 绑定的情况下注入 Map
【发布时间】:2022-09-28 04:29:40
【问题描述】:

我正在使用 Dagger 将 Map<Int,Handler> 注入到一个类中。当在模块中定义这样的东西时,它可以完美地工作:

@Binds
@IntoMap
@IntKey(FOO_KEY)
Handler bindFooHandler(FooHandler handler);

如果不存在此类方法,则项目无法构建,因为它不知道要注入的Map<Integer,Handler>。当不存在@IntoMap 绑定时,有什么方法可以使Map<Integer,Handler> 可注入?

  • 在这种情况下你想注入什么,一个空的地图?
  • 理想情况下,是的。但它也可能为 null 或 Optional。我知道有一个@BindsOptionalOf 注释,但我不完全确定它是如何工作的,也找不到任何将它与多重绑定一起使用的示例。

标签: dagger-2


【解决方案1】:

Dagger 文档站点的Declaring Multibindings 区域对此进行了描述。强调我的:

对于具有至少一个 @IntoSet@ElementsIntoSet@IntoMap 绑定的集合或映射,您不必使用 @Multibinds,但是如果它们可能是空的,你必须声明它们.

这将进入您的@Module,它必然是一个接口或抽象类:@Multibinds 不能有一个实现。对于您的情况,您会看到:

@Multibinds abstract Map<Integer, Handler> bindEmptyMap();

不必担心该绑定出现在图表中的多个位置。就像在@Multibinds 文档中一样,也强调我的:

给定的集合或映射多重绑定可以被声明任意次数而不会出错。Dagger 从不实现或调用任何 @Multibinds 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 2021-11-18
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 2022-12-25
    • 2018-06-10
    相关资源
    最近更新 更多