Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Jetpack Compose の学習初期につまずいたこと

Tomoyuki TAKEZAKI
June 14, 2022
350

Jetpack Compose の学習初期につまずいたこと

2022/06/14 Engineer LT#1 Android|Organized by U-NEXT

Tomoyuki TAKEZAKI

June 14, 2022
Tweet

Transcript

  1. 登壇者について U-NEXT Co., Ltd. Androidアプリ開発3年目 話すこと Jetpack Compose の学習初期につまずいたことを、簡単な具体例をもとに説明します。 Compose

    に馴染みのない方にも聞いていただける内容になっていると思います。 説明用サンプルのリポジトリ: https://github.com/Tomoyuki-TAKEZAKI/LT20220614 経験者向けのコメント: 一言で言えば MutableState と remember の使い方です。
  2. Composable 関数によるUIの組み立て Jetpack compose では、UI を Composable 関数で表現します。 Composable 関数を定義するには

    @Composable アノテーションを付与します。 @Composable fun Sample() { // ここでは Composable 関数のほかに、 // 通常の Kotlin の構文も利用できる。 }
  3. 実装1 最初に、次のような実装を行いました。このコードの問題があります。どこでしょうか? (以下のコードでは @Composable や関数の宣言、 Column を省略しています。) val hiddenNumber =

    (1..100).random() var guess = "" val message = ... // guess と hiddenNumber を比較してメッセージを生成する TextField( value = guess, onValueChange = { guess = it }, ) Text(text = message, fontSize = 20.sp) sample codes on Github
  4. 次のように修正すると、入力したテキストが TextField に表示されるようになります。 - var guess = "" + var

    guess by remember { mutableStateOf("") } 実装2 修正したこのコードは数あてゲームとして期待通りに動くでしょうか? val hiddenNumber = (1..100).random() var guess by remember { mutableStateOf("") } val message = ... // 略 TextField( value = guess, onValueChange = { guess = it }, ) Text(text = message, fontSize = 20.sp) sample codes on Github
  5. 数値の入力ごとに答えが変わる 先ほどのコードでは、文字列を入力する たびに hiddenNumber が変化してしま います。 これは guess の値が変更されるたびに 画面の再描画(recompose)が発生し、都

    度 hiddenNumber として新しい値が評 価されるためです。 一度計算した値を保持し、 recomose で再計算しないようにするには、 remember を利用します。
  6. 次のように修正すると、秘密の乱数の値を保つことができます。 - val hiddenNumber = (1..100).random() + val hiddenNumber =

    remember { (1..100).random() } 最終的なコードは次のとおりです。 val hiddenNumber = remember { (1..100).random() } var guess by remember { mutableStateOf("") } val message = ... // 略 TextField( value = guess, onValueChange = { guess = it }, ) Text(text = message, fontSize = 20.sp) sample codes on Github
  7. 学んだこと 値の変更に応じて表示を更新する場合、値は MutableState として与える。 MutableState を composable のスコープで利用する場合は必ず remember を利用す

    る。これは、 MutableState のインスタンスそのものを recompose を超えて保持する 必要があるため。 一方、 remember は MutableState の保持以外にも、計算を recompose のたびに行 わない場合に使う。 コメント 学習の初期には remember と MutableState の使いどころがわからずなんとなく書い ていたため、値を変更してもUIが更新されなかったり、意図しないUIの更新が発生する などの問題のあるコードを書いてしまいました。 このLTで提供したサンプルが、皆様の参考になれば幸いです。