【问题标题】:How to provide Providers using Dagger 2 Multibinding as per the documentation如何根据文档使用 Dagger 2 Multibinding 提供提供程序
【发布时间】:2020-02-07 19:24:11
【问题描述】:

参考https://dagger.dev/multibindings.html,说明

如果你想要一个提供者的地图,你的 Map.Entry 对象 多绑定集应包括提供者。然后你的非多重绑定 map 可以有 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&lt;Bar&gt; 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

我怎样才能让多重绑定示例工作?

【问题讨论】:

    标签: java dagger-2 provider


    【解决方案1】:

    显然当我们提供一个Class Object时,它也可以提供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 ...;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-12
      • 1970-01-01
      • 2019-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多