微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我在使用 Jetpack Compose TextField 时遇到错误?

如何解决为什么我在使用 Jetpack Compose TextField 时遇到错误?

编辑
我仍在努力让它发挥作用。我现在有,并且在标签Text 上出现错误。我在一个用@Composable 标记函数中。 TextField 也有类似的问题。

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

TextField(
    value = "Text(text = \"\")",onValueChange = {  },label = { Text("Label") },// copied from android developer website
    Modifier
        .padding(0.dp)
        .padding(end = dimensionResource(id = R.dimen.child_edge_padding))
     )
}

结束编辑
我正在尝试制作一个登录屏幕,我正在使用 TextField 来允许用户输入电子邮件和密码。我看不出我的东西有什么问题,但我收到了一个错误

以下函数都不能用参数调用 提供。


这是我的代码的一部分:
Row(Modifier.padding(dimensionResource(id = R.dimen.container_edge_padding))) {
    Text(
        text = "${stringResource(id = R.string.email)}} : ",Modifier
            .padding(0.dp) // equivalent to padding inside
            .padding(end = dimensionResource(id = R.dimen.child_edge_padding)) // second padding acts as to margin putting space on the inside of the item
        )
    TextField(
        value = "",placeholder = stringResource(id = R.string.login_email_hint),Modifier
            .padding(0.dp)
            .padding(end = dimensionResource(id = R.dimen.child_edge_padding))
    )
}

当我将鼠标悬停在它上面时,这就是我所看到的。

enter image description here

使用参数的名称,我使用哪些参数或它们相对于声明的位置无关紧要。如果我像这样更改它,因为前 3 个参数是值、占位符、修饰符它起作用。但两者都应该工作,因为这就是命名参数的工作方式。提供认值允许这样做。我可以让它工作的唯一方法是按参数声明的顺序使用参数。这意味着如果我想使用 placeHolder 我必须使用它之前的每个参数的名称,按照它声明的顺序,以便使用它。唯一必须正确声明的是 valueonValueChange,因为只有这两个没有声明认值。

TextField(
    value = "",onValueChange = {},Modifier
        .padding(0.dp)
        .padding(end = dimensionResource(id = R.dimen.child_edge_padding))
)

解决方法

占位符参数有一些您尝试使用的另一种类型:

nums[nums[2]-1],nums[2] = nums[2],nums[nums[2]-1]

nums[nums[2]-1],nums[3]

nums[nums[2]-1],nums[2] = 4,3

nums[nums[2]-1] = 4
nums[2] = 3

nums[4-1] = 4
nums[2] = 3

nums[3] = 4
nums[2] = 3
print(nums)
# [1,2,3,4]

原因:它不能使用 placeholder: @Composable (() -> Unit)? = null, 而不是 String

,

试试下面的代码,它会帮助你。

 TextField(
        value = "ab",onValueChange ={},modifier = Modifier
            .padding(0.dp)
            .padding(end = dimensionResource(id = R.dimen.child_edge_padding)),enabled = true,readOnly = false,textStyle = TextStyle.Default,placeholder = {stringResource(id = R.string.login_email_hint)},visualTransformation = VisualTransformation.None,keyboardOptions = KeyboardOptions.Default,keyboardActions = KeyboardActions(onDone = { }),maxLines = 1
    )
,

正如荧光笔所指出的,TextField 有两种变体。由于您将第一个参数值作为字符串提供,因此您正在使用第二个变体。第二个变体调用 (String) -> Unit,它是 onValueChange 参数。您自己说必须提供它,而您自己没有在代码中提供它(代码段 1)。这就是为什么它与变体不匹配

,

我终于像@Dharmender Manral 所说的那样通过这样做来实现它

TextField(
    value = "",onValueChange = {  },Modifier
        .padding(0.dp)
        .padding(start = dimensionResource(id = R.dimen.child_edge_padding)),textStyle = LocalTextStyle.current,label = { Text("Label") },placeholder = { Text(text = stringResource(id = R.string.login_password_hint)) }
)

然后我就可以做到这一点
TextField(
    value = "",//  enabled = true,//  readOnly = false,//  textStyle = LocalTextStyle.current,placeholder = { Text(text = stringResource(id = R.string.login_password_hint)) }
)

唯一的问题是 `Modifier` 有一个默认参数,所以它是可选的,应该能够以任何顺序放置。我得到了这个工作,我能够切换`placeHolder`和`label`,所以`placeHolder`是第一个,它仍然像它应该的那样工作。我有一种感觉,这是某个地方的错误,因为一旦我将 `modifier` 移动到不同的位置,它就会再次崩溃。但是因为 `modifier` 有一个默认参数,它是一个选项,应该能够像我使用 `placeholder` 和 `label` 那样移动到任何位置。

因此,有效和无效之间的唯一区别是,只要前 3 个参数位于正确的位置并且以正确的顺序,其他参数的工作就像您期望的默认参数一样工作。让他们处于任何位置。不知道为什么它不适用于 modifier

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。