DroidKaigi.onCompletion { 2023@Online } の発表資料です https://yumemi.connpass.com/event/289949/
サンプルコード https://github.com/mkeeda/webview-sandbox
WebViewDroidKaigi.onCompletion {2023@Online }(@mr_mkeeda)
View Slide
About meTwitter: @mr_mkeedaGithub: @mkeedaAndroid Engineer at Cybozu, Inckintone2
WebViewWebView3
WebViewURL/HTML 4
UI5WebView FragmentloadUrl( URL)reload()WebViewClientonPageStarted()onPageFinished()shouldOverrideUrlLoading()
WebView FragmentloadUrl( URL)reload()WebViewClientonPageStarted()onPageFinished()shouldOverrideUrlLoading()6Fragment500 WebView
7https://developer.android.com/topic/architecture
UI8UIElementsUIState= UI
: Web9UIElementsUIState= UIWebView URL Web=
= URL10UI elementsWebViewUI stateURL A =UIWebAUI elementsWebViewUI stateURL B =UIWebB
WebView11UI elementsWebViewState holderViewModelUI stateURL3. URL2. URL(UI event)1. URL4. URL
12UI elementsWebViewState holderViewModelUI stateURLUI stateUI state
WebViewandroid.widget UI stateCallbackUI state WebView13UI stateURLUI elementsWebView
URL14WebViewClientshouldOverrideUrlLoading()UI elementsWebViewUI stateURL AState holderViewModel❌return trueloadUrl()UI stateURL BWebViewClient# shouldOverrideUrlLoading()true URLURLUI stateURL B
15class WebViewModel : ViewModel() {private val _currentUrl =MutableStateFlow(Uri.parse("https://www.google.com"))val url: StateFlow = _currentUrl.asStateFlow()fun onPageLoad(newUrl: Uri) {_currentUrl.update { currentUrl ->// ҙͷϩδοΫ// …newUrl}}}// Composeableؔval url by viewModel.url.collectAsStateWithLifecycle()WebScreen(url = url,onUrlChanged = { newUrl ->viewModel.onPageLoad(newUrl)})
16@Composablefun WebScreen(url: Uri,onUrlChanged: (Uri) -> Unit) {AndroidView(factory = { context ->WebView(context).apply {webViewClient =MyWebViewClient(onUrlChanged)}},update = { webView ->webView.loadUrl(url.toString())})}class MyWebViewClient(private val onUrlChanged: (Uri) -> Unit) : WebViewClientCompat() {override fun shouldOverrideUrlLoading(view: WebView,request: WebResourceRequest): Boolean {onUrlChanged(request.url)return true}}
WebView UI state https://github.com/mkeeda/webview-sandbox WebView17Do not call WebView#loadUrl(String) with the request's URL and then return true.This unnecessarily cancels the current load and starts a new load with the same URL.https://developer.android.com/reference/android/webkit/WebViewClient