refactor(webview): 重构WebView组件实现

- 将rememberSaveable导入路径修正到saveable包下
- 移除未使用的Log导入并添加ViewGroup导入
- 添加FrameLayout用于WebView容器包装
- 使用FrameLayout作为WebView的父容器以改善布局控制
- 更新AndroidView的factory和update回调中的WebView引用方式
- 通过容器视图统一管理WebView生命周期和布局参数
- 更新发布版本号从0.4.9到0.4.10
这个提交包含在:
XuqmGroup 2026-05-11 18:58:51 +08:00
父节点 9e9b41fedb
当前提交 0fdfc048e7
共有 3 个文件被更改,包括 18 次插入8 次删除

查看文件

@ -2,4 +2,4 @@ org.gradle.jvmargs=-Xmx4096m -Dfile.encoding=UTF-8
android.useAndroidX=true android.useAndroidX=true
kotlin.code.style=official kotlin.code.style=official
android.nonTransitiveRClass=true android.nonTransitiveRClass=true
PUBLISH_VERSION=0.4.9 PUBLISH_VERSION=0.4.10

查看文件

@ -17,8 +17,8 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.rememberSaveable
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalClipboardManager import androidx.compose.ui.platform.LocalClipboardManager

查看文件

@ -6,7 +6,7 @@ import android.content.pm.PackageManager
import android.net.Uri import android.net.Uri
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import android.util.Log import android.view.ViewGroup
import android.webkit.JavascriptInterface import android.webkit.JavascriptInterface
import android.webkit.PermissionRequest import android.webkit.PermissionRequest
import android.webkit.ValueCallback import android.webkit.ValueCallback
@ -14,6 +14,7 @@ import android.webkit.WebChromeClient
import android.webkit.WebResourceRequest import android.webkit.WebResourceRequest
import android.webkit.WebViewClient import android.webkit.WebViewClient
import android.webkit.WebView import android.webkit.WebView
import android.widget.FrameLayout
import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
@ -201,7 +202,7 @@ fun XWebViewView(
AndroidView( AndroidView(
modifier = modifier, modifier = modifier,
factory = { ctx -> factory = { ctx ->
WebView(ctx).apply { val wv = WebView(ctx).apply {
settings.javaScriptEnabled = true settings.javaScriptEnabled = true
settings.domStorageEnabled = true settings.domStorageEnabled = true
settings.useWideViewPort = true settings.useWideViewPort = true
@ -279,12 +280,21 @@ fun XWebViewView(
if (config.url.isNotBlank()) { if (config.url.isNotBlank()) {
loadUrl(config.url) loadUrl(config.url)
} }
webView = this
} }
webView = wv
val container = FrameLayout(ctx)
container.addView(wv, FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT,
))
container
}, },
update = { view -> update = { container ->
if (view.url.isNullOrBlank() && config.url.isNotBlank()) { val wv = (container as? FrameLayout)?.getChildAt(0) as? WebView ?: return@AndroidView
view.loadUrl(config.url) if (wv.url.isNullOrBlank() && config.url.isNotBlank()) {
wv.loadUrl(config.url)
} }
}, },
) )