在 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
所以就是这样。
我正在使用 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
所以就是这样。