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

MR3*_*3YY 3 kotlin reactive-streams kotlin-flow

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

@Query("SELECT * from some_model ORDER BY some_field")
fun getData(): Flow<List<some_model>>
Run Code Online (Sandbox Code Playgroud)

据我所知,Flow 就像一种“异步序列”,所以我真的不明白“Flow<List<T>>”的含义。

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

Nic*_*las 6

当我开始使用Flow.

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

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

dao.getData().collect { list ->
    Log.d(TAG, list.joinToString())
}
Run Code Online (Sandbox Code Playgroud)

然后您更改数据库:

dao.insert(...)
dao.insert(...)
Run Code Online (Sandbox Code Playgroud)

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

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