remember
var name by remember { mutableStateOf("")}
remember
함수를 사용하면 리컴포지션 후에도 MutableState
값이 유지됩니다.
어떤 방식으로 값이 유지 되는 지 remember
의 선언을 예로 들며 알아보겠습니다
@Composable
inline fun <T> remember(crossinline calculation: @DisallowComposableCalls () -> T): T =
currentComposer.cache(false, calculation)
일반적으로 remember
는 매개변수로 calculation
람다를 취합니다. 처음 remember
가 실행되면 calculation
람다를 호출하고 그 결과를 저장합니다. 리컴포지션 중 remember
는 마지막으로 저장된 값을 반환합니다.
캐싱 상태 외에도 remember
를 사용하여 비용이 많이 드는 작업의 결과를 컴포지션 중에 저장할 수 있습니다. 주로 리컴포지션 마다 반복할 필요 없는 작업들에 사용하면 좋습니다.
그 예시로 비용이 많이 드는 작업인 ShaderBrush
객체를 만드는 경우입니다.
val brush = remember {
ShaderBrush(
BitmapShader(
ImageBitmap.imageResource(res, avatarRes).asAndroidBitmap(),
Shader.TileMode.REPEAT,
Shader.TileMode.REPEAT
)
)
}
remember 강제 재 실행
remember
는 컴포지션을 종료할 때까지 값을 저장합니다. 하지만 필요에 따라 사용자가 원하는 시점에 값을 변경하고 싶을 때가 있습니다. 그럴 때 remeber
의 keys
매개변수를 사용하면 됩니다. 매개변수로 등록된 key
중 하나라도 변경될 경우 다음 리컴포지션 시 remember
는 캐시를 무효화하고 람다 블록을 다시 실행합니다.
간단한 텍스트와 버튼을 이용한 예제입니다.
버튼의 boolean 값에 반응하여 a가 증가하도록 되어있습니다.
@Composable
fun RememberKeySnippet(){
var a by remember {
mutableStateOf(1)
}
var b by remember {
mutableStateOf(false)
}
//key 추가
remember(key1 = b) {
a++
}
Text(text = a.toString())
Button(onClick = { b = !b }) {
Text(text = "강제 리컴포지션 실행")
}
}
두 영상을 통해 key를 통한 강제 리컴포지션을 확인할 수 있습니다.
위쪽 영상이 key를 추가하지 않았고, 아래쪽이 추가한 영상입니다.
두 영상 중 아래 쪽 영상만 숫자가 증가하는 것을 볼 수 있습니다.
참고
https://developer.android.com/develop/ui/compose/state?hl=ko#retrigger-remember
'안드로이드(Compose) > 개념' 카테고리의 다른 글
Compose에서 State를 복원하는 방법 (0) | 2024.04.04 |
---|---|
State Hoisting(상태 호이스팅) (0) | 2024.03.27 |
Stateful 과 Stateless (0) | 2024.03.25 |
지원되는 기타 State 유형 (0) | 2024.03.20 |
State and Jetpack Compose (0) | 2024.03.18 |