87 行
2.9 KiB
Kotlin
87 行
2.9 KiB
Kotlin
|
|
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<WebView?>(null) }
|
||
|
|
var currentUrl by remember { mutableStateOf<String?>(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)
|
||
|
|
}
|
||
|
|
})
|
||
|
|
}
|
||
|
|
}
|