如何根据文档使用 Dagger 2 多重绑定提供提供程序



参考 https://dagger.dev/multibindings.html,它被声明

如果你想要一个提供程序的映射,Map.Entry 对象在你的 多绑定集应包括提供程序。然后你的非多绑定 映射可以具有提供程序值。

我尝试下面的代码。

@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 ...;
}
}

相关内容

  • 没有找到相关文章

最新更新