Необходим доступ к классам репозитория Ливедата из классов Viewmodel - PullRequest
0 голосов
/ 05 ноября 2019

Я реализовал 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 или любого другого метода для доступа ко всем классам репозитория из моделей представления без предоставления их отдельно.

Нужна помощь ...

...