Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Jetpack Compose の学習初期につまずいたこと
Search
Tomoyuki TAKEZAKI
June 14, 2022
0
370
Jetpack Compose の学習初期につまずいたこと
2022/06/14 Engineer LT#1 Android|Organized by U-NEXT
Tomoyuki TAKEZAKI
June 14, 2022
Tweet
Share
More Decks by Tomoyuki TAKEZAKI
See All by Tomoyuki TAKEZAKI
関数型まつり 2025 参加レポート
74k3z4k1
0
76
copy メソッドが壊す data class のドメイン制約
74k3z4k1
0
98
data class と継承の組み合わせによる問題と、その解決法
74k3z4k1
0
140
関数型プログラミングへの第一歩: 純粋関数を知る
74k3z4k1
1
450
Featured
See All Featured
How GitHub (no longer) Works
holman
314
140k
Speed Design
sergeychernyshev
32
1k
Scaling GitHub
holman
459
140k
Writing Fast Ruby
sferik
628
62k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
161
15k
YesSQL, Process and Tooling at Scale
rocio
173
14k
Building Adaptive Systems
keathley
43
2.6k
Gamification - CAS2011
davidbonilla
81
5.3k
Git: the NoSQL Database
bkeepers
PRO
430
65k
Java REST API Framework Comparison - PWX 2021
mraible
31
8.7k
The Language of Interfaces
destraynor
158
25k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
Transcript
Jetpack Compose の学習初期につまずいたこと 2022/06/14 Engineer LT#1 Android|Organized by U-NEXT 竹嵜智之
登壇者について U-NEXT Co., Ltd. Androidアプリ開発3年目 話すこと Jetpack Compose の学習初期につまずいたことを、簡単な具体例をもとに説明します。 Compose
に馴染みのない方にも聞いていただける内容になっていると思います。 説明用サンプルのリポジトリ: https://github.com/Tomoyuki-TAKEZAKI/LT20220614 経験者向けのコメント: 一言で言えば MutableState と remember の使い方です。
目次 Composable 関数によるUIの組み立て 具体例: 数あてゲーム 学んだこと
Composable 関数によるUIの組み立て Jetpack compose では、UI を Composable 関数で表現します。 Composable 関数を定義するには
@Composable アノテーションを付与します。 @Composable fun Sample() { // ここでは Composable 関数のほかに、 // 通常の Kotlin の構文も利用できる。 }
Composable 関数: Text テキストを表示するには、 Text コン ポーザブルを使います。 @Composable fun SampleText()
{ Text(text = "Hello, World") } sample codes on Github
Composable 関数: Column いくつかのUI要素を縦に並べるには、 Column コンポーザブルを使います。 @Composable fun SampleColumn() {
Column { Text("Engineer LT#1 Android") Text("Organized by U-NEXT") } } sample codes on Github
具体例: 数あてゲーム Compose の学習においてハマったこと を説明するのに、ここでは数あてゲーム の実装を例としてお話します。 これは、1から100までの間にある、隠 された乱数を当てるゲームです。
実装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
入力した数値が表示されない 先ほどのコードでは、キーボードから入 力した文字列が TextField に表示さ れません。 Composable 関数に値の変更を検知を させるには、 MutableState
を利用し ます。
https://developer.android.com/reference/kotlin/androidx/compose/runtime/MutableState
mutableStateOf を使って、空文字を初期値とする MutableState を用意します。 mutableStateOf の呼び出しを remember 内部で行うように要求されました。 remember については後で説明します。
次のように修正すると、入力したテキストが 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
数値の入力ごとに答えが変わる 先ほどのコードでは、文字列を入力する たびに hiddenNumber が変化してしま います。 これは guess の値が変更されるたびに 画面の再描画(recompose)が発生し、都
度 hiddenNumber として新しい値が評 価されるためです。 一度計算した値を保持し、 recomose で再計算しないようにするには、 remember を利用します。
https://developer.android.com/reference/kotlin/androidx/compose/runtime/package- summary#remember(kotlin.Function0)
次のように修正すると、秘密の乱数の値を保つことができます。 - 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
学んだこと 値の変更に応じて表示を更新する場合、値は MutableState として与える。 MutableState を composable のスコープで利用する場合は必ず remember を利用す
る。これは、 MutableState のインスタンスそのものを recompose を超えて保持する 必要があるため。 一方、 remember は MutableState の保持以外にも、計算を recompose のたびに行 わない場合に使う。 コメント 学習の初期には remember と MutableState の使いどころがわからずなんとなく書い ていたため、値を変更してもUIが更新されなかったり、意図しないUIの更新が発生する などの問題のあるコードを書いてしまいました。 このLTで提供したサンプルが、皆様の参考になれば幸いです。