😇

Kotlin (Android)でListの状態変化をどうしても知りたくて悩んだ

2021/12/26に公開
3

KotlinでListの状態変化をどうしても知りたい

突然ですが

val penguin = remember { mutableStateOf(0) }

みたいなことをListでしたいと思った。こんな感じ(下のコードは正常に動かない)

val a = listOf(1,2,3)
val polarBear = remember {mutableStateOf(a)}

しかし、こういう事はできないそうです[1]
ざっくりいうと変数が変わったことは知ることが出来るけど変数を保持しているオブジェクトの変化を知ることは出来ないだそうです。

解決策

いろいろ試して、1時間考えた末にしたのが、新しい型を定義して変数にしちゃえば良いんじゃない?(自暴自棄)
こんな感じ

data class ListInt(
	val listInt: List<Int>,
)

これで

val cat = remember { mutableStateOf( ListInt( listOf(1,2,3,4) ) ) }

...中略

cat.value = hogehoge.wanwan() //<-これはListIntを返す関数

ってすれば状態を監視することが出来てしまった…

あまり納得いっていないので、他に解決方法があれば、教えていただけると嬉しいです。

追記(もっと良い解決策)

本記事のDiscussionでYuto Koguchiさん(@10llip0p)からコメントいただきましたように、mutableStateListOfを使って解決することが出来ました。こちらのAndroidのリファレンス[2]が参考です。
コードにすると以下のような感じです。

MainViewModel
    val polarBear = mutableStateListOf<Int>()

または

View
    val polarBear = remember { mutableStateListOf<Int>() }

(2021-12-29に追記)

脚注
  1. How to create a observable List in kotlin / Robin on stackoverflow https://stackoverflow.com/questions/46727614/how-to-create-a-observable-list-in-kotlin ↩︎

  2. mutableStateListOf() / Android Reference https://developer.android.com/reference/kotlin/androidx/compose/runtime/package-summary#mutableStateListOf() ↩︎

Discussion

Yuto Koguchi (kogoto)Yuto Koguchi (kogoto)

JetpackComposeでの状態管理と想定してですが、mutableStateListOfを使って解決できるかと
https://developer.android.com/reference/kotlin/androidx/compose/runtime/package-summary#mutableStateListOf()

Akira KashiharaAkira Kashihara

ありがとうございます!
この記事書いた後に、mutableStateListOfにたどり着き、無事、予想していた動きを実現できました。

Akira KashiharaAkira Kashihara

ご指摘いただいた内容を踏まえ、記事に追記致しました。
私の記事で至らぬ点がありましたら、また、ご指摘いただければ幸いです。