@Composable 调用只能在 @Composable 函数 - Jetpack 的上下文中发生

问题描述 投票:0回答:1
@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 函数的上下文中发生”的错误。任何人请帮我解决问题。

android kotlin android-jetpack-compose android-webview
1个回答
2
投票

您遇到此错误是因为当您调用内部用

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/"
                    }
                )
        )
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.