Jetpack Compose WebView 处理后退导航并转到上一页

J. *_*egg 7 android android-webview kotlin onbackpressed android-jetpack-compose

我正在使用 Jetpack Compose,并将其WebView封装在一个AndroidView可组合项中,如下所示:

AndroidView(modifier = modifier, factory = { context ->
        WebView(context).apply {
            layoutParams = ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT
            )
            webViewClient = WebViewClient()
            settings.javaScriptEnabled = true
        }
    }, update = { webView -> webView.loadUrl(url) })
Run Code Online (Sandbox Code Playgroud)

在传统方式中,我们可以向 中添加OnBackPressedDispatcherActivity拦截后按,并WebView通过 viewBinding 访问它来在 中导航,例如使用类似的函数WebViewgoBack()检查是否可以返回canGoBack()

但是我们如何使用 Jetpack Compose 方法实现相同的目标呢?

Sco*_*per 24

将 WebView 分配给外部变量似乎没有任何问题,所以这就是我在这里所做的。

var backEnabled by remember { mutableStateOf(false) }
var webView: WebView? = null
AndroidView(
    modifier = modifier,
    factory = { context ->
        WebView(context).apply {
            layoutParams = ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT
            )
            webViewClient = object : WebViewClient() {
                override fun onPageStarted(view: WebView, url: String?, favicon: Bitmap?) {
                    backEnabled = view.canGoBack()
                }
            }
            settings.javaScriptEnabled = true

            loadUrl(url)
            webView = this
        }
    }, update = {
        webView = it
    })

BackHandler(enabled = backEnabled) {
    webView?.goBack()
}
Run Code Online (Sandbox Code Playgroud)

监听WebViewClientonPageStarted检查 WebView 是否可以向后导航然后更新backEnabled。这会导致重新组合,从而打开和关闭BackHandler

我也已经loadUrlupdate函数中移出factory,因为每次重组时都会调用更新,而工厂只被调用一次。根据您的实施情况,这可能相关也可能不相关。

  • 你甚至应该“记住”webView。 (2认同)