У меня есть класс 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 я выбираю microbes из класса firebase:
fun fetchMicrobes(owner: ViewModelStoreOwner){
val firebase = FirebaseMicrobes()
firebase.fetchMicrobes(owner)
}
fun setMicrobes(microbeMaps: List<Map<String, Any>>){
_microbes.value = microbeMaps
}
В классе firebase я извлекаю микробы и вызываю setMicrobes из viewModel:
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) {
}
})
}
Это правильный способ сделать это? Мне нужно создать экземпляр viewModel в классе firebase, поэтому я передаю «this» во фрагменте при вызове метода viewModel, поэтому метод viewModel может передать владельца классу firebase, поэтому класс firebase может создать экземпляр viewModel .