当前位置: 首页 > 知识库问答 >
问题:

在存储库和ViewModel之间共享相同的可变LiveData

伯俊弼
2023-03-14

我正在思考架构组件/MVVM。

假设我有一个存储库、一个ViewModel和一个片段。我使用资源类作为包装器来公开网络状态,就像体系结构组件指南中建议的那样。

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

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中,我还声明了一个可变LiveData:

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

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

最后,片段:

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变量将在过程中重置(存储库将创建一个新实例),因此不会触发观察者会出现问题。

我试图找出最好的方法,以确保相同的LiveData变量之间使用存储库和ViewModel。

我考虑过将LiveData从ViewModel传递到getLists方法,这样存储库就会使用ViewModel中的对象,但即使它可以工作,这样做似乎也是错误的。

我的意思是:

视图模型

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) {
    ...
}

共有1个答案

司马腾
2023-03-14

多亏了@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
    }
  }
}

我观察片段中的getlist(),并调用viewModel。获取列表(id)当我需要数据时。看起来合法吗?

 类似资料:
  • 问题内容: 我正在评估Kubernetes作为我们新应用程序的平台。现在,一切看起来都非常令人兴奋!但是,我遇到了一个问题:我将群集托管在GCE上,并且需要某种机制在两个Pod之间共享存储(连续集成服务器和应用程序服务器)。用kubernetes做到这一点的最佳方法是什么?这些卷类型似乎都不符合我的需求,因为如果一个Pod需要写入GCE磁盘,则无法共享。NFS是完美的,但似乎需要为kubernet

  • 我有一个人[]有三个人(p1,p2,p3)。Person类有两个属性name和email。 我使用了以下代码。 但我不想这样用。我想使用两个组合框与相同的型号。我尝试使用DefaultComboBoxModel并重写getElementAt()方法,如下所示。 } 问题是如何使用相同的ComboBoxModel在一个JComboBox中添加Person[]的所有名称,并在另一个JComboBox中

  • 我正在评估Kubernetes作为我们新应用程序的平台。现在看来,这一切都非常令人兴奋!但是,我遇到了一个问题:我在GCE上托管集群,需要某种机制在两个POD(持续集成服务器和应用服务器)之间共享存储。对库伯内特斯来说,最好的方法是什么?所有的卷类型似乎都不适合我的需要,因为如果一个pod需要写入磁盘,GCE磁盘就不能共享。NFS将是完美的,但似乎需要kubernetes集群的特殊构建选项? 编辑

  • 本文向大家介绍静态库和共享库之间的区别,包括了静态库和共享库之间的区别的使用技巧和注意事项,需要的朋友参考一下 在编程上下文库中是一种具有某种代码的东西,这些代码已经过预编译,可以在任何程序中重新使用以实现某些特定功能或特性。 现在,根据该代码库的执行和存储,将其分为两种类型,即静态库和共享库。 以下是静态库和共享库之间的重要区别。 序号 要点 静态库 共享库 1 定义 静态库是一个库,其中执行文

  • 问题内容: 我想在Linux中的多个独立C可执行文件之间共享一个变量。也就是说,一个程序将在数组上写入并设置一个标志,以便其他程序无法使用它,并且在执行此操作后,它将取消设置标志,然后另一个程序将读取该数组。我尝试在每个程序中使用相同的自定义头文件(包含变量),但是似乎在调用程序时会创建变量的不同实例。 问题答案: 您在标头中声明的变量将在包含它们的任何地方生成一个副本(除非您声明了它们)。当然,

  • 问题内容: 我有一个下载器功能,可以并行下载多个文件。我使用以便下载同一文件的不同块。我想显示下载的状态栏。为此,我需要知道已经下载的总字节数()。 是否有一种方法可以设置将在所有这些进程和主进程之间共享的变量,以便每个进程都可以追加刚刚下载的字节数? 问题答案: 解决方案是利用新进程并传递共享的ctypes值: