gpt4 book ai didi

android - 在 Repository 和 ViewModel 之间共享相同的 MutableLiveData

转载 作者:太空宇宙 更新时间:2023-11-03 13:41:38 25 4
gpt4 key购买 nike

我正在全神贯注于架构组件/MVVM。

假设我有一个存储库、一个 ViewModel 和一个 Fragment。我使用 Resource 类作为包装器来公开网络状态,如 Guide to architecture components 中所建议的那样.

我的存储库目前看起来像这样(为简洁起见进行了简化):

class MyRepository {

fun getLists(organizationId: String) {
var data = MutableLiveData<Resource<List<Something>>>()
data.value = Resource.loading()

ApolloClient().query(query)
.enqueue(object : ApolloCall.Callback<Data>() {
override fun onResponse(response: Response<Data>) {
response.data()?.let {
data.postValue(Resource.success(it))
}
}

override fun onFailure(exception: ApolloException) {
data.postValue(Resource.exception(exception))
}
})
}

然后在 ViewModel 中,我还声明了一个 MutableLiveData:

var myLiveData = MutableLiveData<Resource<List<Something>>>()

fun getLists(organizationId: String, forceRefresh: Boolean = false) {
myLiveData = myRepository.getLists(organizationId)
}

最后, fragment :

viewModel.getLists.observe(this, Observer {
it?.let {
if (it.status.isLoading()) showLoading() else hideLoading()

if (it.status == Status.SUCCESS) {
it.data?.let {
adapter.replaceData(it)
setupViews()
}
}

if (it.status == Status.ERROR) {
// Show error
}
}
})

如您所见,观察者未被触发会出现问题,因为 LiveData 变量将在此过程中重置(存储库创建一个新实例)。

我正在尝试找出确保在 Repository 和 ViewModel 之间使用相同 LiveData 变量的最佳方法。

我想过将 LiveData 从 ViewModel 传递到 getLists 方法,这样 Repository 就会使用 ViewModel 中的对象,但即使它有效,这样做似乎也是错误的。

我的意思是这样的:

View 模型

var myLiveData = MutableLiveData<Resource<List<Something>>>()

fun getLists(organizationId: String, forceRefresh: Boolean = false) {
myRepository.getLists(myLiveData, organizationId)
}

存储库

fun getLists(data: MutableLiveData<Resource<List<Something>>>, organizationId: String) {
...
}

最佳答案

感谢@NSimon 的提示,我想我知道怎么做了。

我的存储库保持不变,我的 ViewModel 看起来像这样:

class MyViewModel : ViewModel() {
private val myRepository = MyRepository()

private val organizationIdLiveData = MutableLiveData<String>()
private val lists = Transformations.switchMap(organizationIdLiveData) { organizationId -> myRepository.getLists(organizationId) }

fun getLists() : LiveData<Resource<MutableList<Something>>> {
return lists
}

fun fetchLists(organizationId: String, forceRefresh: Boolean = false) {
if (organizationIdLiveData.value == null || forceRefresh) {
organizationIdLiveData.value = organizationId
}
}
}

我观察 fragment 中的 getLists(),并在需要数据时调用 viewModel.fetchLists(id)。看起来合法吗?

关于android - 在 Repository 和 ViewModel 之间共享相同的 MutableLiveData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50910549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com