fun TestListScreen(userList: List<User>) { var favorite by remember { mutableStateOf(false) } Column { FavoriteSwitch(checked = favorite, onCheckedChange = { favorite = !favorite }) UserListColumn(userList) } } State Change 가장 가까운 restartable function Recomposition 범위 Read
fun TestListScreen(userList: List<User>) { var favorite by remember { mutableStateOf(false) } Column { Button(onClick = { favorite = !favorite }) { Text(“$favorite") } UserListColumn(userList) } } Read 가장 가까운 restartable lambda content: @Composable RowScope.() -> Unit Recomposition 범위 żŦ Composable function 을 나누는 것으로 recomposition 범위를 제약할 수는 있음 다만, 성급한 최적화는 유지보수를 어렵게 한다. 어차피 컴파일러가 recomposition 에 대한 최적화를 한번 더 진행해준다.
val name: String, val images: List<String> ) stable class User { stable val number: Int stable val name: String unstable val images: List<String> } • 컴파일러와 강한 약속 • 초기화 된 이후 무조건 불변임을 보장 • 변경가능한 필드나 객체에 대한 참조가 있을 경우 사용하면 안됨
발생했을 때 이전 호출 값과 equals 하다면 skip • 객체가 안정적으로 상태가 예측 가능함을 나타냄 @Stable class UserPreferences { var darkModeEnabled by mutableStateOf(false) var notificationEnabled by mutableStateOf(true) }
class User( val number: Int, var name: String, val images: List<String> ) // normal mode restartable scheme("[androidx.compose.ui.UiComposable]") fun UserListColumn( unstable user: User ) // strong skipping mode restartable skippable scheme("[androidx.compose.ui.UiComposable]") fun UserListColumn( unstable user: User ) // @Stable User, normal mode restartable skippable scheme("[androidx.compose.ui.UiComposable]") fun UserListColumn( stable user: User )