【发布时间】: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