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
350
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
関数型プログラミングへの第一歩: 純粋関数を知る
74k3z4k1
1
310
Featured
See All Featured
How STYLIGHT went responsive
nonsquared
95
5.2k
A Tale of Four Properties
chriscoyier
157
23k
Keith and Marios Guide to Fast Websites
keithpitt
410
22k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
6
510
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.1k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
Optimizing for Happiness
mojombo
376
70k
Git: the NoSQL Database
bkeepers
PRO
427
64k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
2
290
XXLCSS - How to scale CSS and keep your sanity
sugarenia
247
1.3M
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.6k
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で提供したサンプルが、皆様の参考になれば幸いです。