max*_*oin 6 android kotlin kotlin-flow
与 LiveData 类似,如何在协程之外获取 Flow 的值?
// Suspend function 'first' should be called only from a coroutine or another suspend function
flowOf(1).first()
Run Code Online (Sandbox Code Playgroud)
// value is null
flowOf(1).asLiveData().value
Run Code Online (Sandbox Code Playgroud)
// works
MutableLiveData(1).value
Run Code Online (Sandbox Code Playgroud)
语境
我避免LiveData在存储库层中使用Flow. 然而,我需要设置、观察和收集立即消费的价值。后者对于 OkHttp3 中的身份验证很有用Interceptor。
你可以这样做
val flowValue: SomeType
runBlocking(Dispatchers.IO) {
flowValue = myFlow.first()
}
Run Code Online (Sandbox Code Playgroud)
是的,它并不完全是 Flow 的用途。
但是并不总是可以使所有内容都异步,就此而言,甚至可能无法“仅创建同步方法”。例如,当前的 Datastore 版本(应该替换 Android 上的共享首选项)只公开 Flow 而没有其他内容。这意味着您将很容易陷入这种情况,因为活动或片段的生命周期方法都不是协程。
如果您可以提供帮助,您应该始终从挂起函数调用协程并避免进行runBlocking调用。很多时候它是这样工作的。但这并不是一直有效的万无一失的方式。您可以使用 引入死锁runBlocking。
嗯......你正在寻找的并不是真正的Flow目的。Flow只是一个流。它不是价值持有者,因此您无需检索任何内容。
因此,根据拦截器的需要,有两条主要途径可以走下去。
也许您的拦截器可以在没有存储库数据的情况下生存。IOW,如果数据存在,您将使用它,否则拦截器可以继续。在这种情况下,您可以让您的存储库发出一个流,但也可以维护您的拦截器可以使用的“当前值”缓存。那可能是通过:
BroadcastChannelLiveDataval但是,如果您的拦截器需要数据,那么这些都不会直接工作,因为null如果数据尚未准备好,它们都会导致拦截器获取。您需要的是一个可以阻塞的调用,但如果数据通过某种形式的缓存准备就绪,可能会快速评估。根据存储库的实现以及首先提供的内容,其细节会有很大差异Flow。
| 归档时间: |
|
| 查看次数: |
6831 次 |
| 最近记录: |