dagger.internal.codegen.ComponentProcessor не удалось обработать этот интерфейс, поскольку не все его зависимости могут быть разрешены - PullRequest
0 голосов
/ 16 февраля 2020

Я пытался настроить кинжал в многомодульном проекте. Моя установка следующая:

@Singleton
@Component(modules = [AndroidSupportInjectionModule::class, NetworkModule::class, MovieListActivityModule::class, DetailActivityModule::class])
interface AppComponent {

    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(application: Application): Builder

        fun build(): AppComponent
    }

    fun inject(app: MoviesApplication)
}

@Module
class NetworkModule { .... }

@Module
abstract class MovieListActivityModule {
    @ContributesAndroidInjector(modules = [ListFragmentModule::class, ListNetworkModule::class, ListViewModelsModule::class])
    abstract fun bindMovieListActivity(): MovieListActivity
    }

@Module
abstract class ListFragmentModule {

    @ContributesAndroidInjector
    abstract fun bindListFragment(): ListFragment
}

@Module
public class ListNetworkModule {

    @Provides
    SearchService providesSearchService(Retrofit retrofit) {
        return retrofit.create(SearchService.class);
    }
}

@Module
abstract class ListViewModelsModule {

    @Binds
    abstract fun bindDaggerViewModelFactory(daggerViewModelFactory: DaggerViewModelFactory): ViewModelProvider.Factory

    @Binds
    @IntoMap
    @ViewModelKey(ListViewModel::class)
    abstract fun bindListViewModel(listViewModel: ListViewModel): ViewModel
}

@Module
abstract class DetailActivityModule {
    @ContributesAndroidInjector(modules = [DetailViewModelsModule::class, DetailNetworkModule::class, DbModule::class])
    abstract fun bindDetailActivity(): DetailActivity
}

@Module
abstract class DetailViewModelsModule {

    @Binds
    abstract fun bindDaggerViewModelFactory(daggerViewModelFactory: DaggerViewModelFactory): ViewModelProvider.Factory

    @Binds
    @IntoMap
    @ViewModelKey(DetailsViewModel::class)
    abstract fun bindDetailViewModel(detailsViewModel: DetailsViewModel): ViewModel
}

@Module
public class DetailNetworkModule {

    @Provides
    DetailService providesDetailService(Retrofit retrofit) {
        return retrofit.create(DetailService.class);
    }
}

@Module
class DbModule {
    @Provides
    fun providesFavouriteMovieDb(application: Application): FavMovieDb = FavMovieDb.getDatabase(application)
}

class DaggerViewModelFactory @Inject constructor(
        private val creators: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>)
    : ViewModelProvider.Factory {.........}

@Target(AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME)
@MapKey
annotation class ViewModelKey(val value: KClass<out ViewModel>)

class App : Application(), HasActivityInjector {
    @Inject
    lateinit var dispatchingActivityInjector: DispatchingAndroidInjector<Activity>

    override fun onCreate() {
        super.onCreate()
        DaggerAppComponent.builder()
                .application(this)
                .build()
                .inject(this)
    }

    override fun activityInjector(): DispatchingAndroidInjector<Activity>? = dispatchingActivityInjector
}

До этого кода все было в порядке и работает отлично. Но проблема появляется, когда я добавляю новый FavouriteActivityModule в AppComponent. Как показано ниже:

@Module
abstract class FavouriteViewModelModule {

    @Binds
    abstract fun bindDaggerViewModelFactory(daggerViewModelFactory: DaggerViewModelFactory): ViewModelProvider.Factory

    @Binds
    @IntoMap
    @ViewModelKey(FavouriteViewModel::class)
    abstract fun bindFavouriteViewModel(viewModel: FavouriteViewModel): ViewModel
}

@Module
abstract class FavouriteActivityModule {
    @ContributesAndroidInjector(modules = [FavouriteViewModelModule::class, DbModule::class])
    abstract fun bindFavouriteActivity(): FavoriteActivity
}

Final AppComponent выглядит следующим образом (добавлено FavouriteActivityModule::class):

@Singleton
@Component(modules = [AndroidSupportInjectionModule::class, NetworkModule::class, MovieListActivityModule::class, DetailActivityModule::class, FavouriteActivityModule::class])
interface AppComponent {

    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(application: Application): Builder

        fun build(): AppComponent
    }

    fun inject(app: MoviesApplication)
}

После добавления FavouriteActivityModule::class кинжал больше не строит и не жалуется, как показано ниже:

e: /Users/...../di/AppComponent.java:8: error: [ComponentProcessor:MiscError] dagger.internal.codegen.ComponentProcessor was unable to process this interface because not all of its dependencies could be resolved. Check for compilation errors or a circular dependency with generated code.
public abstract interface AppComponent {
            ^

Я еще не выяснил причину и уже потратил целый день на выяснение причины этой ошибки. Любая помощь? TIA

...