如何使Jetpack Compose AndroidView在新参数上运行新的viewBlock实例



我有一个Jetpack可组合函数,它将WebView实例封装在AndroidView:中

@Composable
fun createWebView(url: String, viewCache: WebViewCache) {
AndroidView(viewBlock = { context ->
viewCache.get(url, context)
}, update = { wv ->
Log.d("we are just updating")
}, modifier = Modifier.fillMaxSize())
}

它适用于传入的第一个url,但对于随后的不同url,只调用update方法。是否可以在给定不同参数的情况下调用viewBlock lambda?我意识到我可以在同一个WebView实例上调用loadUrl,但更愿意为我的应用程序缓存每个url的WebView。

您想要更改Composable的状态,因此您的URL需要一个mutableState(mutableStateOf(initUrl((,这是获取缓存WebView的关键。我不熟悉WebView,但我想你会在更新Lambda中获得新的URL。无论你在哪里获得新的URL,你都必须更新URL状态,告诉Compose Runtime更新你的UI。

@Composable
fun createWebView(initUrl: String, viewCache: WebViewCache) {
val context = ContextAmbient.current
val urlState = remember(initUrl) { mutableStateOf(initUrl) }
val cacheView = remember(urlState.value, context) {
viewCache.get(urlState.value, context)
}
AndroidView(
viewBlock = { cacheView },
update = { wv -> urlState.value = "newvalue" },
modifier = Modifier.fillMaxSize())
}

最新更新