ComposeUI의 발전을 조금씩 지켜 보다가
근무하는 회사에서 조금씩 ComposeUI를 적용 해보자고 해서
Compose를 적용하기 앞서 핵심 개념이 무엇인지 정리 해볼려고 한다.
뷰의 상태만 신경쓰고
디테일한 부분은 프레임워크가 관리
따라서 상태가 바뀌거나 데이터 목록이 바뀌었을 때
Recomposing 하게 됨
🤮 UI 상태와 <--> 데이터의 상태가 달라지는 문제
🤮 스레드로부터 안전하지 않고 람다의 허용되지 않는 부작용 때문
@Composable
@Deprecated("Example with bug")
fun ListWithBug(myList: List<String>) {
var items = 0
Row(horizontalArrangement = Arrangement.SpaceBetween) {
Column { // 람다 안에 변수를 수정하는 코드
for (item in myList) {
Text("Item: $item")
items++ // Avoid! Side-effect of the column recomposing.
}
}
Text("Count: $items")
}
}
/**
* Display a list of names the user can click with a header
*/
@Composable
fun NamePicker(
header: String,
names: List<String>,
onNameClicked: (String) -> Unit
) {
Column {
// this will recompose when [header] changes, but not when [names] changes
// header가 변경 되었을 때만 Text recompose
Text(header, style = MaterialTheme.typography.h5)
Divider()
// LazyColumn is the Compose version of a RecyclerView.
// The lambda passed to items() is similar to a RecyclerView.ViewHolder.
LazyColumn {
items(names) { name ->
// When an item's [name] updates, the adapter for that item
// will recompose. This will not recompose when [header] changes
NamePickerItem(name, onNameClicked)
}
}
}
}
/**
* Display a single name the user can click.
*/
@Composable
private fun NamePickerItem(name: String, onClicked: (String) -> Unit) {
Text(name, Modifier.clickable(onClick = { onClicked(name) }))
}
함수가 기기 저장소에서
읽기와 같은 비용이 많이 드는 작업 실행하면
함수로 인해 UI 버벅거림 발생할 수 있다.
위젯이 기기 설정을 읽으려고 하면 잠재적으로 이 설정을
초당 수백 번 읽을 수 있고 앱 성능에 치명적인 영향
구성 가능한 함수에
데이터가 필요하다면 데이터의 매개변수를 정의해야 한다.
그런 다음, 비용이 많이 드는 작업을 구성 여부의 다른 스레드로 이동하고
mutableStateOf
또는 LiveData
를 사용하여
Compose에 데이터를 전달할 수 있다.
ComposeUI 내용을 최대한 필요하고 핵심적인 내용으로
작성 해보았는데 쉽지 않았습니다 🤣
해당 컨텐츠가 도움이 되길 바라며
수정 & 보충이 필요한 부분이 있다면 (그 외 어떤 것도)
댓글 달아주시면 피드백 내용을 보강하여
Compose를 시작하는
많은 개발자에게 도움이 되는 컨텐츠를 제공하고 싶네요 🙇🏻