You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Compose中mutableIntState变更后WebView不重组问题求助

问题解决:Compose中WebView不响应字体大小更新的问题

问题根源

你实现的MyCustomWebView里,AndroidView仅通过factory创建一次WebView实例,后续fontSize参数变化时,没有触发任何WebView的更新逻辑——factory只会在Composable首次初始化时执行,所以WebView不会重新加载带新字体样式的内容,也不会调整自身设置。

另外注意你MyScreen里的笔误:传递给MyCustomWebView的fontSize应该是myViewModel.fontSize,而非直接写fontSize。

可行解决方案

方案1:利用AndroidView的update回调

给AndroidView添加update参数,当fontSize或html变化时,重新加载带新样式的HTML内容:

@Composable
fun MyCustomWebView(html: String, fontSize: Int) {
    val context = LocalContext.current
    // 用remember缓存拼接后的HTML,避免重复计算
    val htmlStyled = remember(html, fontSize) {
        "<html><head><style>body,p,h1,h2,h3,span,a{font-size: ${fontSize}px!important;}</style></head><body>${html}</body></html>"
    }

    AndroidView(
        modifier = Modifier.fillMaxWidth(),
        factory = {
            WebView(context).apply {
                webViewClient = WebViewClient()
                settings.cacheMode = WebSettings.LOAD_NO_CACHE
                settings.setRenderPriority(WebSettings.RenderPriority.HIGH)
                settings.javaScriptEnabled = true
                settings.domStorageEnabled = true
                settings.allowFileAccess = true
            }
        },
        // 参数变化时执行更新逻辑
        update = { webView ->
            webView.loadDataWithBaseURL("", htmlStyled, "text/html", "UTF-8", "")
            
            // 如果想用废弃的textSize属性,也在这里更新
            /*webView.settings.textSize = when (fontSize) {
                16 -> WebSettings.TextSize.SMALLEST
                18 -> WebSettings.TextSize.SMALLER
                21 -> WebSettings.TextSize.NORMAL
                23 -> WebSettings.TextSize.LARGER
                else -> WebSettings.TextSize.LARGEST
            }*/
        }
    )
}

方案2:用remember保存WebView实例,手动触发更新

通过remember持久化WebView实例,借助LaunchedEffect监听参数变化并更新:

@Composable
fun MyCustomWebView(html: String, fontSize: Int) {
    val context = LocalContext.current
    // 持久化WebView实例
    val webView = remember {
        WebView(context).apply {
            webViewClient = WebViewClient()
            settings.cacheMode = WebSettings.LOAD_NO_CACHE
            settings.setRenderPriority(WebSettings.RenderPriority.HIGH)
            settings.javaScriptEnabled = true
            settings.domStorageEnabled = true
            settings.allowFileAccess = true
        }
    }

    // 监听html或fontSize变化,重新加载内容
    LaunchedEffect(html, fontSize) {
        val htmlStyled = "<html><head><style>body,p,h1,h2,h3,span,a{font-size: ${fontSize}px!important;}</style></head><body>${html}</body></html>"
        webView.loadDataWithBaseURL("", htmlStyled, "text/html", "UTF-8", "")
    }

    AndroidView(
        modifier = Modifier.fillMaxWidth(),
        factory = { webView }
    )
}

内容的提问来源于stack exchange,提问作者Mohammad Ali Fouani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 16:23:16