@SuppressLint("SetJavaScriptEnabled")
@Composable
fun WebPageScreen(urlToRender: String) {
AndroidView(factory = {
WebView(it).apply {
layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
)
webViewClient = WebViewClient()
loadUrl(urlToRender)
}
}, update = {
it.loadUrl(urlToRender)
})
}
@Composable
fun MainContent() {
val context = LocalContext.current
Column(
modifier = Modifier
.fillMaxSize()
.background(Color(0xFFFEFEFA))
.padding(16.dp),
verticalArrangement = Arrangement.spacedBy(32.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
Image(
painter = painterResource(id = R.drawable.link), contentDescription = "Localized description", contentScale = ContentScale.Crop, modifier = Modifier
.fillMaxWidth()
.height(150.dp)
.clickable(enabled = true, onClickLabel = "Clickable image",
onClick = {
WebPageScreen("https://www.google.co.in/")
}
)
)
}
}
这是我的代码,我想在单击图像时实现 webview,我收到类似“@Composable 调用只能在 @Composable 函数的上下文中发生”的错误。任何人请帮我解决问题。
您遇到此错误是因为当您调用内部用
onClick
注释的函数时 @Composable
不是可组合项 (WebPageScreen)
@Composable 调用只能在 a 的上下文中发生 @可组合函数
要么删除
@Composable
中的 WebPageScreen
注释,但我不确定是否会破坏某些内容(尚未在撰写中尝试过 webviews)。
@SuppressLint("SetJavaScriptEnabled")
@Composable // <- remove this line
fun WebPageScreen(urlToRender: String) { ... }
或者您可以尝试像这样使用
url
mutableState
,其初始状态是空字符串,单击图像后,其值将发生变化,强制 MainContent
变为 re-compose
并调用 WebPageScreen(<url>)
@Composable
fun MainContent() {
...
var url by remember {
mutableStateOf("")
}
// at first composition pass this will be ignored
if (url.isNotBlank()) {
WebPageScreen(url)
}
Column(
...
) {
Image(
...
...
.clickable(enabled = true, onClickLabel = "Clickable image",
onClick = {
// setting a value to this will trigger re-composition of MainContent, satisfying your if condition above
url = "https://www.google.co.in/"
}
)
)
}
}