在 Kotlin 中处理 collect 的正确方法是什么?

What is the correct way of handling collect in Kotlin?

我正在使用 MVVM 从 Firestore 获取用户数据。在存储库 class 中,我使用:

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 调用的 class:

fun getUser() = repo.getUserData()

并且在 activity class 中我使用:

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 中收集数据更正确 class?

还有改进的余地吗?谢谢

我个人的意见是应该在 VM 中收集数据,这样它就可以在配置更改后继续存在。

视图范围 (activity/fragment) 不应驱动您的数据流。

在配置更改期间,VM 将比活动和片段更有效,因此您收集和转换的所有数据仍将存在(如果仍在获取,则正在进行中)。

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

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