首页 > 解决方案 > 为什么我在使用 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))
     )
}

END EDIT
我正在尝试制作一个登录屏幕,并且我正在使用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它,我必须按照它声明的顺序使用它之前的每个参数的名称,以便使用它。唯一必须正确声明的是value并且onValueChange因为它们是唯一没有声明默认值的 2 个。

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

标签: androidkotlinparametersdefault-valueandroid-jetpack-compose

解决方案


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

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

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


推荐阅读