Compose의 early return

강현석·2023년 7월 19일
1

troubleshooting

목록 보기
5/7
post-custom-banner

Crash

  • release로 빌드할 경우, Composable 함수 내에 early return이 있다면 Crash 발생
    • Compose를 초기에 도입했었다면, 한번쯤 겪어봤을법한 문제
Fatal Exception: f0.h: Compose Runtime internal error. Unexpected or incorrect use of the Compose internal runtime API (Missed recording an endGroup). Please report to Google or use https://goo.gle/compose-feedback
       at androidx.compose.runtime.ComposerKt.composeRuntimeError(Composer.kt:15)
       at androidx.compose.runtime.ComposerImpl.recordEndGroup(ComposerImpl.java:889)
       at androidx.compose.runtime.ComposerImpl.end(ComposerImpl.java:889)
       at androidx.compose.runtime.ComposerImpl.endGroup(ComposerImpl.java:1)
       at androidx.compose.runtime.ComposerImpl.endRoot(ComposerImpl.java:1)
       at androidx.compose.runtime.ComposerImpl.doCompose(ComposerImpl.java:130)
       at androidx.compose.runtime.ComposerImpl.recompose$runtime_release(ComposerImpl.java:35)
...

Early return

코드의 depth가 깊어지면 복잡해지므로, depth를 최소화하기 위해 사용하는 방법

@Composable
fun ContentLoading(isLoading: Boolean) {
    Box(
        modifier = Modifier.fillMaxSize(),
        contentAlignment = Alignment.Center
    ) {
        if (isLoading) {
            CircularProgressIndicator(
                modifier = Modifier.wrapContentSize()
            )
        }
    }
}

위 코드에 early return을 적용하면 depth를 줄일 수 있음

@Composable
fun ContentLoading(isLoading: Boolean) {
    Box(
        modifier = Modifier.fillMaxSize(),
        contentAlignment = Alignment.Center
    ) {
        if (isLoading.not()) return
        CircularProgressIndicator(
            modifier = Modifier.wrapContentSize()
        )
    }
}

Compose Compiler

Testing

  • release 빌드에서만 발생하므로, 구글 플레이 콘솔의 내부 앱 공유 기능을 활용하여 테스트 진행
  • 위의 앱은 Compose Compiler 1.4버전, 아래 앱은 Compose Compiler 1.3 버전 사용
    • 블로그를 쓸 줄 알았으면 버전명을 구분해둘걸

Test Result

Compose VerCompiler VerCrash 여부
1.4.0-alpha011.4.0-alpha01X
1.3.31.3.2O

Summary

  • Compose Compiler 1.4.0 버전부터 early return을 사용할 수 있음
profile
볼링을 좋아하는 안드로이드 개발자
post-custom-banner

0개의 댓글