Reputation: 60261
In reference to https://dagger.dev/multibindings.html, It is stated
If you want a map of providers, the Map.Entry objects in your multibound set should include the providers. Then your non-multibound map can have Provider values.
I try out the below code.
@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 ...;
}
}
It errors stating
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()
The reason is because it doesn't know how to generate Provider<Bar> barProvider
. So I write the below
@Provides
static Provider<Bar> barProvider() {
Provider<Bar> provider = new Provider<Bar>() {
@Override
public Bar get() {
return Bar.create("1");
}
};
return provider;
}
It error out error: @Provides methods must not return framework types
How could I get the multibinding example works?
Upvotes: 1
Views: 1190
Reputation: 60261
Apparently when we provide a Class Object, it could also provide the Provider.
@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 ...;
}
}
Upvotes: 1