Dagger / MissingBinding не может быть предоставлен без аннотируемого метода @ Provides - PullRequest
1 голос
/ 07 июля 2019

Я получаю исключение при сборке с версии 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)

1 Ответ

0 голосов
/ 08 июля 2019

Я обнаружил, что начиная с 2.16 до 2.17 стали возникать проблемы. Я обнаружил ошибку из-за введения AndroidSupportInjectionModule в AppComponent. Я использовал для представления AndroidSupportInjectionModule в BaseComponent, а затем BaseComponent, от которого зависит AppComponent. Теперь это не сработает. Я удалил введение AndroidSupportInjectionModule из BaseComponent и ввел AndroidSupportInjectionModule в AppComponent, что решило мою проблему.

Мой текущий код выглядит следующим образом:

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