Android:Firebase ViewModel 架构
Android: Firebase ViewModel Architecture
我有 viewModel class、firebase class 和一个片段。
在我从 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 class 我正在从 firebase 获取微生物 class:
fun fetchMicrobes(owner: ViewModelStoreOwner){
val firebase = FirebaseMicrobes()
firebase.fetchMicrobes(owner)
}
fun setMicrobes(microbeMaps: List<Map<String, Any>>){
_microbes.value = microbeMaps
}
在 firebase 中 class 我正在获取微生物并从 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 class 中创建一个 viewModel 实例,所以我在调用 viewModel 的方法时在片段中传递 "this",这样 viewModel 的方法就可以将所有者传递给 firebase class,因此 firebase class 可以创建 viewModel 实例。
传递所有者不是一个好的选择,您应该在 ypur firebase class 中定义一个实时数据,同时从 viewmodel 获取数据'fetchMicrobe() 开始观察从 Firebase class 传递的实时数据,当收到响应时,post 数据到实时数据,并且由于您已经在视图模型 class 中观察到此实时数据,请在此处设置您的列表。因此,无需通过您的所有者,您就可以获取数据,您的代码将被解耦,将遵循最佳实践并有助于测试您的代码。
我有 viewModel class、firebase class 和一个片段。
在我从 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 class 我正在从 firebase 获取微生物 class:
fun fetchMicrobes(owner: ViewModelStoreOwner){
val firebase = FirebaseMicrobes()
firebase.fetchMicrobes(owner)
}
fun setMicrobes(microbeMaps: List<Map<String, Any>>){
_microbes.value = microbeMaps
}
在 firebase 中 class 我正在获取微生物并从 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 class 中创建一个 viewModel 实例,所以我在调用 viewModel 的方法时在片段中传递 "this",这样 viewModel 的方法就可以将所有者传递给 firebase class,因此 firebase class 可以创建 viewModel 实例。
传递所有者不是一个好的选择,您应该在 ypur firebase class 中定义一个实时数据,同时从 viewmodel 获取数据'fetchMicrobe() 开始观察从 Firebase class 传递的实时数据,当收到响应时,post 数据到实时数据,并且由于您已经在视图模型 class 中观察到此实时数据,请在此处设置您的列表。因此,无需通过您的所有者,您就可以获取数据,您的代码将被解耦,将遵循最佳实践并有助于测试您的代码。