Dagger/MissingBinding 不能在没有@Provides 注释的方法的情况下提供
Dagger/MissingBinding cannot be provided without an @Provides-annotated method
从 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 注释方法,则无法提供。
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)
我发现从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 {
从 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 注释方法,则无法提供。
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)
我发现从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 {