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 と直接の関係は持たない。
