不具合である事が確認できました。
https://issuetracker.google.com/issues/270656235
movableContentOfとは
movableContentOf は 1.2.0-alpha03 で追加されたAPIです。
https://developer.android.com/jetpack/androidx/releases/compose-ui#1.2.0-alpha03
Compose Componentの作成ガイドラインで登場し、知りました。
https://github.com/androidx/androidx/blob/24310ca1c317aa88f990bd8aa3d2b4cba5b20588/compose/docs/compose-component-api-guidelines.md#lifecycle-expectations-for-slot-parameters
動作確認
引数のComposable関数で、Composable関数内のrememberを保持してコードの配置を変更することができます。
@Composable fun MovableContent( isRow: Boolean, content: @Composable () -> Unit, ) { val movableContent = remember(content) { movableContentOf(content) } if (isRow) { Row { Text("Row") movableContent() } } else { Column { Text("Column") movableContent() } } }
カウントアップできるボタンがあります。ボタンでRowとColumnを切り替えられます。movableContentOfにより、countの部分のrememberが保持されます。
Column {
var isRow by remember { mutableStateOf(false) }
MovableContent(isRow = isRow) {
var count by remember { mutableStateOf(0) }
Button(onClick = { count++ }) {
Text(text = count.toString())
}
}
Button(
onClick = {
isRow = !isRow
},
) {
Text("Button")
}
}
しかし、ボタンを押してRowとColumnを切り替えると、ボタンを押しても表示が更新されなくなります。しかし、SideEffectは呼ばれており、変数も更新されていることは確認できました。
これが意図された挙動で、意図していない使い方なのか、使い方が間違っているのかは不明です。
尚、Composeコンパイラのバージョンは1.4.7です。