WebViewでは、バックキー(戻るボタン)を押した場合に前のページに戻る(ブラウザバック)のが一般的な動作かと思います。
本記事では、WebViewをJetpack Composeで使った場合の、バックキーで前ページに戻る方法をメモとして投稿します。
コード
@Composable
fun MyWebView() {
// 1
val backPressed = remember { mutableStateOf(false) }
// 2
AndroidView(
factory = { context ->
WebView(context).apply {
webViewClient = object : WebViewClient() {}
}.also {
it.loadUrl("https://qiita.com")
}
},
// 4
update = { webView ->
if (backPressed.value) {
backPressed.value = false
if (webView.canGoBack()) {
webView.goBack()
} else {
// 前のページがない場合の処理(画面を閉じるなど)
}
}
},
)
// 3
BackHandler(
enabled = true,
onBack = {
backPressed.value = true
},
)
}
コードのポイント
ポイントとなる箇所1〜4を説明します。
-
バックキーを押したかどうかの状態
backPressedを定義します。 -
AndroidViewを使ってWebViewを表示させます。 -
一番のポイントです。
BackHandlerを使って、バックキーのハンドリングを行います。バックキーが押されたタイミングでonBackのラムダが呼ばれるので、バックキーの押下状態を変更します。 -
状態を変化させると再コンポーズされ、
AndroidViewのupdateが呼ばれるので、そこでbackPressedをチェックし、押された状態であればWebViewのgoBack()を呼び出し前のページに戻ります。