본문 바로가기
Kotlin 문법

[Kotlin] why migrate from collectAsState() to collectAsStateWithLifecycle()

by ftbd 2023. 11. 3.

collectAsState()는 어떤 문제가 있으며 왜 collectAsStateWithLifecycle()로 마이그레이션 해야할까요?

collectAsStateWithLifecycle()은 백그라운드 상태와 같은 불필요한 상황에 앱 자원을 절약해줍니다. 위치 또는 네트워크 최신화, 데이터베이스 연결 등의 자원 낭비를 막아주죠.

 

collectAsStateWithLifecycle()은 flow에서 데이터를 수집하는 Composable 함수고 lifecycle에 따라 최신 상태값을 노출합니다. 기본적으로 collectAsStateWithLifecycle()은 Lifecycle.State.STARTED를 사용하여 flow에서 값을 수집하고 중지합니다.

 

위 이미지를 보시면 collectAsState() 함수는 백그라운드와 같은 때에도 flow에서 데이터를 수집하므로 자원 낭비가 발생합니다. 반면에 collectAsStateWithLifecycle()는 Lifecycle 주기에 맞춰 flow에서 데이터 수집을 중단하고 재개하는 기능을 수행합니다.

 

@OptIn(ExperimentalLifecycleComposeApi::class)
@Composable
fun AuthorRoute(
  onBackClick: () -> Unit,
  modifier: Modifier = Modifier,
  viewModel: AuthorViewModel = hiltViewModel()
) {
  val uiState: AuthorScreenUiState by viewModel.uiState.collectAsStateWithLifecycle()

  AuthorScreen(
    authorState = uiState.authorState,
    newsState = uiState.newsState,
    modifier = modifier,
    onBackClick = onBackClick,
    onFollowClick = viewModel::followAuthorToggle,
  )
}

 

 

collectAsStateWithLifecycle() 사용하기 위해 gradle에 다음과 같이 추가해주도록 합니다!

dependencies {
    implementation "androidx.lifecycle:lifecycle-runtime-compose:$latest_version"
}

 

앱 자원 낭비가 발생하지 않도록 마이그레이션하는 것이 좋을 것 같네요!

 

Reference

https://medium.com/androiddevelopers/consuming-flows-safely-in-jetpack-compose-cde014d0d5a3