package com.xuqm.sdk.webview import android.annotation.SuppressLint import android.webkit.WebResourceRequest import android.webkit.WebViewClient import android.webkit.WebView import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.SideEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.viewinterop.AndroidView @SuppressLint("SetJavaScriptEnabled") @Composable fun XWebViewView( modifier: Modifier = Modifier, config: XWebViewConfig = getXWebViewConfig(), ) { var webView by remember { mutableStateOf(null) } var currentUrl by remember { mutableStateOf(config.url.ifBlank { null }) } DisposableEffect(Unit) { onDispose { if (getXWebViewController() != null) { setXWebViewController(null) } webView?.destroy() webView = null } } AndroidView( modifier = modifier, factory = { context -> WebView(context).apply { settings.javaScriptEnabled = true settings.domStorageEnabled = true config.userAgent?.let { settings.userAgentString = it } webViewClient = object : WebViewClient() { override fun onPageFinished(view: WebView?, url: String?) { currentUrl = url ?: view?.url?.toString() super.onPageFinished(view, url) } override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean { return false } } if (config.url.isNotBlank()) { loadUrl(config.url) } webView = this } }, update = { view -> if (view.url.isNullOrBlank() && config.url.isNotBlank()) { view.loadUrl(config.url) } }, ) SideEffect { val view = webView ?: return@SideEffect setXWebViewController(object : XWebViewController { override fun canGoBack(): Boolean = view.canGoBack() override fun canGoForward(): Boolean = view.canGoForward() override fun currentUrl(): String? = currentUrl ?: view.url override fun goBack() { if (view.canGoBack()) view.goBack() } override fun goForward() { if (view.canGoForward()) view.goForward() } override fun reload() { view.reload() } override fun loadUrl(url: String) { view.loadUrl(url) } }) } }