我的问题是:我正在尝试声明具有以下签名的多重绑定:Map<Class<out Fragment>, @JvmSuppressWildcards Provider<Fragment>>
。当合并范围模块中有一个IntoMap
时,multibind会按预期工作。但是,根据作用域的不同,此映射可能为空,也可能不会为空,因此,我明确声明如下所示的@Multibinds
来支持空映射,如文档所示:
@Module
abstract class FragmentModule {
@Multibinds
abstract fun fragmentProviderMap():
Map<Class<out Fragment>, @JvmSuppressWildcards Provider<Fragment>>
}
但是,此代码会产生以下错误消息:
错误:@Multibinds方法必须返回Map或Set
调查Dagger 2的源代码,我发现这是一个建议:
@Test
public void providerMap() {
assertThatModuleMethod("@Multibinds abstract Map<String, Provider<Object>> providerMap();")
.withDeclaration(moduleDeclaration)
.hasError("@Multibinds methods must return Map<K, V> or Set<T>");
}
供参考,您可以找到此代码here。
我有两个疑问:
如果Dagger 2支持使用多重绑定提供Provider<*>
的“非空”映射,那么为什么不允许具有相同签名的空映射是什么原因?
是否有任何方法可以绕过此限制并支持Provider<*>
的空白映射?这将为我节省很多样板和不必要的@Inject
重复。
谢谢您的关注。
从单个映射多绑定定义中,Dagger可以同时注入Map<K, V>
和Map<K, Provider<V>>
(相当于Kotlin)。