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

问题描述

我有一个Jetpack Composable函数,该函数将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())
}