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