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

Jetpack Compose中AndroidView内WebView加载内容为空是什么原因

问题原因
  • Jetpack Compose 中 AndroidView 的 factory 回调仅会在 View 首次初始化时执行 1 次:你传入的 viewModel.article 是响应式 State,初始状态下 article.value 大概率还未完成网络/数据库加载,singleArticle.content 为空,此时 factory 里的 loadData 已经执行完成。
  • 后续 viewModel.article 更新时,CustomWebView 虽然会重组,但 factory 不会重新触发,WebView 不会拿到更新后的 content 值;而外部的 Compose 元素本身会跟随 State 重组,所以可以正常显示最新值。
解决方案

将依赖可变参数的 WebView 加载逻辑放到 AndroidView 的 update 回调中,update 会在每次重组时传入最新的参数并执行,修正后的代码如下:

@Composable
fun CustomWebView(singleArticle: Article) {
    AndroidView(
        factory = { context ->
            // 仅需要初始化一次的配置放到factory中,比如WebSetting配置、JS开关等
            WebView(context).apply {
                settings.javaScriptEnabled = true
                // 初始化阶段不需要加载动态数据
            }
        },
        // 每次参数更新都会触发update回调,拿到最新的singleArticle
        update = { webView ->
            webView.loadData(singleArticle.content, "text/html", "UTF-8")
        }
    )
}

如果需要避免重复加载相同内容,可以在 update 回调中新增判断,仅当 singleArticle.content 和 WebView 已加载内容不一致时再执行加载逻辑。

内容的提问来源于stack exchange,提问作者Valynk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 08:09:00