【问题标题】:What is the correct way of handling collect in Kotlin?在 Kotlin 中处理收集的正确方法是什么?
【发布时间】:2021-10-30 15:42: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()

在我使用的活动类中:

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

还有改进的余地吗?谢谢

【问题讨论】:

  • 首先这不应该是一个流,因为你只检索一个东西。它应该是一个暂停函数,它返回那个东西。
  • @Tenfour04 好点。假设我正在监听实时变化并使用流程。在 Activity 或 ViewModel 中收集数据是否有意义?
  • 我来自其他问题。我会在 VM 中收集数据,因此收集的数据在配置更改后仍然存在。视图(活动)的范围不应驱动所有数据流。虚拟机应该,因为它有能力活得更久。 StateFlow 很好(在最后一步),因为它有能力告诉 VM,我们不再需要它,所以不要浪费资源。
  • @MartinMarconcini 谢谢马丁。你能写出答案吗?

标签: firebase kotlin google-cloud-firestore kotlin-coroutines kotlin-flow


【解决方案1】:

我个人的看法是,数据应该在 VM 中收集,这样它才能在配置更改后继续存在。

视图的范围(活动/片段)不应驱动您的数据流。

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

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

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

【讨论】:

    猜你喜欢
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 2020-12-02
    • 2020-09-23
    • 2012-03-29
    • 2021-12-16
    相关资源
    最近更新 更多