コルーチン外でフローの値を取得するにはどうすればいいですか? 質問する

コルーチン外でフローの値を取得するにはどうすればいいですか? 質問する

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

おすすめ記事