Flow<List<T>> 而不是使用 Flow<T>?

Flow<List<T>> instead of using Flow<T>?

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

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

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

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

这是我开始使用 Flow 时问自己的同一个问题。

您可能认为,将 Flow 与 Room 一起使用会首先从查询中提取部分数据,从而使数据在从数据库中获取的数据流中可用。这将有效地使用类似 Flow<T> 的东西。然而,这不是这里的想法,这更多是你可以用 Paging.

得到的东西

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

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

然后您更改数据库:

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

将写入 3 条日志消息,一条用于初始值,两条用于后续所做的更改。起初这可能看起来效率很低(这就是为什么我一开始并没有真正理解它),但实际上对大多数设备的性能影响可以忽略不计,即使有数千行。当与 ListAdapter 和 DiffUtil.

结合使用时,它允许非常干净地实现列表

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