🤖 Compose

[Compose] State, StateHoisting

콩드로이드 2025. 1. 7. 20:41

상태가 전달되는 범위는 최대한 좁혀야한다 -> StateHoisting (상태를 위로 끌어올린다)

@Composable
fun StateTest() {
    var downCase by rememberSaveable { mutableStateOf("aa") }
    var upperCase by rememberSaveable { mutableStateOf("AA") }


    Column(modifier = Modifier.padding(16.dp)) {
        OutlinedTextField(
            value = downCase,
            onValueChange = {
                if(it.isBlank()) {
                    downCase = ""
                    upperCase = ""
                    return@OutlinedTextField
                }
                downCase = it
                upperCase = downCase.uppercase()
            },
            label = {
                Text("소문자")
            }
        )

        OutlinedTextField(
            value = upperCase,
            onValueChange =  {
                upperCase = it
            },
            label = {
                Text("대문자")
            }
        )
    }
}

 

이렇게 잘 나오지만, 하위 컴포넌트는 상태에 대한 의존성을 갖게 되므로 이걸 최대한 분리하는 게 좋다고 한다

상위 컴포넌트가 상태를 가질 수 있게끔 -> 테스트가 쉬워지고, 상태를 한 곳에만 몰아둘 수 있다 

@Composable
fun StateTest() {
    var downCase by rememberSaveable { mutableStateOf("aa") }
    var upperCase by rememberSaveable { mutableStateOf("AA") }

    DownToUpperStateless(
        downCase,
        upperCase) {
        if(it.isBlank()) {
            downCase = ""
            upperCase = ""
            return@DownToUpperStateless
        }
        downCase = it
        upperCase = downCase.uppercase()
    }

}

//상태를 모르고 전혀 개입하지 X
@Composable
fun DownToUpperStateless(
    downCase: String,
    upperCase: String,
    onDownChanged: (String) -> Unit
) {
    Column(modifier = Modifier.padding(16.dp)) {
        OutlinedTextField(
            value = downCase,
            onValueChange = onDownChanged,
            label = {
                Text("소문자")
            }
        )

        OutlinedTextField(
            value = upperCase,
            onValueChange = onDownChanged,
            label = {
                Text("대문자")
            }
        )
    }
}

 

즉, UI와 상태가 분리되고, 재사용성, 테스트 용이성도 좋아진다 

후에 state를 ViewModel에서 관리하게 할 때도 쉬울 거 같아 

'🤖 Compose' 카테고리의 다른 글

[Compose] Animation  (0) 2025.01.08
[Compose] Snackbar  (0) 2025.01.07
[Compose] ConstraintLayout, ConstraintSet  (0) 2025.01.07
[Compose] Recomposition  (0) 2025.01.06
[Compose] scaffold  (0) 2025.01.06