Обеспечить @Multibiding пустой карты провайдеров с Dagger 2 - PullRequest
1 голос
/ 02 мая 2020

Моя проблема: я пытаюсь объявить мультибинд со следующей подписью: Map<Class<out Fragment>, @JvmSuppressWildcards Provider<Fragment>>. Multibind работает, как и ожидалось, когда у меня есть IntoMap внутри моих модулей области видимости. Однако эта карта может быть или не быть пустой в зависимости от области действия, и по этой причине я явно объявляю @Multibinds, как показано ниже, для поддержки пустых карт в соответствии с документацией:

@Module
abstract class FragmentModule {

    @Multibinds
    abstract fun fragmentProviderMap(): 
        Map<Class<out Fragment>, @JvmSuppressWildcards Provider<Fragment>>
}

Однако, этот код выдает следующее сообщение об ошибке:

error: методы @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>");
}

Для справочных целей вы можете найти этот код здесь .

У меня есть два сомнения:

  1. Если Dagger 2 поддерживает предоставление «непустых» карт Provider<*> с использованием мультибинд, что может быть причиной, по которой нельзя разрешать пустая карта с такой же подписью?

  2. Есть ли способ обойти это ограничение и поддержать пустые карты Provider<*>? Это спасло бы меня от большого количества шаблонного и ненужного повторения @Inject.

Спасибо за ваше внимание.

1 Ответ

0 голосов
/ 07 мая 2020

Из определения мультибиндирования одной карты Dagger может ввести оба (Kotlin эквивалента) Map<K, V> и Map<K, Provider<V>>.

Возможно, вы просто ищете

@Multibinds
abstract fun fragmentProviderMap(): 
    Map<Class<out Fragment>, @JvmSuppressWildcards Fragment>

?

См. «Связывание карт» и «Объявление мультипривязок» в Мультибиндинги кинжалов .

...