1つのComposableで2つの状態を表現できる。
UI上でそれぞれ別の部品なので更新のあった値(waterCount, juiceCount)に関わるComposableだけが再Composeされる。
@Composable fun StatefulCounter() { var waterCount by remember { mutableStateOf(0) } var juiceCount by remember { mutableStateOf(0) } StatelessCounter(waterCount, { waterCount++ }) StatelessCounter(juiceCount, { juiceCount++ }) }
また、
ステートフルでコンポーズ可能な関数は、複数のコンポーズ可能な関数に同じ状態を提供できます。
とあるように、1つの状態を複数のComposableに反映することももちろんできる。
@Composable fun StatefulCounter() { var count by remember { mutableStateOf(0) } StatelessCounter(count, { count++ }) AnotherStatelessMethod(count, { count *= 2 }) }
設計パターンとしてステートレスなComposableとステートフルなComposable(状態だけ持つ)を組み合わせることは多々ある
@Composable fun WellnessTaskItem( taskName: String, checked: Boolean, onCheckedChange: (Boolean) -> Unit, onClose: () -> Unit, modifier: Modifier = Modifier ) { Row( modifier = modifier, verticalAlignment = Alignment.CenterVertically ) { Text( modifier = Modifier .weight(1f) .padding(start = 16.dp), text = taskName ) Checkbox( checked = checked, onCheckedChange = onCheckedChange ) IconButton(onClick = onClose) { Icon(Icons.Filled.Close, contentDescription = "Close") } } } @Composable fun WellnessTaskItem(taskName: String, modifier: Modifier = Modifier) { var checkedState by remember { mutableStateOf(false) } WellnessTaskItem( taskName = taskName, checked = checkedState, onCheckedChange = { newValue -> checkedState = newValue }, onClose = {}, modifier = modifier ) }