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
相关产品推荐
相关产品推荐

