在科特林处理对方付款的正确方式是什么? [英] What is the correct way of handling collect in Kotlin?

查看:23
本文介绍了在科特林处理对方付款的正确方式是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用MVVM从FiRestore获取用户数据。在我使用的存储库类中:

fun getUserData() = flow {
    auth.currentUser?.apply {
        val user = ref.document(uid).get().await().toObject(User::class.java)
        user?.let {
            emit(Success(user))
        }
    }
}. catch { error ->
    error.message?.let { message ->
        emit(Failure(message))
    }
}

此方法从ViewModel类调用:

fun getUser() = repo.getUserData()

在我使用的Activity类中:

private fun getUser() {
    lifecycleScope.launch {
        viewModel.getUser().collect { data ->
            when(data) {
                is Success -> textView.text = data.user.name
                is Failure -> print(data.message)
            }
        }
    }
}

在TextView中显示名称。代码运行良好。但这是正确的做事方式吗?还是在ViewModel类中收集数据更正确?

还有改进的余地吗?谢谢

推荐答案

我的个人意见是,应该在VM中收集数据,以便它在配置更改后仍然有效。

视图(活动/片段)的作用域不应驱动数据流。

在配置更改期间,VM的生存时间将超过活动和碎片,因此您收集和转换的所有数据仍在那里(如果仍在获取,则仍在进行中)。

StateFlow是好的(在最后一步),因为它能够告诉VM:这不再需要,不要浪费资源。

但我还没有在生产代码中使用StateFlow,所以就是这样。

这篇关于在科特林处理对方付款的正确方式是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆