Я пытаюсь перенести свой проект на Dagger Hilt
, но у меня возникла проблема с отсутствующей привязкой. Я следил за codelab Google, чтобы добиться этого. .
Это место, где сборка не удалась:
error: [Dagger/MissingBinding] java.util.Map<java.lang.String,javax.inject.Provider<dagger.android.AndroidInjector.Factory<?>>> cannot be provided without an @Provides-annotated method.
public abstract static class ApplicationC implements WhatToCookApp_GeneratedInjector,
^
java.util.Map<java.lang.String,javax.inject.Provider<dagger.android.AndroidInjector.Factory<?>>> is injected at
dagger.android.DispatchingAndroidInjector(�, injectorFactoriesWithStringKeys)
dagger.android.DispatchingAndroidInjector<java.lang.Object> is injected at
dagger.android.support.DaggerAppCompatActivity.androidInjector
at.bwappsandmore.whattocook.MainActivity is injected at
dagger.android.AndroidInjector.inject(T) [at.bwappsandmore.whattocook.WhatToCookApp_HiltComponents.ApplicationC ? at.bwappsandmore.whattocook.di.ActivityModule_InjectMainActivity.MainActivitySubcomponent]
It is also requested at:
dagger.android.DispatchingAndroidInjector(�, injectorFactoriesWithStringKeys)
The following other entry points also depend on it:
Это соответствующие части проекта:
@HiltAndroidApp
open class WhatToCookApp : Application() {
val appComponent: AppComponent by lazy {
initializeComponent()
}
open fun initializeComponent(): AppComponent {
return DaggerAppComponent.factory().create(applicationContext)
}
}
Компонент приложения:
@Singleton
@Component(
modules = [AppModule::class,
ActivityModule::class,
AndroidSupportInjectionModule::class]
)
interface AppComponent : AndroidInjector<WhatToCookApp> {
@Component.Factory
interface Factory {
fun create(@BindsInstance appContext: Context): AppComponent
}
}
AppModule:
@InstallIn(ApplicationComponent::class)
@Module
class AppModule {
@Provides
fun provideDB(@ApplicationContext context: Context): AppDatabase {
return AppDatabase.getDatabase(context)
}
@Provides
fun provideDAO(app: AppDatabase): WhatToCookDao {
return app.whatToCookDao()
}
@Provides
fun provideAppRepository(dao: WhatToCookDao): AppRepository{
return AppRepository(dao)
}
@Provides
fun provideSharedPreferences(@ApplicationContext context: Context): SharedPreferences {
return PreferenceManager.getDefaultSharedPreferences(context)
}
}
ApplicationModulde:
@InstallIn(ApplicationComponent::class)
@Module
interface ActivityModule {
@ActivityScope
@ContributesAndroidInjector(modules = [ViewModelModule::class])
fun injectMainActivity(): MainActivity
}
ViewModelModule:
@InstallIn(ApplicationComponent::class)
@Module
abstract class ViewModelModule {
companion object{
@Provides
fun providesSharedViewModel (activity: MainActivity) : SharedViewModel = activity.viewModel
}
}
Область действия:
@Scope
@Retention(AnnotationRetention.RUNTIME)
annotation class ActivityScope
Я понимаю, что мне нужно использовать аннотацию @Provides
для AndroidInjector
, но я не знаю, где и как. Любая помощь приветствуется.
Огромное спасибо заранее.
hilt
, вы можете (или действительно должны) удалить многое из того, что есть в ваших примерах кода. Вы пытаетесь сочетатьdagger.android
сhilt
, но это не выход. В качестве первого шага удалите все, что связано сdagger.android
(AndroidInjector
и прочее ...). - person Bartek Lipinski   schedule 23.08.2020Hilt
? Мне действительно любопытно узнать, что мне не хватает. Большое спасибо. Ваше здоровье. - person BWappsandmore   schedule 29.12.2020