如何使用 MaterialTheme 覆盖 Jetpack Compose 中 TextField 中的文本颜色?

I'm*_*gon 27 android android-layout android-jetpack-compose android-compose-textfield android-jetpack-compose-text

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

我发现这有效:

ProvideTextStyle(TextStyle(color = Color.White)) {
   TextField(
       ...
   )
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

(撰写版本 = 1.0.0-alpha11)

Art*_*mes 25

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

TextField(
    ...
    colors: TextFieldColors = TextFieldDefaults.textFieldColors(textColor = Color.White),
) {
Run Code Online (Sandbox Code Playgroud)

至于主题,如果你想避免每次都打电话:

ProvideTextStyle(TextStyle(color = Color.White)) {
   TextField(
       ...
   )
}
Run Code Online (Sandbox Code Playgroud)

您可以使用自己的一组创建可组合项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,
    ...
)
Run Code Online (Sandbox Code Playgroud)

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

@Composable
fun MyAppTextField(
    value: String,
    onValueChange: (String) -> Unit,
    modifier: Modifier = Modifier,
    ...
    colors: TextFieldColors = MyAppTextFieldColors(),
) {
    TextField(
        value = value,
        onValueChange = onValueChange,
        modifier = modifier,
        ...
        colors = colors,
    )
}
Run Code Online (Sandbox Code Playgroud)

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


Gab*_*tti 14

M2TextField contentColor基于LocalContentColor.current. 您可以使用CompositionLocalProvider来提供自定义LocalContentColor.

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

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

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

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

在此输入图像描述

  • 我尝试将此应用于 BasicTextField 但它不起作用,有任何提示吗?为了使它工作,我必须改变这样的样式:`textStyle = TextStyle.Default.copy(fontSize = fontSize.sp, color = fontColor)` (2认同)

Om *_*mar 14

我想在主题级别覆盖它

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
            )
        }
    )
}
Run Code Online (Sandbox Code Playgroud)

现在您提供的TextStyle将在应用程序主题级别使用。

setContent {
    MyAppTheme {
        // app content
    }
}
Run Code Online (Sandbox Code Playgroud)


yan*_*ver 5

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

TextField(
   ...
   textStyle = TextStyle(color = Color.Blue) 
)
Run Code Online (Sandbox Code Playgroud)