【发布时间】:2021-11-01 17:38:15
【问题描述】:
我正在尝试在 Kotlin 中更新 Flow 的源代码,但我不确定这是否是正确的方法,以及 Flow 是否可行。
我有一个包含用户帖子的数据库,这会返回一个Flow<List<Post>>。
现在,当我选择另一个用户时,我希望数据库流向我返回新选择的用户的帖子:
lateinit var userPosts: Flow<List<Post>>
private set
fun getPostsForUser(user: User) {
userPosts = database.getAllPostsForUser(user)
}
但流程永远不会使用新选择的用户的数据进行更新。在这种情况下,Flow 仍然是正确的选择吗?如果是,我如何使用新帖子更新流程?
我知道如何手动从数据库中获取数据并使用 LiveData 发出它,但我想避免在每次用户发布新内容或删除帖子时处理帖子更新。
【问题讨论】:
-
我有点不确定你在最后一句话中描述了什么。你能详细说明吗?我认为 Flow 和 LiveData 具有相同的行为,因为每次 Room 数据库更改时都会更新,但使用 Flow,您可以使用
distinctUntilChanged()或 StateFlow 来避免这种情况。 -
因为当我在房间数据库上运行的查询发生更改时,Flow 会自动发出值,例如删除或添加用户的帖子,我不必手动检查这些更改.到目前为止,我正在为我的数据库查询使用挂起函数并发布值,然后使用实时数据,因为我只需要当前数据的快照。
-
如果您在发出请求时只想要快照,那么挂起函数是正确的方法。 Flow 在行为上类似于 LiveData,就触发更新而言,尽管您可以更轻松地过滤结果。
标签: kotlin android-room