【问题标题】:Dagger/MissingBinding cannot be provided without an @Provides-annotated method没有 @Provides 注释的方法不能提供 Dagger/MissingBinding
【发布时间】:2019-07-07 14:39:30
【问题描述】:

从 dagger2 2.16 版本构建到 2.23.2 版本时出现异常。 它在 2.16 中启动并运行。我没有修改任何代码。升级到 2.23.2 后,构建失败。 不知道是什么问题,所以请大家帮忙。 谢谢。

模块

@Module
public class BaseModule {

    private ConfigBuilder configBuilder;

    public BaseModule(@Nullable ConfigBuilder configBuilder) {
        this.configBuilder = configBuilder;
    }

    @Singleton
    @Provides
    public Gson provideGson() {
        GsonBuilder builder = new GsonBuilder();
        if (configBuilder != null) {
            configBuilder.buildGson(builder);
        }
        return builder.create();
    }

    @Singleton
    @Provides
    public OkHttpClient provideOkHttpClient() {
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        if (configBuilder != null) {
            configBuilder.buildOkHttp(builder);
        }
        builder.addInterceptor(new EncryptInterceptor());
        if (BuildConfig.DEBUG) {
            HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
            loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
            builder.addInterceptor(loggingInterceptor);
        }
        return builder.build();
    }

    @Singleton
    @Provides
    public Retrofit provideRetrofit(OkHttpClient okHttpClient, Gson gson) {
        Retrofit.Builder builder = new Retrofit.Builder()
                .client(okHttpClient);
        if (configBuilder != null) {
            configBuilder.buildRetrofit(builder);
        }
        builder.addConverterFactory(GsonWrapperConverterFactory.create(gson))
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create());
        return builder.build();
    }

    @Singleton
    @Provides
    public SharedPreferencesPlus provideSharedPreferencesPlus(Application application, Gson gson) {
        return SharedPreferencesPlus.createDefault(application, gson);
    }
@Module
interface ActivityModule {

    @ActivityScope
    @ContributesAndroidInjector
    MainActivity main();
@Module
public interface ViewModelModule {

    @Binds
    @IntoMap
    @ViewModelKey(VMMain.class)
    ViewModel main(VMMain vm);

组件

@Singleton
@Component(modules = {BaseModule.class, AndroidSupportInjectionModule.class})
public interface BaseComponent {

    Application provideApplication();

    SharedPreferencesPlus provideSharedPreferencesPlus();

    Gson provideGson();

    OkHttpClient provideOkHttpClient();

    Retrofit provideRetrofit();

    @Component.Builder
    interface Builder {

        @BindsInstance
        Builder application(Application application);

        Builder AppModule(BaseModule baseModule);

        BaseComponent build();
    }
@ApplicationScope
@Component(modules = {
        ActivityModule.class,
        ViewModelModule.class,
        DataModule.class}, dependencies = BaseComponent.class)
public interface AppComponent
{
    void inject(AppContext application);
}

例外: [Dagger/MissingBinding] java.util.Map>> 不能在没有@Provides-annotated 方法的情况下提供。

java.util.Map>> 在 dagger.android.DispatchingAndroidInjector(..., injectorFactoriesWithStringKeys) 处注入

dagger.android.DispatchingAndroidInjector 被注入到 org.pp.va.video.app.AppContext.serviceInjector

org.pp.va.video.app.AppContext 被注入到 org.pp.va.video.di.AppComponent.inject(org.pp.va.video.app.AppContext)

也要求: dagger.android.DispatchingAndroidInjector(…, injectorFactoriesWithStringKeys)

【问题讨论】:

    标签: android dagger-2 dagger


    【解决方案1】:

    发现从2.16开始到2.17开始出现问题。 我观察到错误是因为在 AppComponent 中引入了 AndroidSupportInjectionModule。我曾经在BaseComponent中引入AndroidSupportInjectionModule,然后是AppComponent所依赖的BaseComponent。现在它行不通了。我从BaseComponent中去掉了AndroidSupportInjectionModule的引入,在AppComponent中引入了AndroidSupportInjectionModule,解决了我的问题。

    我目前的代码如下:

    @ApplicationScope
    @Component(modules = {
            ActivityModule.class,
            ViewModelModule.class,
            DataModule.class, AndroidSupportInjectionModule.class}, dependencies = BaseComponent.class)
    public interface AppComponent
    
    @Singleton
    @Component(modules = {BaseModule.class})
    public interface BaseComponent {
    

    【讨论】:

      猜你喜欢
      • 2020-05-16
      • 2021-06-30
      • 1970-01-01
      • 2019-09-04
      • 1970-01-01
      • 2019-11-06
      • 2021-05-05
      • 2021-06-11
      • 1970-01-01
      相关资源
      最近更新 更多