【问题标题】:Flow<List<T>> instead of using Flow<T>?Flow<List<T>> 而不是使用 Flow<T>?
【发布时间】:2020-07-19 16:57:27
【问题描述】:

我注意到很多人和例子都使用 Flows 作为 List 的包装器,例如这样:

@Query("SELECT * from some_model ORDER BY some_field")
fun getData(): Flow<List<some_model>>

据我所知,Flow 是一种“异步序列”,所以我真的没有理解“Flow>”的含义。

为什么我们不能直接使用 Flow 这对我来说似乎很直观,我问这个问题是因为我在代码 sn-ps 中看到了多次重复并且无法理解其背后的目的??

【问题讨论】:

    标签: kotlin reactive-streams kotlin-flow


    【解决方案1】:

    这也是我在开始使用Flow 时问自己的问题。

    您可能会认为将Flow 与 Room 一起使用会首先从查询中获取部分数据,从而使从数据库中获取的数据通过流可用。这将有效地使用像Flow&lt;T&gt; 这样的东西。然而,这不是这里的想法,这更多的是你可以通过Paging 获得的。

    相反,当您调用getData() 时,您会得到一个Flow&lt;List&lt;T&gt;&gt;,它会在每次查询结果发生变化时发出一个全新的列表以及一个初始值。 SELECT 语句总是生成带有 Room 的列表,而不是单个值。因此,假设您在一个地方收集流量:

    dao.getData().collect { list ->
        Log.d(TAG, list.joinToString())
    }
    

    然后你更改数据库:

    dao.insert(...)
    dao.insert(...)
    

    将写入 3 条日志消息,一条用于初始值,两条用于后续更改。起初这可能看起来非常低效(这就是为什么我一开始并没有真正理解它的原因),但实际上在大多数设备上性能影响可以忽略不计,即使有数千行也是如此。当与ListAdapter 和 DiffUtil 结合使用时,它可以非常干净地实现列表。

    我希望这能回答你的问题。

    【讨论】:

    • 非常简洁的解释!!这就是我真正想要的。非常感谢:)
    猜你喜欢
    • 2021-12-29
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多