Android / Kotlin / Programming

Calls to launch should happen inside a LaunchedEffectの対処法

対処法

LaunchedEffectでエラーが表示されているlaunch {}を囲めば解決です

LaunchedEffect(
    key1 = null // 適宜変更
) {
    scope.launch {
        // 実行したい処理
    }
}

原因

エラー本文

Inspection info: Creating a coroutine with async or launch during composition is often incorrect – this means that a coroutine will be created even if the composition fails / is rolled back, and it also means that multiple coroutines could end up mutating the same state, causing inconsistent results.
Instead, use LaunchedEffect and create coroutines inside the suspending block. The block will only run after a successful composition, and will cancel existing coroutines when key changes, allowing correct cleanup.

コンポジション(@Composeが付いた関数)の中でasyncなコルーチンを作成する、もしくはlaunch関数を呼び出すと、コンポジションが失敗したりロールバックされてもコルーチンが作成されます
これは意図せず複数のコルーチンが作成され、値の変更を複数回行う可能性があり、実行するたびに結果が変わる一貫性のない動作になってしまいます
これを避けるためにLaunchedEffect関数のラムダでコルーチンを作成します
ラムダはコンポーズの完了後に実行され、キーの変更によりラムダの実行はキャンセルされるため正しいクリーンアップが行われます

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です