我目前正在尝试为我的材料应用程序定义ThemeData,我需要ElevatedButtonThemeData中的ButtonStyle来控制我的应用程序中所有按钮的外观。到目前为止,一切都很好,但由于某种原因;颜色";我的按钮的TextStyle字段被";onPrimary";字段。
textStyle中的其他一切都很好,例如,如果我在textStyle中更改fontSize,那么整个应用程序的字体大小都会更新,但更改颜色没有任何作用。此外,backgroundColor适用于ButtonStyle。
我知道我可以把所有的按钮都包装在一个主题小部件中,但如果可能的话,我想避免这种情况。
这是最终被使用的颜色
theme: ThemeData(
brightness: Brightness.light,
colorScheme: const ColorScheme(
brightness: Brightness.light,
primary: Colors.white,
///////////////////////////////////////
onPrimary: Colors.red,
//this is the color that is used
),
这是我想用的颜色
elevatedButtonTheme: ElevatedButtonThemeData(
//this themedata controls themedata for elevated buttons
style: ButtonStyle(
//for some reason the MarterialStateProperty must be called to explicitly define types for buttons
//ie: "MaterialStateProperty.all<Color>(const Color(0xFF50D2C2))" just allows "const Color(0xFF50D2C2)" to be used
backgroundColor: MaterialStateProperty.all<Color>(const Color(0xFF50D2C2)), //this is the color of the button background
textStyle: MaterialStateProperty.all<TextStyle>(const TextStyle(
//this determines the text style of the text displayed on buttons
fontSize: 14,
fontFamily: 'Lato',
///////////////////////////////////
color: Colors.white,
//this is the color I want
),),
enableFeedback: true,
),
),
这是我用flutter的默认演示重新创建的问题。
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
brightness: Brightness.light,
colorScheme: const ColorScheme(
brightness: Brightness.light,
primary: Colors.white,
///////////////////////////////////////
onPrimary: Colors.red,
//this is the color that is used
secondary: Color(0xFFe8f3f2),
onSecondary: Color(0xFF7a7a7a),
error: Color(0xFFff3366),
onError: Colors.white,
background: Colors.white,
onBackground: Color(0xFF7a7a7a),
surface: Color(0xFF50D2C2),
onSurface: Colors.white,
),
elevatedButtonTheme: ElevatedButtonThemeData(
//this themedata controls themedata for elevated buttons
style: ButtonStyle(
//for some reason the MarterialStateProperty must be called to explicitly define types for buttons
//ie: "MaterialStateProperty.all<Color>(const Color(0xFF50D2C2))" just allows "const Color(0xFF50D2C2)" to be used
backgroundColor: MaterialStateProperty.all<Color>(const Color(0xFF50D2C2)), //this is the color of the button background
textStyle: MaterialStateProperty.all<TextStyle>(const TextStyle(
//this determines the text style of the text displayed on buttons
fontSize: 14,
fontFamily: 'Lato',
///////////////////////////////////
color: Colors.white,
//this is the color I want
),),
enableFeedback: true,
),
),
),
home: const MyHomePage(title: 'Flutter Button Theme'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
child: const Text("This is a button"),
onPressed: () { },
)
],
),
),
);
}
}
好吧,我花了6个小时试图找到这个问题的答案,然后在发布问题5分钟后就找到了。
按钮文本颜色由foregroundColor参数控制,而不是由textStyle控制。
elevatedButtonTheme: ElevatedButtonThemeData(
//style: ElevatedButton.styleFrom(onPrimary: Colors.white)
//this themedata controls the
style: ButtonStyle(
//for some reason the MarterialStateProperty must be called to explicitly define types for buttons
//ie: "MaterialStateProperty.all<Color>(const Color(0xFF50D2C2))" just allows "const Color(0xFF50D2C2)" to be used
backgroundColor: MaterialStateProperty.all<Color>(const Color(0xFF50D2C2)),
foregroundColor: MaterialStateProperty.all<Color>(Colors.white), //actual text color
textStyle: MaterialStateProperty.all<TextStyle>(const TextStyle(
//this determines the text style of the text displayed on buttons
fontSize: 14,
fontFamily: 'Lato',
color: Colors.red, //color not used
),),
enableFeedback: true,
//minimumSize: ,
),
),