如何在 onClick 事件中调用可组合函数

9
这是一个可组合的函数。当我点击CardView时,文章应该在Android视图中打开。我不确定如何实现这一点。
我也尝试过使用lambda,但没有成功。
我希望在单击NewsCardView(Card View)函数时调用可组合函数ShowOnWebView,但编译器显示错误:
"@Composable invocations can only happen from the context of a @Composable function"
当单击CardView时如何调用我的函数?
@Composable
fun NewsCardView(
article: Article,
modifier: Modifier = Modifier,
) {
Card(
    modifier = modifier
        .height(150.dp)
        .fillMaxWidth()
        .padding(2.dp)
        .clickable {
        // I want to call ShowOnWebView here
        },
    elevation = 5.dp,
    backgroundColor = Color.White
) {
    val painter = rememberImagePainter(data = article.urlToImage) {
        crossfade(1000)
        error(R.drawable.ic_placeholder)
        placeholder(R.drawable.ic_placeholder)

    }
    Row(
        modifier = Modifier
            .fillMaxSize(),
        verticalAlignment = Alignment.CenterVertically,
        horizontalArrangement = Arrangement.SpaceEvenly
    ) {
        Column(
            modifier = Modifier.fillMaxWidth(.3f),
            verticalArrangement = Arrangement.Center,
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            Image(
                modifier = Modifier.size(100.dp),
                painter = painter,
                contentDescription = "News",
                contentScale = ContentScale.Crop,
            )
            Text(
                text = article.author ?: "",
                fontSize = 12.sp,
            )
            Text(
                text = article.publishedAt,
                fontSize = 12.sp,
            )
        }
        Column(
            modifier = Modifier.fillMaxWidth(.7f),
            verticalArrangement = Arrangement.Center,
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            Text(modifier = Modifier.fillMaxWidth(),
                text = article.title,
                color = Color.Black,
                fontWeight = FontWeight.Bold,
                fontSize = 16.sp
            )
            Text(modifier = Modifier.fillMaxWidth(),
                text = article.description ?: "",
                color = Color.Black,
                fontWeight = FontWeight.Medium,
                fontSize = 14.sp
            )
        }
    }

    }

    }

这个可组合函数在AndroidView中显示一篇文章:

   @Composable
   fun ShowOnWebView(url:String) {
   val context= LocalContext.current

    AndroidView(factory = {
    WebView(context).apply {
        webViewClient= WebViewClient()
        loadUrl(url)
    }
   })
   }
1个回答

16
你不能在非组合范围内调用组合函数。你应该有一个带有布尔值的状态,并在想要显示组合时将其设置为true。
var showWebView by remember {mutableState(false)}

Modifier.clickable {
  showWebView = true
}

if(showWebView) {
  ShowOnWebView(someUrl)
}

这也是我们显示对话框或条件组合元素(如加载、结果、错误)的方式。它也用于扩展或缩小的组合元素。


1
Button.onClick是什么情况? - IgorGanapolsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接