需要从viewmodel类访问livedata存储库类

时间:2019-11-05 14:16:53

标签: android generics kotlin dagger-2 android-livedata

我已经在一个Android项目中实现了Dagger 2,改造,rxjava,LiveData和数据绑定。已经连接了所有东西,但问题是视图模型类之间的连接出现了问题,这些视图模型类又调用了相应存储库类中的某些函数。

使用匕首将存储库基类注入到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)
}
}

基本Viewmodel:

open class BaseVM : ViewModel() {
@Inject
protected lateinit var baseRepo: BaseRepo

private val injector: ViewModelComponent = DaggerViewModelComponent
    .builder()
    .viewModelModule(ViewModelModule())
    .build()

init {
    injector.inject(this)
}
}

基本Viewmodel模块

@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泛型或任何其他方法从视图模型访问所有存储库类而不用单独提供它们。

需要帮助...

0 个答案:

没有答案