inflearn logo
강의

講義

知識共有

モダンアンドロイド - Jetpack Compose入門

独自のWebブラウザ03 - UIとViewModelの連動

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

205

makin

投稿した質問数 7

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를 선언해야 한다면 뭔가 코드가 지저분해 질 것 같은데 좋은 방법은 없을까요?

android kotlin jetpack

回答 2

1

makin

상세한 답변 감사합니다.

1

survivalcoding

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

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

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

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

ViewModel 사용 관련 질문

0

75

1

onTabFavorite 콜백 관련 질문

0

60

2

livedata가 왜 필요한 건지 궁금합니다

0

128

3

깃허브에 있는 MemoryTodoRepository 는 룸을 사용하는게 아닌 메모리에 저장, 수정, 삭제 하는건가요?

0

172

1

이젠 아래와 같은 오류가 뜨는데 KSP가 문제 인걸까요?

0

369

2

영상 1분쯤에서 MainActivity에서 viewModel이 저는 안되고 그래들 문제인거 같은데 해결 방법을 모르겠습니다.

0

186

1

전자액자에서 영상과 깃허브의 내용이 달라서 영상을 다보고 깃허브 내용으로 돌려봤는데 권한요청부터가 안됩니다.

0

189

2

Navigation수업에서 string대신 bitmap을 인자로 넘겨주는 방법?

0

177

1

TodoList - 04에서 recentlyDeleteTodo가 null일 경우 처리 방법 문의

0

171

1

Scaffold를 사용하면 Content padding parameter it is not used 에러

0

349

1

Material3로 바뀌면서 강의랑 다른 부분이 초반부터 있는데요.

0

221

1

강의에서 사용하는 리소스(이미지 등)을 다운 받을 수 있으면 좋겠어요.

0

248

2

Card Compose에서 elevation 옵션

1

347

1

구글맵 질문입니다

0

233

1

구글맵강의중에서 ..

0

578

7

drawCircle( color = Color.... 부분에서 빨간줄이 ...

0

269

2

val scaffoldState = rememberScaffoldState() 에서 빨간줄이 생기네요

0

524

1

나만의 웹브라우져 02 코드실행시 에뮬레이터에 따라

0

221

1

나만의 웹브라우져 01 코딩 후 실행하면 아래와 같은 오류가 뜨네요

0

3221

2

비만도계산기 로직작성 에서 문제가 발생했어요 ^^

0

338

3

viewModel() 오류 추가질문입니다

0

1118

2

viewModel: MainViewModel = viewModel() 에 오류있습니다

0

537

3

AAR metadata 관련오류발생

0

1437

3

모바일화면에 키보드가 사라지지 않아

0

250

1