【问题标题】:Why am I getting an error using Jetpack Compose TextField?为什么我在使用 Jetpack Compose TextField 时会出错?
【发布时间】:2021-09-10 01:59:29
【问题描述】:

编辑
我仍在努力让它发挥作用。我现在有并且我在标签的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))
    )
}

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

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

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

【问题讨论】:

    标签: android kotlin parameters default-value android-jetpack-compose


    【解决方案1】:

    我终于像@Dharmender Manral 所说的那样做到了

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

    然后我能够做到这一点
    TextField(
        value = "",
        onValueChange = {  },
        Modifier
            .padding(0.dp)
            .padding(start = dimensionResource(id = R.dimen.child_edge_padding)),
    //  enabled = true,
    //  readOnly = false,
    //  textStyle = LocalTextStyle.current,
        label = { Text("Label") },
        placeholder = { Text(text = stringResource(id = R.string.login_password_hint)) }
    )
    

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

    所以唯一的区别只要前 3 个参数位于正确的位置并按正确的顺序,其他参数就可以正常工作,因为您期望默认参数可以正常工作。让他们处于任何位置。不知道为什么它不适用于modifier

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        试试下面的代码,对你有帮助。

         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
            )
        

        【讨论】:

          【解决方案4】:

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

           placeholder: @Composable (() -> Unit)? = null,
          

          那个原因:不能用String代替@Composable (() -> Unit)?

          【讨论】:

            猜你喜欢
            • 2022-11-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-11-14
            • 2022-08-18
            • 1970-01-01
            • 2021-03-04
            • 2010-10-18
            相关资源
            最近更新 更多