Вставить контекст активности в неактивный класс - PullRequest
0 голосов
/ 10 января 2020

В моем приложении у меня есть два действия и много фрагментов. Одно действие отвечает за показ фрагментов 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...