В моем приложении у меня есть два действия и много фрагментов. Одно действие отвечает за показ фрагментов spla sh, регистрации и входа в систему, в то время как другое действие используется для основных функций приложений. Я использую кинжал 2.23.2 и kotlin 1.3.41 в своем приложении и следую шаблону MVVM. Я хочу внедрить свой контекст активности в класс репозитория, чтобы я мог выполнять несколько задач пользовательского интерфейса оттуда, например, показывать snakbar вместо какого-либо обратного вызова к фрагменту. Вот как я делаю внедрение зависимостей
Класс компонента приложения
@Singleton
@Component(
modules = [
UserInformationModule::class,
AndroidInjectionModule::class,
AppModule::class,
MainActivityModule::class,
ServiceBuilderModule::class]
)
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
fun build(): AppComponent
}
fun inject(application: BaseClass)
}
Это класс AppModule
@Module(includes = [ViewModelModule::class, CoreDataModule::class])
class AppModule {
@Singleton
@Provides
fun provideMyMyAppService(
@MyAppAPI okHttpClient: OkHttpClient,
converterFactory: MoshiConverterFactory
) = provideService(okHttpClient, converterFactory, MyMyAppApi::class.java)
@MyAppAPI
@Provides
fun providePrivateOkHttpClient(
upstreamClient: OkHttpClient
): OkHttpClient {
return upstreamClient.newBuilder().build()
}
@Singleton
@Provides
fun provideRemoteDataSource(myMyAppService: MyMyAppApi) = RemoteDataSource(myMyAppService)
@Singleton
@Provides
fun provideDb(app: Application) = AppDatabase.getInstance(app)
//other code
}
Это модуль построителя фрагментов
@Suppress("unused")
@Module
abstract class FragmentBuildersModule {
@ContributesAndroidInjector
abstract fun homeFragment(): HomeFragment
@ContributesAndroidInjector
abstract fun fragHome(): FragHome
//other code
}
Это мой главный Модуль активности
@Suppress("unused")
@Module
abstract class MainActivityModule {
@ContributesAndroidInjector(modules = [FragmentBuildersModule::class])
abstract fun contributeMainActivity(): HomeActivity
@ContributesAndroidInjector(modules = [FragmentBuildersModule::class])
abstract fun contributeSplashActivity(): SplashActivity
}
Это мой модуль ViewModel
@Suppress("unused")
@Module
abstract class ViewModelModule {
@Binds
@IntoMap
@ViewModelKey(HomeViewModel::class)
abstract fun bindHomeViewModel(viewModel: HomeViewModel): ViewModel
///other code
}
Это класс репозитория, в который я хочу добавить контекст активности
@Singleton
class HomeRepository @Inject
constructor(
private val daoHome: DaoHome,
private val remoteDataSource: RemoteDataSource,
private val request: String,
private val daoBundles: DaoBundles,
private val activity: HomeActivity // compilation error if I add this line
) {
// code here
}
Вот StackTrace
e: H:\AndroidStudio\MyApp\app\build\tmp\kapt3\stubs\devDebug\com\app\MyApp\injection\AppComponent.java:8: error: [Dagger/MissingBinding] com.app.MyApp.HomeActivity cannot be provided without an @Inject constructor or an @Provides-annotated method. This type supports members injection but cannot be implicitly provided.
public abstract interface AppComponent {
^
A binding with matching key exists in component: com.app.MyApp.injection.MainActivityModule_ContributeMainActivity.HomeActivitySubcomponent
com.app.MyApp.HomeActivity is injected at
com.app.MyApp.service.repository.HomeRepository(…, activity)
com.app.MyApp.service.repository.HomeRepository is injected at
com.app.MyApp.viewmodel.FragUsageViewModel(repo, …)
com.app.MyApp.viewmodel.FragUsageViewModel is injected at
com.app.MyApp.injection.ViewModelModule.bindUsageViewModel(viewModel)
java.util.Map<java.lang.Class<? extends androidx.lifecycle.ViewModel>,javax.inject.Provider<androidx.lifecycle.ViewModel>> is injected at
com.app.MyApp.injection.ViewModelFactory(creators)
com.app.MyApp.injection.ViewModelFactory is injected at
com.app.MyApp.injection.ViewModelModule.bindViewModelFactory(factory)
androidx.lifecycle.ViewModelProvider.Factory is injected at
com.app.MyApp.view.ui.HomeFragment.viewModelFactory
com.app.MyApp.view.ui.HomeFragment is injected at
dagger.android.AndroidInjector.inject(T) [com.app.MyApp.injection.AppComponent ? com.app.MyApp.injection.MainActivityModule_ContributeMainActivity.HomeActivitySubcomponent ? com.app.MyApp.injection.FragmentBuildersModule_HomeFragment.HomeFragmentSubcomponent]
The following other entry points also depend on it:
dagger.android.AndroidInjector.inject(T) [com.app.MyApp.injection.AppComponent ? com.app.MyApp.injection.MainActivityModule_ContributeMainActivity.HomeActivitySubcomponent ? com.app.MyApp.injection.FragmentBuildersModule_FragHome.FragHomeSubcomponent]
dagger.android.AndroidInjector.inject(T) [com.app.MyApp.injection.AppComponent ? com.app.MyApp.injection.MainActivityModule_ContributeMainActivity.HomeActivitySubcomponent ? com.app.MyApp.injection.FragmentBuildersModule_FragUsage.FragUsageSubcomponent]
dagger.android.AndroidInjector.inject(T) [com.app.MyApp.injection.AppComponent ? com.app.MyApp.injection.MainActivityModule_ContributeMainActivity.HomeActivitySubcomponent ? com.app.MyApp.injection.FragmentBuildersModule_FragFindUs.FragFindUsSubcomponent]
dagger.android.AndroidInjector.inject(T) [com.app.MyApp.injection.AppComponent ? com.app.MyApp.injection.MainActivityModule_ContributeMainActivity.HomeActivitySubcomponent ? com.app.MyApp.injection.FragmentBuildersModule_FragTuts.FragVideoTutSubcomponent]
dagger.android.AndroidInjector.inject(T) [com.app.MyApp.injection.AppComponent ? com.app.MyApp.injection.MainActivityModule_ContributeMainActivity.HomeActivitySubcomponent ? com.app.MyApp.injection.FragmentBuildersModule_FragB.FragBundlesSubcomponent]
dagger.android.AndroidInjector.inject(T) [com.app.MyApp.injection.AppComponent ? com.app.MyApp.injection.MainActivityModule_ContributeMainActivity.HomeActivitySubcomponent ? com.app.MyApp.injection.FragmentBuildersModule_FragFaq.FragFaqCategoriesSubcomponent]
dagger.android.AndroidInjector.inject(T) [com.app.MyApp.injection.AppComponent ? com.app.MyApp.injection.MainActivityModule_ContributeMainActivity.HomeActivitySubcomponent ? com.app.MyApp.injection.FragmentBuildersModule_FragPackages.FragPackagesSubcomponent]
dagger.android.AndroidInjector.inject(T) [com.app.MyApp.injection.AppComponent ? com.app.MyApp.injection.MainActivityModule_ContributeMainActivity.HomeActivitySubcomponent ? com.app.MyApp.injection.FragmentBuildersModule_Fraga.FragaeSubcomponent]
dagger.android.AndroidInjector.inject(T) [com.app.MyApp.injection.AppComponent ? com.app.MyApp.injection.MainActivityModule_ContributeMainActivity.HomeActivitySubcomponent ? com.app.MyApp.injection.FragmentBuildersModule_FragIr.FragbSubcomponent]
dagger.android.AndroidInjector.inject(T) [com.app.MyApp.injection.AppComponent ? com.app.MyApp.injection.MainActivityModule_ContributeMainActivity.HomeActivitySubcomponent ? com.app.MyApp.injection.FragmentBuildersModule_Fragc.FragInternetSubcomponent]
and 27 others