問題タブ [kotlin-flow]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
kotlin - Kotlin Flow: テストがハングする
フローを使用して Kotlin の実装をテストしようとしています。テストには Kotest を使用します。このコードは機能します:
ビューモデル:
テスト:
ただし、実際の ViewModel ではフローに値を追加する必要があるため、次のように使用ConflatedBroadcastChannel
します。
次に、テストで次のことを試みます。
テストがハングするだけで、完了しません。私はあらゆる種類のことを試しました:launch
またはrunBlockingTest
の代わりにrunBlocking
、送信と収集を同じまたは別のコルーチンに入れます...offer
の代わりにsend
...何も修正していないようです。私は何を間違っていますか?
更新: フローを手動で作成すると動作します:
それで、それはasFlow()
メソッドのバグですか?
android - Terminal operator が実行される前に kotlin フローを最後まで待機させる方法
上記は私のコードの簡略版です。
私がやりたいことは、doWork()
すべての値が発行されるまで待機し、最後にProcessStatus.SUCCESS
またはに基づいてブール値を返すことProcessStatus.FAILURE
です。
現在、上記のコードで起こっていることは、processWork()
がフローを返すとすぐです。doWork()
and 以降を含むすべての演算子を呼び出しますがsingle()
、作業はまだ進行中です ProcessStatus.FAILURE または ProcessStatus.SUCCESS がまだ発行されていないため、例外が発生します。
doWork()
return ステートメントを待機させ、フローが完了したときにのみ返すにはどうすればよいですか?
編集1:
理由は、これは Android コードの一部であり、channel.offer()
実際には上記の例のような新しいコルーチンではなく、 Android から呼び出されているためBroadcastReceiver
です。
フローはコールドであるため、ユーザーがアクティビティを離れて、タスクの完了と通知が停止されることを望んでいませんでした。