DroidKaigi2023 Day2オンライン参加のメモ

リッチUIについて色々な事例紹介

speakerdeck.com
文字列や画像のグラデーションや背景追加や矩形追加等
かなりのパターンのアニメーションについても紹介されている

音量制御についてのセッション

docs.google.com
音量制御はあまり触れてこなかったので参考になった
音量設定は端末差異があるので数値で指定すると意図しないものになる可能性がある
SoundPool, MediaPlayer, AudioTrackを使い分ける

パフォーマンス監視ツールとJetpackComposeの導入

speakerdeck.com
パフォーマンス指標を図ることでJetpackComposeの導入のメリットを明確にすることにより採択されるようにしていった
各監視ツールの特徴がまとめられている

Jetpack ComposeでAndroid/iOSアプリを作る

AndroidiOS向けアプリを両方作る
UIはComposeで作ってビジネスロジック部分はKolin Multiplatformで作る話
Compose for iOSはα版なのでまだまだ実用には遠そう

Jetpack ComposeのSide-Effectを使いこなす

LaunchedEffect

LaunchedEffect(key)の形なのでkeyが変わったら動く(初回は必ず実行される)
内部はCoroutineで動いてるらしい
keyにUnitとか固定値を入れると最初の1回だけ動くようにできる
keyを複数指定も可能で指定したどれか1つが変わったら動く

LaunchedEffectのCoroutines

キャンセルするタイミングは
・keyが変わってLaunchedEffectが再起動するとき
・CompositionからLeaveするとき

rememberCoroutineScope
val scope = rememberCoroutineScope()

ボタンとかのイベント処理で使いそう
キャンセルのタイミングはCompositionからLeaveするとき

DisposableEffect

最後に何か処理をしたい場合によく使う
これはLaunchedEffectと違ってCoroutineでは起動してない
例ではライフサイクルの監視処理を起動させて最後に破棄する例だった
初回起動時はonDisposeが実行されず、次回起動時に前回の値でonDispose起動→それ以外の処理が今回の値で起動する

rememberUpdatedState

ComposeのStateを返す
内部としてはrecompositionのたびにvalueを書き換えてる
どういうときに必要か

  1. Composeの外で変化する状態を参照している
  2. LauchedEffect, DisposableEffectのkeyではない状態を参照
  3. 時間が経過して使用される状態への参照
  4. コールバック関数
SideEffect

Compositionが成功したときに実行される
Composable内でエラーが起きた場合には実行されないので正常時だけ動くような制御ができる
ログの抑止にも使えるかも

derivedStateOf
val listState = rememberLazyListState()    // スクロールの度に状態が変わる
LazyColumn(state = listState) { /*  */ }
val showButton = listState.firstVisibleItemIndex > 0    // スクロールの度にrecompositionされてしまう

if (showButton) {
    Button() {
        Text("ScrollTop")
    }
}

本来はshowButtonが変わった時だけ動かしたい

val showButton by remember {
    derivedStateOf {
        listState.firstVisibleItemIndex > 0
    }
}

こうするとshowButtonが変わった時だけrecompositionされる
LazyList系が一番使われそう

produceState

Composeの外の処理をComposeに変換してくれる

snapshotState

ComposeのStateをComposeの外でFLowとして監視したい


ログ出力にTimber使ってるので調べてみる