Search code examples
androiddagger-2dagger

Dagger/MissingBinding cannot be provided without an @Provides-annotated method


I am getting an exception when building from the dagger2 2.16 version to the 2.23.2 version. It is up and running in 2.16. I didn't modify any code. After upgrading to 2.23.2, it failed to build. I am not sure what the problem is, so I ask everyone for assistance. Thank you.

Module

@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);

Component

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

exception: [Dagger/MissingBinding] java.util.Map>> cannot be provided without an @Provides-annotated method.

java.util.Map>> is injected at dagger.android.DispatchingAndroidInjector(…, injectorFactoriesWithStringKeys)

dagger.android.DispatchingAndroidInjector is injected at org.pp.va.video.app.AppContext.serviceInjector

org.pp.va.video.app.AppContext is injected at org.pp.va.video.di.AppComponent.inject(org.pp.va.video.app.AppContext)

It is also requested at: dagger.android.DispatchingAndroidInjector(…, injectorFactoriesWithStringKeys)


Solution

  • I found that starting from 2.16 to 2.17 began to have problems. I observed the error because of the introduction of AndroidSupportInjectionModule in AppComponent. I used to introduce the AndroidSupportInjectionModule in BaseComponent, and then the BaseComponent that AppComponent dependency on. Now it won't work. I removed the introduction of AndroidSupportInjectionModule from BaseComponent and introduced AndroidSupportInjectionModule in AppComponent, which solved my problem.

    My current code is as follows:

    @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 {