首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓: Firebase ViewModel架构

安卓: Firebase ViewModel架构
EN

Stack Overflow用户
提问于 2020-04-14 02:31:09
回答 1查看 1.6K关注 0票数 2

我有viewModel类、firebase类和一个片段。

在片段中,我观察到了来自viewModel的微生物列表:

代码语言:javascript
复制
        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类中获取微生物:

代码语言:javascript
复制
    fun fetchMicrobes(owner: ViewModelStoreOwner){
    val firebase = FirebaseMicrobes()
    firebase.fetchMicrobes(owner)
}

fun setMicrobes(microbeMaps: List<Map<String, Any>>){
    _microbes.value = microbeMaps
}

在firebase类中,我从viewModel中获取微生物并调用setMicrobes:

代码语言:javascript
复制
    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实例了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-14 02:45:07

传递owner不是一个好的选择,相反,你应该在ypur firebase类中定义一个livedata,同时从viewmodel的fetchMicrobe()开始观察从Firebase类传递的livedata,当接收到响应时,将数据发布到livedata,当你已经在viewmodel类中观察到这个Livedata时,在这里设置你的列表。因此,在不经过你的所有者的情况下,你将能够获取数据,你的代码将被解耦,将遵循最佳实践,并将有助于测试你的代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61194295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档