Composable로 선언된 함수는 ReComposition 때마다 Recompose 된다.
모든 컴포넌트가 다 Recompose되는 것이 아니라 State를 읽는 composable과, 여기에서 호출되는 composable이 대상이 된다.
입력이 안정적이고 바뀌지 않는 경우에는 Recomposition에서 스킵된다
Recomposable을 스킵할 수 있는 안정적인 타입은
모든 Primitive(Boolean, Int, Long, Float), String, 모든 함수 타입은 @Stable
을 표시하지 않아도 안정적이라고 추론된다.
이가 아닌 경우에는 안정적인 경우 @Stable
을 붙여야 한다.
또한 MutableState는 안정적이다. State의 value의 변경이 알려지기 때문이다.
@Composable
fun MovieOverview(movie: Movie) {
Column {
// Side effect explained later in the docs. If MovieOverview
// recomposes, while fetching the image is in progress,
// it is cancelled and restarted.
val image = loadNetworkImage(movie.url)
MovieHeader(image)
/* ... */
}
}
이와 같은 composable을 만들었다고 하자
이 코드를 아이템으로 사용할 떄
Column안에 새로운 아이템을 넣으면 나머지 MoviewOverview 까지도 Recomposition을 행하게 될 수 있다.
하지만
@Composable
fun MoviesScreenLazy(movies: List<Movie>) {
LazyColumn {
items(movies, key = { movie -> movie.id }) { movie ->
MovieOverview(movie)
}
}
}
이를 막기 위해 key
로 아이템의 유일성을 관리하여 Recomposition을 새로 들어오는 아이템에만 할 수 있다.
Compose는 3 단계로 화면에 렌더링 된다.
그리고 이 중 어떤 요소가 업데이트 되면 새로 Composition이 일어난다.