java - 如何根据文档使用 Dagger 2 Multibinding 提供提供程序
问题描述
参考https://dagger.dev/multibindings.html,说明
如果您需要提供者的映射,则多绑定集中的 Map.Entry 对象应包括提供者。然后,您的非多重地图可以具有 Provider 值。
我试试下面的代码。
@Module
class MyModule {
@Provides @IntoSet
static Map.Entry<Foo, Provider<Bar>> entry(
Provider<Bar> barProvider) {
Foo key = ...;
return new SimpleImmutableEntry(key, barProvider);
}
}
@Module
class MyProviderMapModule {
@Provides
static Map<Foo, Provider<Bar>> fooBarProviderMap(
Set<Map.Entry<Foo, Provider<Bar>>> entries) {
return ...;
}
}
它错误说明
error: [Dagger/MissingBinding] Bar cannot be provided without an @Provides-annotated method.
javax.inject.Provider<Bar> is injected at MyModule.entry(barProvider)
java.util.Set<java.util.Map.Entry<Foo,Provider<Bar>>> is injected at MyModule.fooBarProviderMap(entries) java.util.Map<Foo,.Provider<Bar>> is provided at MyComponent.myMapFooProviderBar()
原因是它不知道如何生成Provider<Bar> barProvider
. 所以我写下面
@Provides
static Provider<Bar> barProvider() {
Provider<Bar> provider = new Provider<Bar>() {
@Override
public Bar get() {
return Bar.create("1");
}
};
return provider;
}
它出错了error: @Provides methods must not return framework types
我怎样才能让多重绑定示例有效?
解决方案
显然,当我们提供一个类对象时,它也可以提供提供者。
@Provides
static Bar provideBar() {
return Bar.create("xxx");
}
@Module
class MyModule {
@Provides @IntoSet
static Map.Entry<Foo, Provider<Bar>> entry(
Provider<Bar> barProvider) {
Foo key = ...;
return new SimpleImmutableEntry(key, barProvider);
}
}
@Module
class MyProviderMapModule {
@Provides
static Map<Foo, Provider<Bar>> fooBarProviderMap(
Set<Map.Entry<Foo, Provider<Bar>>> entries) {
return ...;
}
}
推荐阅读
- c++ - 如何将文本文件中的数据读取到结构的 int 数组中?
- javascript - python javascript IBMCloud remake Watson-voice-bot for Japanese
- php - 如何使用 AWS SDK 将文件直接上传到 AWS S3?
- reactjs - 性能观察者不适用于反应路线变化
- javascript - 在响应中单击 div 后如何禁用单击事件?
- if-statement - C 时计算 X 的数组公式
- assembly - 为什么从 gdb 中的反汇编得到的偏移量在十六进制编辑器中显示超出范围错误?
- java - 在 STS 中更改静态 HTML 文件时,我应该如何自动更新 Maven 项目
- haskell - 对于 haskell 堆栈,我无法安装 Spock
- scala - 在scala中配对类型参数和参数子类型参数