Как предоставить провайдерам использование Dagger 2 Multibinding согласно документации - PullRequest
0 голосов
/ 10 октября 2019

В отношении 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

Как я могу получить пример мультисвязывания?

1 Ответ

0 голосов
/ 10 октября 2019

Очевидно, что когда мы предоставляем объект класса, он также может предоставлять поставщика.

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