問題タブ [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.

0 投票する
1 に答える
2232 参照

kotlin - Kotlin Flow: テストがハングする

フローを使用して Kotlin の実装をテストしようとしています。テストには Kotest を使用します。このコードは機能します:

ビューモデル:

テスト:

ただし、実際の ViewModel ではフローに値を追加する必要があるため、次のように使用ConflatedBroadcastChannelします。

次に、テストで次のことを試みます。

テストがハングするだけで、完了しません。私はあらゆる種類のことを試しました:launchまたはrunBlockingTestの代わりにrunBlocking、送信と収集を同じまたは別のコルーチンに入れます...offerの代わりにsend...何も修正していないようです。私は何を間違っていますか?

更新: フローを手動で作成すると動作します:

それで、それはasFlow()メソッドのバグですか?

0 投票する
1 に答える
2720 参照

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です。

フローはコールドであるため、ユーザーがアクティビティを離れて、タスクの完了と通知が停止されることを望んでいませんでした。