작성
·
108
0
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
}
MyWebView Compose의 파라메타로 ScaffoldState를 받았는데요. 이건 SnackBar를 위한 것인데 파라메타로 고차 함수를 받아 SnackBar에 띄울 메시지만 전달 해도 될 것 같은데 파라메타로 받는 것이 더 좋은 건가요?
@Composable
fun MyWebView(viewModel: MainViewModel, onSnack: (String) -> Unit {
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("더 이상 앞으로 갈 수 없음.")
}
}
}
3번에서 제가 잘못 코딩한 것이 아니라면 LaunchedEffect 하나 당 하나의 Flow만 처리가 가능한 것이라면 처리해야하는 Flow가 많다면 그 수 만큼 LaunchedEffect를 선언해야 한다면 뭔가 코드가 지저분해 질 것 같은데 좋은 방법은 없을까요?
답변 2
1
1
remember 는 상태 유지를 위해 사용하는데요. WebView 인스턴스의 마지막 상태를 기억하기 위해 사용했습니다.
고차함수로 메시지만 전달하면 Snackbar 관련 로직을 MyWebView 외부로 이동할 수 있기 때문에 관심사 분리가 되고, 추후에 테스트도 가능하기 때문에 더 나은 방법입니다.
3. 컴포즈 함수 내에서 suspend 함수를 안전하게 실행하기 위해 LaunchedEffect를 사용합니다. LaunchedEffect 는 코루틴 스코프이고 suspend 함수를 여러개 호출하면 앞에 것이 종료되어야 다음 것이 순차적으로 호출됩니다. collectLatest 함수는 suspend 함수이고 undoSharedFlow 의 값을 collectLatest 함수로 계속 수집하는 동안 다음 코드로 실행이 되지 않습니다.
4. combine 함수를 사용하면 2개 이상의 Flow 를 하나로 결합할 수 있습니다.