0. 코드 정의

/**
 * 공통으로 사용하는 아이템
 */
@Composable
fun ListItem(
    alpha: Float,
    modifier: Modifier = Modifier
) {
    Text(
        text = "List item",
        modifier = modifier
            .padding(32.dp)
            .graphicsLayer {
                this.alpha = alpha
            }
    )
}

투명도 변화에 alpha 값을 사용하는 공통 Composable ListItem이 있다고 가정하자.


1. 오용

// BAD
@Composable
fun ListScreen() {
    val scrollState = rememberScrollState()
    Column(
        modifier = Modifier
            .fillMaxSize()
            .verticalScroll(scrollState)
    ) {
        for(i in 1..50) {
            ListItem(
                alpha = scrollState.value / 50f,
                modifier = Modifier.fillMaxWidth()
            )
        }
    }
}

2. 해결

// GOOD
@Composable
fun ListScreen() {
    val scrollState = rememberScrollState()
    Column(
        modifier = Modifier
            .fillMaxSize()
            .verticalScroll(scrollState)
    ) {
        for(i in 1..50) {
            ListItem(
                **alpha = { scrollState.value / 50f }**, // <- 차이점
                modifier = Modifier.fillMaxWidth()
            )
        }
    }
}

...

@Composable
fun ListItem(alpha: () -> Float, modifier: Modifier = Modifier) { // 타입이 () -> Float
    Text(
        // ...
        .graphicsLayer {
            this.alpha = alpha() // 람다를 호출하여 최신 값을 얻음
        }
    )
}