Android: Firebase ViewModel Architecture - PullRequest
       65

Android: Firebase ViewModel Architecture

0 голосов
/ 13 апреля 2020

У меня есть класс 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 .

1 Ответ

1 голос
/ 13 апреля 2020

Передача владельца не будет хорошим вариантом, вместо этого вы должны определить жилые данные в классе Firebase ypur, при этом выборка данных из viewmodel 'fetchMicrobe () начнет наблюдать за живыми данными, переданными из класса Firebase, когда ответ получен, отправьте данные в liveata, и так как вы уже наблюдаете эти данные в классе viewmodel, установите здесь свой список. Таким образом, не передавая своего владельца, вы сможете получать данные, ваш код будет отделен, будет следовать рекомендациям и будет полезен при тестировании вашего кода.

...