Coroutineの記事だがMVVMの基礎から書いてあり、関連記事のマルチモジュール化も含めて参考になる
tech.gunosy.io
これから自社に導入していくときの参考に
どっかで時間作ってJetpack Compose Pathwaysやりたい
tech.gunosy.io
そのほかの記事含めgunosyのテックブログかなり参考になりそう。
Coroutineの記事だがMVVMの基礎から書いてあり、関連記事のマルチモジュール化も含めて参考になる
tech.gunosy.io
これから自社に導入していくときの参考に
どっかで時間作ってJetpack Compose Pathwaysやりたい
tech.gunosy.io
そのほかの記事含めgunosyのテックブログかなり参考になりそう。
www.youtube.com
基本方針は以下で良さそう
使いすぎるとテストコードと実装が密接に結びついてしまいテストコードのメンテナンスにコストがかかりやすくなるので必要のない箇所では使わない方がいい。
スタブを使うべき箇所として以下があげられていた
スパイを使うべき箇所
参考資料として挙げられてたテストの書き方について
GitHub - DeNA/android-modern-architecture-test-handson
テスト周りは公式ドキュメントも含めて色々覚える必要がある
speakerdeck.com
文字列や画像のグラデーションや背景追加や矩形追加等
かなりのパターンのアニメーションについても紹介されている
docs.google.com
音量制御はあまり触れてこなかったので参考になった
音量設定は端末差異があるので数値で指定すると意図しないものになる可能性がある
SoundPool, MediaPlayer, AudioTrackを使い分ける
speakerdeck.com
パフォーマンス指標を図ることでJetpackComposeの導入のメリットを明確にすることにより採択されるようにしていった
各監視ツールの特徴がまとめられている
AndroidとiOS向けアプリを両方作る
UIはComposeで作ってビジネスロジック部分はKolin Multiplatformで作る話
Compose for iOSはα版なのでまだまだ実用には遠そう
LaunchedEffect(key)の形なのでkeyが変わったら動く(初回は必ず実行される)
内部はCoroutineで動いてるらしい
keyにUnitとか固定値を入れると最初の1回だけ動くようにできる
keyを複数指定も可能で指定したどれか1つが変わったら動く
キャンセルするタイミングは
・keyが変わってLaunchedEffectが再起動するとき
・CompositionからLeaveするとき
val scope = rememberCoroutineScope()
ボタンとかのイベント処理で使いそう
キャンセルのタイミングはCompositionからLeaveするとき
最後に何か処理をしたい場合によく使う
これはLaunchedEffectと違ってCoroutineでは起動してない
例ではライフサイクルの監視処理を起動させて最後に破棄する例だった
初回起動時はonDisposeが実行されず、次回起動時に前回の値でonDispose起動→それ以外の処理が今回の値で起動する
ComposeのStateを返す
内部としてはrecompositionのたびにvalueを書き換えてる
どういうときに必要か
Compositionが成功したときに実行される
Composable内でエラーが起きた場合には実行されないので正常時だけ動くような制御ができる
ログの抑止にも使えるかも
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系が一番使われそう
Composeの外の処理をComposeに変換してくれる
ComposeのStateをComposeの外でFLowとして監視したい
ログ出力にTimber使ってるので調べてみる
オンラインで参加して気になったセッションのメモ
github.com
結構使えそうな事例があるので参考になる。
1. ローディング
2. ボトムナビゲーション
3. ボトムシート
4. アコーディオン
5. カルーセル
6. クレジットカード番号入力
7. 固定ヘッダー
8. 特定位置へのスクロール
9. もっと見る
scrollStateを渡すことでスクロール可能なコンポーネントにできる。
JetpackComposeとAndroidViewをつないで動かす事例とかも紹介されてた。
val scrollState = rememberScrollState() Column(modifier = Modifier.verticalScroll(scrollState)) { ... }
テスト自動化 使えそうなので調べる
build.gradle→build.gradle.ktsでKotinになる。
Google的には移行推奨らしい。
Firebase Crashlyticsレポートを確認できる
Compose UI 1.3.0-beta以上
Compose Compilier 1.3.0以上
何が契機でrecomposeされたか追えるようになる
qiita.com
これの「子を右から左に配置したい」のところを参考にして上下も変更可能にカスタムした。
@Composable fun InversionLayoutExample( layoutDirection: LayoutDirection = LayoutDirection.Ltr, idStart: Boolean = true) { Column(modifier = Modifier.width(200.dp)) { ProvideLayoutDirection(layoutDirection = layoutDirection) { InversionLayout(idStart) } } } @Composable private fun ProvideLayoutDirection( layoutDirection: LayoutDirection, content: @Composable () -> Unit, ) { CompositionLocalProvider( LocalLayoutDirection provides layoutDirection, content = content, ) } @Composable private fun InversionLayout(isStart: Boolean = true) { Row( modifier = Modifier .padding(16.dp) .width(200.dp), horizontalArrangement = Arrangement.SpaceBetween, ) { Box( modifier = Modifier .width(100.dp) .height(200.dp) .background(Color.Red), contentAlignment = if (isStart) { Alignment.TopStart } else { Alignment.BottomStart } ) { Text( text = "AAA", textAlign = TextAlign.End ) } Box( modifier = Modifier .width(100.dp) .height(200.dp) .background(Color.Blue) ) } }
パラメータのパターンによる違いは以下の通り
InversionLayoutExample(LayoutDirection.Ltr, true)
InversionLayoutExample(LayoutDirection.Ltr, false)
InversionLayoutExample(LayoutDirection.Rtl, true)
InversionLayoutExample(LayoutDirection.Rtl, false)
中心点から対象に配置したいとかそういうときに使えるかも
qiita.com
これまでstreamを扱っていた箇所をこれで実装できるかも
satoshun.github.io
かなり近い形で使えそう
エラーハンドリングこれまでtry-catchでやってたけどrunCatchingの方が見た目もスッキリ感ある
Jetpack ComposeでPermissionを取得したい - 縁側プログラミング
こっちはまさにLazyVerticalGrid使ってて気になってたとこだった
LazyColumnのスクロールがカクカクするときの確認ポイント(Stableアノテーション) - 縁側プログラミング
ボタンのonClickで時間かかる処理をしたいときはrememberCoroutineScope()を使う
コンポーザブルでコルーチンを使いたい場合は、LaunchedEffectを使う
コルーチンのキャンセルとかの例もあり参考になる
Jetpack ComposeのonClickでコルーチンを使いたい - 縁側プログラミング
Icons.Default.XXXで使える
全てのアイコンを使えるようにするにはmaterial-icons-extendedをbuild.gradleに追加する必要あり
Jetpack Composeでマテリアルアイコンを表示したい - 縁側プログラミング
Navigationを使ってActivityやFragment内の遷移を実装していて
onPause, onResumeのタイミングで処理したい場合、Lifecycleイベントを使って実現する
Jetpack ComposeでonResumeやonPauseの処理を書きたい - 縁側プログラミング