Open LeoAndo opened 2 years ago
スナックバーを表示するなどの 1 回限りのイベントをトリガーする場合や、特定の状態で別の画面に移動する場合などに、副作用(side-effects)が必要になることがあります。
コンポーザブル内から suspend 関数を安全に呼び出すには、LaunchedEffectコンポーザブルを使用します。 LaunchedEffect は、いずれかのキーパラメータが変化すると、再起動されます。(blockの中の処理が走る)
コンポーザブルの外部でコルーチンを起動するために、Composition から退場すると自動的にキャンセルされるスコープを設定するには、rememberCoroutineScope を使用します。
値が変化しても再起動されない作用の値をキャプチャしたい場合に利用する。 具体的にはスプラッシュ画面などに利用される。
https://github.com/LeoAndo/development-conference-memo/issues/396 https://developer.android.com/codelabs/jetpack-compose-advanced-state-side-effects?hl=ja#4 副作用の進行中に onTimeout が変更された場合、作用が終了したときに最後の onTimeout が呼び出されるという保証はありません。最後の onTimeout が呼び出されることを保証するには、rememberUpdatedState API を使用して onTimeout を記憶します。この API は、最新の値をキャプチャして更新します。
キーが変化した後またはコンポーザブルが Composition から退場したときにクリーンアップする必要がある副作用については、DisposableEffect を使用します。 イベント登録/解除系はDisposableEffectを使うイメージ??
Compose が管理していないオブジェクトと Compose の状態を共有するには、再コンポジションが成功するたびに呼び出される SideEffect コンポーザブルを使用します。
produceState は、Composition をスコープとするコルーチンを起動します。これにより、返される State に値をプッシュできます。これを使用して、Compose 外の状態を Compose の状態に変換できます。
usecase: https://developer.android.com/codelabs/jetpack-compose-advanced-state-side-effects?hl=ja#8 のように、リストをスクロールして最初の要素が画面から消えた後、スクロール中に「最初へ移動」ボタンを常に表示させる
特定の状態が他の状態オブジェクトから計算(導出)される場合は、derivedStateOf を使用します。この関数を使用すると、計算で使用される状態のいずれかが変化したときにのみ計算が行われることが保証されます。
Compose の State を Flow に変換するためのもの
State
参考: https://zenn.dev/kaleidot725/articles/2022-02-26-jc-snapshot-flow
https://developer.android.com/jetpack/compose/side-effects https://developer.android.com/codelabs/jetpack-compose-advanced-state-side-effects?hl=ja#0