概要
Jetpack Composeを使用して画面を作成した際、コード上は再コンポジションされているのに、端末上のUIが更新されないという事象に遭遇しました。
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
val counterState = remember { mutableStateOf(0) }
Counter(
count = counterState.value,
updateCount = { newCount ->
counterState.value = newCount
}
)
}
}
}
@Composable
fun Counter(count: Int, updateCount: (Int) -> Unit) {
Button(
onClick = { updateCount(count + 1) },
colors = ButtonDefaults.buttonColors(
contentColor = if (count > 5) Color.Green else Color.White
)
) {
Text("I've been clicked $count times")
}
}
上記コードを実行してボタンを押すると、ボタンのテキストが「~ 1 times」、「~ 2 times」と増えていくはずです。
しかし実際は、ボタンを押すたびに Counter
コンポーザブルは呼び出されるものの、画面のボタンテキストが「I've been clicked 0 times」から変わりませんでした。
Counter
コンポーザブルが呼び出されることは、ログを仕込んで確認しています。
実行環境
端末:Google Pixel 4a(5G)
OSバージョン:Android13
compose_version = '1.3.1'
implementation "androidx.compose.ui:ui:$compose_version"
implementation "androidx.compose.ui:ui-tooling-preview:$compose_version"
修正方法
Compose UIのバージョンを 1.4.0-alpha02
以上に上げるか、 1.2.1
以下に下げてください。
1.4.0
まで上げることを修正方法としていないのは、現時点で最新のバージョンが 1.4.0-alpha03
だからです。
原因
今回の事象が発生するバージョンを調べました。
- 1.2.1 → 発生しない
- 1.3.0 → 発生する
- 1.3.1 → 発生する
- 1.3.2 → 発生する
- 1.4.0-alpha01 → 発生する
- 1.4.0-alpha02 → 発生しない
- 1.4.0-alpha03 → 発生しない
つまりCompose UIの 1.3.0
で今回の事象が発生するような対応がされ、 1.4.0-alpha02
で修正されたと推測できますが、リリースノート を見ても分かりませんでした...。
調べてもこのような事象に遭遇している人が見つからなかったので、何か他ライブラリのバージョンとの組み合わせによるものかもしれません。
誰か分かる方いたら教えてください。