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

イベントをどう管理するか

mikan
December 06, 2024

 イベントをどう管理するか

【祝!50回】Shibuya.apk #50
https://shibuya-apk.connpass.com/event/336398/

mikan

December 06, 2024
Tweet

More Decks by mikan

Other Decks in Technology

Transcript

  1. 自己紹介 object Mikan { val name = 一瀬喜弘 val from

    = 長崎 val company = カラビナテクノロジー株式会社 val work = Engineer.Android val volunteer = DroidKaigi val hobby = listOf( "漫画", "アニメ", "ゲーム", "折り紙", "OSS開発・コントリビュート", ) }
  2. Channel データの持ち方 イベントの発火 // ViewModel private val _message = Channel<String>()

    val message = _message.receiveAsFlow() viewModelScope.launch { _message.send("message...") }
  3. Channel イベントの消費 // Compose val lifecycle = LocalLifecycleOwner.current.lifecycle LaunchedEffect(Unit) {

    lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { viewModel.message.collect { showSnackBar(it) } } }
  4. Channel メリット collectorがいない間に発生したイベントをバッファリングできる(demo) デメリット イベントの​ 消費中に​ coroutine が​ キャンセルされたら​ どうしますか?​

    (demo) → バッファリングの挙動とバックグラウンド時のキャンセルが絡み合うとイベン トハンドリングの振る舞いがどんどん予測困難になる
  5. SharedFlow データの持ち方 イベントの発火 // ViewModel private val _message = MutableSharedFlow<String>()

    val message = _message.asSharedFlow() viewModelScope.launch { _message.emit("message...") }
  6. SharedFlow イベントの消費 Channelのときと同じ // Compose val lifecycle = LocalLifecycleOwner.current.lifecycle LaunchedEffect(Unit)

    { lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { viewModel.message.collect { showSnackBar(it) } } }
  7. StateFlow // Fragment viewLifecycleOwner.lifecycleScope.launch { viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { viewModel.message.collect { if

    (it != null) { showSnackBar(it) // イベントをハンドリングしたあとは明示的に消費する viewModel.consumeMessage() } } } } // ViewModel fun consumeMessage() { _message.value = null }
  8. まとめ Channel ⭕ トーストにメッセージを表示するなどの単純なイベントに向いている ⭕ collect前にイベントが発火する可能性がある場合に向いている ❌ イベントが消失する可能性があるので、重要なイベントには向いてない SharedFlow ⭕

    トーストにメッセージを表示するなどの単純なイベントに向いている ⭕ バッファリングとか考えなくてよいのでシンプル ❌ イベントが消失する可能性があるので、重要なイベントには向いてない StateFlow ❌ 単純なイベントについては過度 ⭕ イベントの処理を保証しないといけない場合は向いている ⭕ 重要なイベントに向いている