【问题标题】:Android: Firebase ViewModel ArchitectureAndroid:Firebase ViewModel 架构
【发布时间】:2020-04-13 18:31:08
【问题描述】:

我有 viewModel 类、firebase 类和一个片段。

在我从 viewModel 观察微生物列表的片段中:

        viewModel = ViewModelProvider(this).get(ViewModelMicrobes::class.java)
    viewModel.microbes.observe(viewLifecycleOwner, Observer { microbes ->
        var microbesList = mutableListOf<Microbe>()
        for(microbeMap in microbes){
            val microbe = Microbe(microbeMap["name"] as String)
            microbesList.add(microbe)
        }
        adapter.microbes = microbesList
    })

    viewModel.fetchMicrobes(this)

在 viewModel 类中,我从 firebase 类中获取微生物:

    fun fetchMicrobes(owner: ViewModelStoreOwner){
    val firebase = FirebaseMicrobes()
    firebase.fetchMicrobes(owner)
}

fun setMicrobes(microbeMaps: List<Map<String, Any>>){
    _microbes.value = microbeMaps
}

在 firebase 类中,我正在获取微生物并从 viewModel 调用 setMicrobes:

    fun fetchMicrobes(owner: ViewModelStoreOwner){
    val database = Firebase.database
    val microbesRef = database.getReference("microbes")
    microbesRef.addValueEventListener(object: ValueEventListener{
        override fun onDataChange(snapshot: DataSnapshot) {
            val children = snapshot.children
            val viewModel = ViewModelProvider(owner).get(ViewModelMicrobes::class.java)
            var microbes = mutableListOf<HashMap<String, Any>>()
             for(child in children){
                 microbes.add(child.value as HashMap<String, Any>)
             }
            viewModel.setMicrobes(microbes)
        }

        override fun onCancelled(p0: DatabaseError) {

        }
    })
}

这是正确的方法吗?我需要在firebase类中创建一个viewModel实例,所以我在调用viewModel的方法时在片段中传递了“this”,这样viewModel的方法就可以将所有者传递给firebase类,所以firebase类可以创建viewModel实例.

【问题讨论】:

  • “我需要在 firebase 类中创建一个 viewModel 实例” - 你根本不需要这样做。如果您的“firebase 类”旨在用作 MVVM 中的存储库,则它不应与 ViewModel 对象一起使用,或接收任何 Android 平台对象(如所有者)。您的存储库应该公开类似 LiveData 或 Observable 的内容。
  • 谢谢,我明白你在说什么。将firebase网络调用放在viewModel中是一个好习惯吗?而不是创建两个类。
  • 没有。与数据源的迭代只能在存储库中完成。视图模型向存储库询问获取数据,然后将其转换为所需的任何视图。如果您还没有,您应该查看此文档。 developer.android.com/jetpack/docs/guide#recommended-app-arch
  • 感谢您阐明了 Firebase repo 类的目的。我希望我能接受你的回答,但已经有一个了。

标签: android firebase android-architecture-components


【解决方案1】:

传递所有者不是一个好的选择,相反,您应该在 ypur firebase 类中定义一个 livedata,同时从 viewmodel 的 fetchMicrobe() 获取数据开始观察从 Firebase 类传递的 Livedata,当收到响应时,将数据发布到 livedata,并且由于您已经在 viewmodel 类中观察到此 livedata,因此请在此处设置您的列表。因此,无需传递您的所有者,您将能够获取数据,您的代码将被解耦,将遵循最佳实践并有助于测试您的代码。

【讨论】:

  • 谢谢,把firebase fetch方法放在viewModel里面不是更简单吗?我认为我不需要 firebase 类。
  • 如果你想遵循正确的 MVVM,那么你应该有 Firebase 类,它作为存储库工作,并且是一个完全独立的组件,其唯一职责只是带来数据,这对你也有帮助在测试时,在测试期间传递模拟数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-12
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多