我有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实例了。
发布于 2020-04-14 02:45:07
传递owner不是一个好的选择,相反,你应该在ypur firebase类中定义一个livedata,同时从viewmodel的fetchMicrobe()开始观察从Firebase类传递的livedata,当接收到响应时,将数据发布到livedata,当你已经在viewmodel类中观察到这个Livedata时,在这里设置你的列表。因此,在不经过你的所有者的情况下,你将能够获取数据,你的代码将被解耦,将遵循最佳实践,并将有助于测试你的代码。
https://stackoverflow.com/questions/61194295
复制相似问题