使用Jetpack Compose的TextField组件时出现报错是什么原因?
报错原因与修复方案
1. @Composable invocations can only happen from the context of a @Composable function 报错修复
触发该报错的常见解决路径:
- 确认当前编写代码的函数、调用链上所有父级函数都添加了
@Composable注解 - 检查项目中Compose编译器版本与Kotlin版本是否匹配,版本不兼容会导致注解识别异常,可查询Jetpack Compose官方版本兼容对应表确认适配的版本组合
- 确认你传入
label等参数的lambda是Composable类型,官方TextField的label、placeholder等装饰参数本身就是@Composable () -> Unit类型,依赖版本正常的情况下不会出现类型不匹配问题
2. None of the following functions can be called with the arguments supplied 报错修复
该报错是参数与TextField函数签名不匹配导致,和Kotlin命名参数规则无关:Kotlin命名参数本身不受声明顺序限制,只要参数名、类型、必填项都符合要求,任意顺序传参都可以正常运行。你存在三个错误点:
- 漏传必填参数:
TextField的value和onValueChange是无默认值的必填参数,必须显式传入,和参数顺序无关 - 参数类型错误:
placeholder参数的类型是@Composable () -> Unit,不是String类型,不能直接传入字符串资源,需要用Composable lambda包裹Text组件 - 额外错误:你代码中
Text组件的字符串拼接多写了一个闭合大括号,需要删除
修复后的完整代码示例
Row(Modifier.padding(dimensionResource(id = R.dimen.container_edge_padding))) { Text( text = "${stringResource(id = R.string.email)} : ", // 已删除多余的闭合大括号 modifier = Modifier .padding(0.dp) .padding(end = dimensionResource(id = R.dimen.child_edge_padding)) ) TextField( value = "", onValueChange = { /* 输入变化处理逻辑,无需求可留空 */ }, placeholder = { Text(stringResource(id = R.string.login_email_hint)) }, modifier = Modifier .padding(0.dp) .padding(end = dimensionResource(id = R.dimen.child_edge_padding)) ) }
含label参数的TextField正确写法
TextField( value = "", onValueChange = { }, label = { Text("Label") }, modifier = Modifier .padding(0.dp) .padding(end = dimensionResource(id = R.dimen.child_edge_padding)) )
内容的提问来源于stack exchange,提问作者Jason Crosby
相关产品推荐
相关产品推荐

