• 카테고리

    질문 & 답변
  • 세부 분야

    모바일 앱 개발

  • 해결 여부

    미해결

왜 update 내부에서 코루틴으로 launch 하면 버그가 발생하나요?

22.04.26 23:44 작성 조회수 221

0

03나만의웹브라우저
 
왜 update 내부에서 코루틴으로 launch 하면 버그가 발생하나요?
 
초기에 웹뷰에서 빈 공백으로 검색한 후 뒤로가기 두번 하는 경우
뒤로 더이상 갈 수 없다는 스낵바가 계속 뜨는 버그인데
 
컴포지션이 일어날 때 update 를 하면..
 
새로운 url 이 오면 실행되고..
flow 의 collectaLatest 를 통해서 뒤로가기가
canGoBack 이 아닐 때 collectLatest 로 한번만 받아오면
똑같이 한번 떠야하는게 아닌가요?
 
왜 무한 반복으로 뜨는지 버그에 대한 자세한 설명이 부족한것 같습니다 ㅠㅠ
 
scope.launch {
viewModel.undoSharedFlow.collectLatest {
if (webView.canGoBack()) {
webView.goBack()
} else {
scaffoldState.snackbarHostState.showSnackbar("더 이상 뒤로 갈 수 없음")
}
}
}

scope.launch {
viewModel.redoSharedFlow.collectLatest {
if (webView.canGoForward()) {
webView.goForward()
} else {
scaffoldState.snackbarHostState.showSnackbar("더 이상 앞으로 갈 수 없음")
}
}
}

답변 1

답변을 작성해보세요.

1

UI 요소가 변경되면 컴포지션이 다시 수행되는 동안 scope.launch 는 반복해서 코루틴을 생성합니다.

그래서 최신 버전 안드로이드 스튜디오에서는 아래와 같이 코드를 작성하면 이를 fix 하도록 가이드 하고 있네요.

컴포저블 내부에서 코루틴을 시작해야 한다면 LaunchedEffect를 사용하도록 안내하고 있습니다.

컴포저블은 UI를 그리는 요소이고 반복해서 호출될 수 있습니다. 이럴 경우 한번만 실행하게 하는 장치가 LaunchedEffect 입니다.

LaunchedEffect 는 이미 수행중인 코루틴이 있을 경우 취소후 다시 실행해 줍니다.

 

y216100님의 프로필

y216100

질문자

2022.04.27

컴포지션 시 컴포저블 내부 코루틴의 경우 반복해서 생성될 여지가 있어서, 반복 되는 버그가 발생하는 것이었군요..!

그래서 그대신 LaunchedEffect 를 사용해서 해결이 가능한거였군요 이해가 되었습니다.

답변 감사합니다! 😄