9

我正在尝试使用TextField()Jetpack Compose。我希望文本颜色为白色。

我发现这是有效的:

ProvideTextStyle(TextStyle(color = Color.White)) {
   TextField(
       ...
   )
}

但是,我想在 Theme 级别覆盖它,这样我就不需要重复编写ProvideTextStyle. 我看到MaterialTheme它只接受以下参数:

@Composable
fun MaterialTheme(
    colors: Colors = MaterialTheme.colors,
    typography: Typography = MaterialTheme.typography,
    shapes: Shapes = MaterialTheme.shapes,
    content: @Composable () -> Unit
)

所以我不知道该怎么做。有人可以帮忙吗?

(撰写版本 = 1.0.0-alpha11)

4

5 回答 5

8

正如Adrian Grygutis在评论中指出的那样, in1.0.0TextField一个参数colors。您可以TextField通过调用TextFieldDefaults.textFieldColors(...)要更改的参数来自定义您的。

TextField(
    ...
    colors: TextFieldColors = TextFieldDefaults.textFieldColors(textColor = Color.White),
) {

至于主题,如果您想避免每次都调用:

ProvideTextStyle(TextStyle(color = Color.White)) {
   TextField(
       ...
   )
}

您可以使用自己的集合创建一个可组合项TextFieldColors,并将其作为参数添加到您的TextField. 例如,您可以将所有颜色设为白色:

@Composable
fun MyAppTextFieldColors(
    textColor: Color = Color.White,
    disabledTextColor: Color = Color.White,
    backgroundColor: Color = Color.White,
    cursorColor: Color = Color.White,
    errorCursorColor: Color = Color.White,
    ...
) = TextFieldDefaults.textFieldColors(
    textColor = textColor,
    disabledTextColor = disabledTextColor,
    backgroundColor = backgroundColor,
    cursorColor = cursorColor,
    errorCursorColor = errorCursorColor,
    ...
)

为了避免在 every 中调用它TextField,您可以MyAppTextField为您的应用创建一个自定义,该自定义TextField使用您的自定义TextFieldColors作为默认参数调用默认值:

@Composable
fun MyAppTextField(
    value: String,
    onValueChange: (String) -> Unit,
    modifier: Modifier = Modifier,
    ...
    colors: TextFieldColors = DialogoTextFieldColors(),
) {
    TextField(
        value = value,
        onValueChange = onValueChange,
        modifier = modifier,
        ...
        colors = colors,
    )
}

这样,您只需要调用MyAppTextField. 如果需要,这是覆盖从主题继承的颜色的好方法。

于 2021-08-13T21:40:44.777 回答
6

与contentColor1.0.xTextField基于LocalContentColor.current. 您可以使用CompositionLocalProvider来提供自定义LocalContentColor.

您可以定义一个自定义函数,例如:

@Composable
fun ContentColorComponent(
    contentColor: Color = LocalContentColor.current,
    content: @Composable () -> Unit
) {
    CompositionLocalProvider(LocalContentColor provides contentColor,
        content = content)
}

它可以与许多组件一起使用,例如TextField

ContentColorComponent(contentColor = Color.Blue) {
    TextField(
        value = text,
        onValueChange = { text = it },
        label = { Text("Label") }
    )
}

在此处输入图像描述

于 2021-03-31T10:11:20.293 回答
4

我想在主题级别覆盖它

修改MaterialTheme应用程序可组合主题中可组合的内容以包含 TextStyle。

@Composable
fun MyAppTheme(
    darkTheme: Boolean = isSystemInDarkTheme(),
    content: @Composable() () -> Unit
) {
    val colors = if (darkTheme) {
        DarkColorPalette
    } else {
        LightColorPalette
    }

    MaterialTheme(
        colors = colors,
        typography = Typography,
        shapes = Shapes,
        content = {
            ProvideTextStyle(
                value = TextStyle(color = Color.White),
                content = content
            )
        }
    )
}

现在您提供的TextStyle将在 App 主题级别使用。

setContent {
    MyAppTheme {
        // app content
    }
}
于 2021-05-31T15:14:56.080 回答
3

您可以根据需要创建自己的TextField小部件color并在所有地方使用它,

@Composable
fun ColoredTextField(value: String, onValueChange: (String) -> Unit){
    ProvideTextStyle(TextStyle(color = Color.White)) {
        TextField(value = value, onValueChange = onValueChange)
    }
}

现在开始使用ColoredTextField而不是TextField通过更改color您的Widget,它会应用于所有地方。

于 2021-02-09T13:35:40.010 回答
0

1.0.0-beta07您可以使用该属性来覆盖样式,textStyle从而覆盖内容颜色。另请参阅样式化 TextField

TextField(
   ...
   textStyle = TextStyle(color = Color.Blue) 
)
于 2021-05-30T20:17:45.937 回答