LiveData と同様に、コルーチンの外部で Flow の値を取得するにはどうすればよいですか?
// 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
。
ベストアンサー1
あなたはこれを行うことができます
val flowValue: SomeType
runBlocking(Dispatchers.IO) {
flowValue = myFlow.first()
}
はい、それはまさに Flow が作られた目的ではありません。
しかし、すべてを非同期にすることは必ずしも可能ではありませんし、さらに言えば、「同期メソッドを作成する」ことも必ずしも可能ではないかもしれません。たとえば、現在のデータストア リリース (Android の共有設定を置き換えることになっている) は、Flow のみを公開し、他には何も公開しません。つまり、アクティビティやフラグメントのライフサイクル メソッドはどれもコルーチンではないため、このような状況に陥るのは非常に簡単です。
可能であれば、コルーチンは常に中断関数から呼び出し、runBlocking
呼び出しを避ける必要があります。多くの場合、このように動作します。ただし、常に動作する確実な方法ではありません。デッドロックが発生する可能性がありますrunBlocking
。