remember관련

Kim suho·2022년 5월 18일
0

remember

val data = ""

. recomposition될때마다 data는 "" 값으로 갱신된다. 다만 data는 state 가 아니므로 data값이 바뀐다고 recomposition이 되지는 않는다. 다른 조건에 의해 recomposition이 될때 data가 ""가 된다는 의미이다.

val data = mutableStateOf("")

. recomposition될때마다 data는 "" 값으로 갱신된다. 따라서 이 composable에서 data의 값이 바뀌면 recomposition이 일어나지만 바로 ""값이 되므로 값이 바뀌어 보이지 않는다.

val data = remember(key) {mutableStateOf("")}

. key가 바뀔때 lambda를 수행하여 data가 갱신된다.
. 만약 key가 없이 remember만 사용한다면 init composition에만 값을 저장하고, recomposition이 되도 remember된 값을 사용한다.
. 그러나 외부에서 composable의 인자가 바뀔때 recomposition이 되게 하고 싶다면 아래를 참조한다.

rememberUpdatedState

@Composable
fun writeData(rawData: String) {
    val data = remember { mutableStateOf(rawData) }
    
    data.value = "aaa"
}

만약 data.value 로 값을 바꾸면 recomposition이 일어나서 화면을 갱신할 수 있다. 그러나 rawData가 바뀌어도 data가 바뀌지는 않는다.
왜냐면 writeData instance가 처음 생길때 rawData를 data에 넣으면서 init composition이 일어나지만, rawData가 바뀌어도 writeData instance가 유지된 상태라서 remember로는 값이 생긴되지 않는다. rawData가 바뀔때 data 값이 갱신되는 것을 기대한다면 data.value에 값을 직접 기록해야 한다. 이를 위해 사용하는 것이 rememberUpdatedState 이다. rememberUpdatedState는 아래의 구문에 mutableState를 State로 캐스팅하는 것과 동일하다.

val data = remember { mutableStateOf(rawData) }.apply { value = rawData}

쉽게 생각하면, remember는 composable함수가 처음 호출(init composition)될 때만 값을 저장하고, androidx.compose.runtime.State 는 값이 변할때마다 recomposition을 수행하게 한다.

참고 link:
https://kotlinworld.com/208?category=973278
https://kotlinworld.com/256?category=973278

profile
평범한 개발자

0개의 댓글