【发布时间】:2020-04-13 20:56:57
【问题描述】:
如何在协程之外获取 Flow 的值,类似于 LiveData?
// Suspend function 'first' should be called only from a coroutine or another suspend function
flowOf(1).first()
// value is null
flowOf(1).asLiveData().value
// works
MutableLiveData(1).value
上下文
我在存储库层中避免使用LiveData,而使用Flow。然而,我需要设置、观察和收集立即消费的价值。后者可用于 OkHttp3 Interceptor 中的身份验证。
【问题讨论】:
-
asLiveData创建一个 LiveData,它启动自己的协程以从 Flow 中收集值。在上面的示例中,value的初始值将是null,因为协程还没有机会启动。 -
Flow 的重点是使用它来获取太耗时而无法同步执行的数据,因此如果没有协程,您永远不会希望从中获取值。
-
@Tenfour04 确实为空。正如 CommonsWare 在许多答案中指出的那样,我没有从存储库层公开 LiveData。但我需要可观察性。
-
没有“流的价值”。
LiveData是一个价值持有者,因此它在任何时间点都有一个价值(或null)。Flow只是一个流。BroadcastChannel是具有可观察性的价值持有者的协程等价物,尽管它仍被标记为实验性 API IIRC。 -
如果您的拦截器可以处理
null,您可以使用LiveData或BroadcastChannel,或者只是让存储库保留最后收到的值的缓存并通过单独的函数返回它。如果你的拦截器无法处理null,那么你需要向你的拦截器可以使用的存储库添加一个单独的阻塞API,或者尝试使用first()在runBlocking()中使用Flow来强制同步行为。跨度>
标签: android kotlin kotlin-flow