Я реализовал Dagger 2, модификацию, rxjava, LiveData и привязку данных в одном проекте Android. Связали все, но проблема возникает со связью между классами viewmodel, которые, в свою очередь, вызывают определенные функции в соответствующих классах репозитория.
Базовый класс репозитория вводится в базовый класс viewmodel с использованием кинжала, но проблема заключается в том, что всеПредполагается, что репозитории подключаются к соответствующим моделям просмотра. Например: все сетевые вызовы из viewmodel входа в систему определены в репозитории входа в систему, и все репозитории выполняют сетевой вызов с помощью модифицированного модуля, введенного в базовый репозиторий.
Это базовый репозиторий:
open class BaseRepo {
@Inject
protected lateinit var apiCall: APICall
lateinit var subscription: Disposable
val compositeDisposable = CompositeDisposable()
private val injector: RetrofitComponent = DaggerRetrofitComponent
.builder()
.retrofitModule(RetrofitModule())
.build()
init {
injector.inject(this)
}
}
Базовая модель представления:
open class BaseVM : ViewModel() {
@Inject
protected lateinit var baseRepo: BaseRepo
private val injector: ViewModelComponent = DaggerViewModelComponent
.builder()
.viewModelModule(ViewModelModule())
.build()
init {
injector.inject(this)
}
}
Базовый модуль модели представления
@Provides
@ViewModelScope
fun provideRepo(): BaseRepo {
return BaseRepo()
}
Хранилище входа:
class LoginRepoImpl: BaseRepo(), LoginRepo {
override fun performLogin2(value: LoginRequest, usersResponse: MutableLiveData<ApiResponse<UserResponse>>) {
subscription = apiCall.performLogin("", value)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe { usersResponse.value = ApiResponse.createLoadingResponse() }
.subscribe(
{ result -> usersResponse.value = result },
{ error -> usersResponse.value = ApiResponse.Companion.create(error) }
)
compositeDisposable.add(subscription)
}
}
И, наконец, модель просмотра входа в систему:
init {
val loginRepo = LoginRepoImpl()// This should be injected
userRequest = MutableLiveData()
loginRepo.performLogin2(userRequest.value!!, usersResponse)
usersLD = Transformations.switchMap(loadData) {
switchMaporLoginResponse(usersResponse,
doOnSuccess = {
showLoader.value = View.GONE
return@switchMaporLoginResponse it
},
doOnSubscribe = {
showLoader.value = View.VISIBLE
},
doOnError = {
showLoader.value = View.GONE
})
}
}
Я знаю, если я предоставлю все репозитории отдельно от класса модуля, он должен работать, но возможно ли это каким-либо образом с использованием обобщенных шаблонов kotlin или любого другого метода для доступа ко всем классам репозитория из моделей представления без предоставления их отдельно.
Нужна помощь ...