【发布时间】: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