rememberCoroutineScopeの役割を理解する
目次
rememberCoroutineScopeとは
そのComposableにひも付いたコルーチンスコープを覚えておくことが可能。
なぜこれが必要になるのかというと、Composeは再コンポーズする度に値がリセットされるため、remeberなCoroutineScopeでないと再コンポーズの度にコルーチンスコープが作成されてしまいます。
その結果、スコープの寿命がUIと一致せずにメモリリークなどが起きる可能性が出てきます。
rememberCoroutineScopeはComposableがCompositionに存在している間だけ有効なCoroutineScopeを提供するので、そのComposableが破棄されるとスコープも自動でキャンセルされるため安全です。
そもそもComposable内でコルーチンスコープを利用する場合とは?
ComposableではUIイベントを受け取る存在で、ボタンが押される、アニメーションが始まる、APIを叩くなどが行われる。そのため時間を扱うにはコルーチンが必要となる。
viewModel側で切り替えることもできるが、viewModel側はあくまで指示を出す側なのでUIの詳細な情報を知ることができない。
例えばdelayはsuspend関数なので遅延させる場合はrememberCoroutineScopeを利用して処理の停止を可能にすることができる。
なぜComposable内でいきなりCoroutineScopeが作れるのか?
結論としてはComposeがすでに親のCoroutineContextを持っているためです。
AI先生「Composeは内部で「Recomposer」という存在が動いている。
Recomposerはコルーチン上で動いている」
つまり、Composition自体がすでにコルーチン世界の中にいるということです。そのため現在のCompositionのCoroutineContextを取得し、そこに子Jobを持つScopeを作る形となります。
そしてlaunchするだけで新たな子Jobとして処理が実行可能になります。
これが構造化並行性(Structured Concurrency)と呼ばれる思想!!