Jetpack Compose WebView 处理返回导航并转到上一页
Jetpack Compose WebView Handling Back Navigation And Go To Previous Page
我正在使用 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) })
在传统方式中,我们可以将 OnBackPressedDispatcher
添加到 Activity
以拦截后退按钮并通过 viewBinding 访问它在 WebView
内导航,例如具有以下功能WebView
喜欢 goBack()
并检查您是否可以返回 canGoBack()
。
但是我们如何使用这种 Jetpack Compose 方法实现同样的目标?
将 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()
}
WebViewClient
侦听 onPageStarted
检查 WebView 是否可以向后导航然后更新 backEnabled
。这会导致重新组合,从而打开和关闭 BackHandler。
我还将 loadUrl
移出 update
函数并移至 factory
中,因为每次重组时都会调用更新,而工厂只会调用一次。根据您的实施情况,这可能相关也可能不相关。
我正在使用 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) })
在传统方式中,我们可以将 OnBackPressedDispatcher
添加到 Activity
以拦截后退按钮并通过 viewBinding 访问它在 WebView
内导航,例如具有以下功能WebView
喜欢 goBack()
并检查您是否可以返回 canGoBack()
。
但是我们如何使用这种 Jetpack Compose 方法实现同样的目标?
将 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()
}
WebViewClient
侦听 onPageStarted
检查 WebView 是否可以向后导航然后更新 backEnabled
。这会导致重新组合,从而打开和关闭 BackHandler。
我还将 loadUrl
移出 update
函数并移至 factory
中,因为每次重组时都会调用更新,而工厂只会调用一次。根据您的实施情况,这可能相关也可能不相关。