본문 바로가기

Jetpack Compose

[Jetpack Compose Side-effects] 2. rememberCoroutineScope

rememberCoroutineScope

Compose에서는 rememberCoroutineScope을 통해 해당 Composable의 Lifecylce을 따르는 CoroutineScope를 제공합니다. 여기까지만 보면 LaunchedEffect에서 제공하는 CoroutineScope과 동일한 기능을 하는 것처럼 보입니다. 하지만 LaunchedEffect는 Composable이기 때문에 다른 Composable 내부에서만 사용할 수 있습니다. remeberCoroutineScope을 활용하면 특정 Composable의 CoroutineScope을 하위의 다른 Composable에서도 이용할 수 있습니다.

 

아래 코드를 보면 SideEffectScreen()의 CoroutineScope을 remeberCoroutineScope으로 할당했고, 이를 Button() 내부에서 사용하고 있습니다. 해당 CoroutineScope는 SideEffectScreen()의 LifeCycle을 따르기 때문에 SideEffectScreen()이 종료되면 코루틴이 취소됩니다.

 

Composable 내부에서 코루틴을 이용하는 경우 Coroutine이 제대로 정리가 안된 상태에서 recomposition이 일어나게 되면 새로운 Coroutine이 계속 생성되어 앱에 치명적인 오류를 유발할 수 있기 때문에 Compose에서 제공하는 rememberCoroutineScope과 같은 기능을 사용하는 것이 좋습니다.

 

@Composable
fun SideEffectScreen() {
    Surface(
        modifier = Modifier.fillMaxSize()
    ) {
        val coroutineScope = rememberCoroutineScope()
        val context = LocalContext.current

        Column(
            modifier = Modifier.fillMaxSize(),
            horizontalAlignment = Alignment.CenterHorizontally,
            verticalArrangement = Arrangement.Center
        ) {
            Button(
                modifier = Modifier.wrapContentSize(),
                onClick = {
                    coroutineScope.launch {
                        Toast.makeText(context, "executed in SideEffectScreen Lifecycle", Toast.LENGTH_SHORT).show()
                    }
                }
            ) {
                Text("Click!")
            }
        }
    }
}