Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

rememberUpdatedState の使いどころを考える

akkiee76
November 12, 2023

rememberUpdatedState の使いどころを考える

「potatotips #85 iOS/Android開発Tips共有会」で発表したスライドになります。
https://potatotips.connpass.com/event/299247/

akkiee76

November 12, 2023
Tweet

More Decks by akkiee76

Other Decks in Technology

Transcript

  1. Compose 可能な関数の範囲外で発生するアプリの状態の変化 • 予想しない再コンポジション • 異なる順序でのコンポーザブルの再コンポジション • 破棄可能な再コンポジション Compose における

    Side effect(副作用)とは? コンポーザブルは Side effect がないようにするのが理想的 https://developer.android.com/jetpack/compose/side-effects
  2. • スナックバーを表示する • 1 回限りのイベントをトリガーする • 特定の状態で別の画面に遷移する Side effect が必要なケース

    https://developer.android.com/jetpack/compose/side-effects 予測可能な方法で Side effect を実行する必要がある
  3. var currentTime by remember { mutableStateOf(Date().time.toString()) } Button( onClick =

    { currentTime = Date().time.toString() } ) { Text(currentTime) } SnackbarScreen ( currentTime = currentTime, snackbarHostState = snackbarHostState ) 時刻を保持 時刻を更新 時刻を渡す
  4. @Composable fun SnackbarScreen( currentTime: String, snackbarHostState: SnackbarHostState ) { LaunchedEffect(Unit)

    { delay(3000) snackbarHostState.showSnackbar(message = currentTime) } } 一度だけ実行
  5. @Composable fun SnackbarScreen( currentTime: String, snackbarHostState: SnackbarHostState ) { LaunchedEffect(currentTime)

    { delay(3000) snackbarHostState.showSnackbar(message = currentTime) } } 何も表示されない LaunchedEffect が再起動し Coroutine がキャンセル currentTimeが更新され続ける
  6. @Composable fun SnackbarScreen ( currentTime: String, snackbarHostState : SnackbarHostState )

    { val rememberTime by rememberUpdatedState (newValue = currentTime) LaunchedEffect (Unit) { delay(3000) snackbarHostState .showSnackbar( message = rememberTime) } } 最新の値が表示 値が変化しても LaunchedEffect の Coroutine はキャンセルされない currentTimeが更新され続ける
  7. @Composable fun <T> rememberUpdatedState(newValue: T): State<T> = remember { mutableStateOf(newValue)

    }.apply { value = newValue } オブジェクトをキャプチャーし、中身を更新している
  8. まとめ rememberUpdatedState API の使いどころ • Coroutine の処理をキャンセルさせたくないケース ◦ 重い通信処理(ファイルダウンロード)など •

    コールバックを利用するケース ◦ エラーハンドリングなど • 異なる Composable などで変更される値を参照するケース