android: ViewModelの続き
2024/10/20
前回の Codelabs が終わっていないので続きをやろう。
前回
TextField に入力した文字は onValueChange
イベントが発生する。
これは GameLayout(onUserGuessChanged)
で渡されていて、内容は { gameViewModel.updateUserGuess(it) }
である。
updateUserGuess()
は GameViewModel
のメソッドだ。
このメソッドの中身は userGuess = guessedWord
で、userGuess
はプロパティだ。
var userGuess by mutableStateOf("")
private set
remember
はいらないんだっけ、と思ったが、あれは @Composable
関数の中に変数を定義するときだけだ。
いままで出てきたのが remember by { mutableStateOf() }
の形だけだったのでセットだと思い込んでいた。
わざわざ setter を使えなくしてメソッドを用意したのは、setter だとインライン展開みたいになって UI element の中で値を更新したことになるからだろうか?
backing property みたいにがんばってメソッドを使わないようにしていたり、わざわざメソッドにしたりのさじ加減がよくわからん。
たぶん、class
内でのアクセスは何でもできて処理も速くできるように、それ以外は getter だけ速く動くならよし、という感じじゃなかろうか。
ぐだぐだ言ってないで続きをやろう。
- 7. 推測した単語を照合して、スコアを更新する
ViewModel
: 入力された文字列と課題の文字列を比較する関数追加- 不一致のとき
_uiState
で値が違うことを伝えるGameUiState
に不一致かどうかの変数を追加_uiState.update {}
で Flow に更新を行う- 変更するのに
.value
と.update
があるが検索するといろいろ出てくる .copy()
して一部だけ書き換えなんてできるんだ.isGuessedWordWrong
はval
なので書き換えできないvar
にして直接プロパティを書き換えても挙動は同じだった.update()
のラムダ式の引数?を直接変更することに問題は無いのかもしれないが、.copy()
するコストが高そうだったらその方がよいのだろうか?
- 変更するのに
- 不一致のとき
GameScreen
は GameViewModel
を参照したりメソッドを呼び出したりするが、その逆はない。
GameLayout
は GameScreen
経由でそのデータを使っている感じで、GameViewModel
と直接の関係は持たない。