しばしハマってしまったのですが、原因がわかったらそらそうだ!となったメモです。
List型の要素が追加されたらViewを更新したい
MutableLiveDataにList型を入れて、要素が追加されたらViewを更新しようとするサンプルです。
kotlin
class SampleViewModel : ViewModel() {
val items = MutableLiveData<ArrayList<String>>(ArrayList())
var counter = 0
init {
add()
}
fun add() {
counter++
items.value?.add(counter.toString())
}
}
@Composable
fun SampleView(viewModel: SampleViewModel) {
val items = viewModel.items.observeAsState()
Column {
Button(onClick = {
viewModel.add()
}) {
Text("add")
}
items.value?.forEach { item ->
Text(item)
}
}
}
このコードで良さげと思ったのですが、、ボタンをタップしても反応しません...
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F77444%2F5731020a-ea2d-24cb-9959-b44c722f0aac.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=0984decad2ad493f41f090137f1906d6)
対処:その1
ググったらこういうのが出てきました。なんか良さげ。
kotlin
items.postValue(items.value)
そうかと思いやってみたら・・・
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F77444%2F5731020a-ea2d-24cb-9959-b44c722f0aac.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=0984decad2ad493f41f090137f1906d6)
効きません。。
対処:その2
こういうのもヒットしました。
kotlin
items.value = items.value
どうでしょうか・・・
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F77444%2F5731020a-ea2d-24cb-9959-b44c722f0aac.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=0984decad2ad493f41f090137f1906d6)
ダメです。。
解決方法
冷静になって見直してみると MutableLiveData に ArrayList が突っ込まれている・・・、kotlinではMutableListが定石ですよね!
kotlin
- val items = MutableLiveData<ArrayList<String>>(ArrayList())
+ val items = MutableLiveData<MutableList<String>>(mutableStateListOf())
やってみると・・・
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F77444%2F9cb56e86-af99-b0b9-5ebc-4d8a698c8e20.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=2516325e84d63b9d54d9bacdd6a6e587)
うまくいきました!!
よかった。
(こういうのコンパイラで教えて欲しい)