繁体   English   中英

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

[英]How can I make Jetpack Compose AndroidView run a new viewBlock instance on new parameters?

我有一个 Jetpack Composable 函数,它在 AndroidView 中包装了一个 WebView 实例:

@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。

您想更改可组合的状态,因此您的 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())
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM