提供带有匕首2的提供者的空映射的@Multibiding

问题描述 投票:1回答:1

我的问题是:我正在尝试声明具有以下签名的多重绑定: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

我有两个疑问:

  1. 如果Dagger 2支持使用多重绑定提供Provider<*>的“非空”映射,那么为什么不允许具有相同签名的空映射是什么原因?

  2. 是否有任何方法可以绕过此限制并支持Provider<*>的空白映射?这将为我节省很多样板和不必要的@Inject重复。

谢谢您的关注。

android kotlin dagger-2 android-architecture-components
1个回答
0
投票

从单个映射多绑定定义中,Dagger可以同时注入Map<K, V>Map<K, Provider<V>>(相当于Kotlin)。

© www.soinside.com 2019 - 2024. All rights reserved.