• 카테고리

    질문 & 답변
  • 세부 분야

    모바일 앱 개발

  • 해결 여부

    미해결

나만의 웹 브라우저 03 - UI와 ViewModel 연동 강의에서 질문들이 있습니다.

24.05.21 14:58 작성 조회수 64

0

  1. WebView를 remember로 만든 이유가 무엇인가요?

@Composable
fun rememberWebView(): WebView {
    val context = LocalContext.current
    val webView = remember {
        WebView(context).apply {
            settings.javaScriptEnabled = true
            webViewClient = WebViewClient()
            loadUrl("https://google.com")
        }
    }

    return webView
}

 

  1. MyWebView Compose의 파라메타로 ScaffoldState를 받았는데요. 이건 SnackBar를 위한 것인데 파라메타로 고차 함수를 받아 SnackBar에 띄울 메시지만 전달 해도 될 것 같은데 파라메타로 받는 것이 더 좋은 건가요?

@Composable
fun MyWebView(viewModel: MainViewModel, onSnack: (String) -> Unit {

 

  1. LaunchedEffect를 2개를 선언하고 각각 사용을 하였는데요. 하나의 LaunchedEffect에 둘 다를 넣고 사용하면 뒤에껏이 동작을 안하던데 혹시 그 이유를 알 수 있을까요?

LaunchedEffect(key1 = Unit) {
    viewModel.undoShardFlow.collectLatest {
        if (webView.canGoBack()) {
            webView.goBack()
        } else {
            scaffoldState.snackbarHostState.showSnackbar("더 이상 뒤로 갈 수 없음.")
        }
    }

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

 

  1. 3번에서 제가 잘못 코딩한 것이 아니라면 LaunchedEffect 하나 당 하나의 Flow만 처리가 가능한 것이라면 처리해야하는 Flow가 많다면 그 수 만큼 LaunchedEffect를 선언해야 한다면 뭔가 코드가 지저분해 질 것 같은데 좋은 방법은 없을까요?

답변 2

·

답변을 작성해보세요.

1

makin님의 프로필

makin

질문자

2024.05.22

상세한 답변 감사합니다.

1

  1. remember 는 상태 유지를 위해 사용하는데요. WebView 인스턴스의 마지막 상태를 기억하기 위해 사용했습니다.

  2. 고차함수로 메시지만 전달하면 Snackbar 관련 로직을 MyWebView 외부로 이동할 수 있기 때문에 관심사 분리가 되고, 추후에 테스트도 가능하기 때문에 더 나은 방법입니다.

3. 컴포즈 함수 내에서 suspend 함수를 안전하게 실행하기 위해 LaunchedEffect를 사용합니다. LaunchedEffect 는 코루틴 스코프이고 suspend 함수를 여러개 호출하면 앞에 것이 종료되어야 다음 것이 순차적으로 호출됩니다. collectLatest 함수는 suspend 함수이고 undoSharedFlow 의 값을 collectLatest 함수로 계속 수집하는 동안 다음 코드로 실행이 되지 않습니다.

4. combine 함수를 사용하면 2개 이상의 Flow 를 하나로 결합할 수 있습니다.

채널톡 아이콘