如何使 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 (mutableStateOf(initUrl)) 需要一个 mutableState,这是获取缓存 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())
}
我有一个 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 (mutableStateOf(initUrl)) 需要一个 mutableState,这是获取缓存 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())
}