Flutter自定义主题中displayMedium文本颜色不生效,如何解决?
Flutter中CustomTheme修改displayMedium颜色不生效的解决方法
问题根源:你在定义lightTheme时,textTheme字段里直接引用了lightTheme.textTheme——此时lightTheme还未完成初始化,这里拿到的是ThemeData的默认文本主题,而非你正在构建的自定义主题,导致displayMedium的颜色修改无法正确应用到最终主题上。
修复后的CustomTheme代码
class CustomTheme { static ThemeData lightTheme = ThemeData( primaryColor: Colors.red, colorScheme: ColorScheme.fromSwatch().copyWith( primary: Colors.red, secondary: Colors.green, ), useMaterial3: true, // 基于GoogleFonts提供的Merriweather文本主题修改,避免循环引用 textTheme: GoogleFonts.merriweatherTextTheme().copyWith( displayMedium: GoogleFonts.merriweather( color: Colors.blue, ).copyWith(color: Colors.blue), ), ); }
另一种写法(保留默认TextTheme样式)
如果你想保留ThemeData默认light主题的文本样式结构,仅修改颜色和字体,可以这样写:
class CustomTheme { static ThemeData lightTheme = ThemeData( primaryColor: Colors.red, colorScheme: ColorScheme.fromSwatch().copyWith( primary: Colors.red, secondary: Colors.green, ), useMaterial3: true, fontFamily: GoogleFonts.merriweather().fontFamily, // 基于默认light主题的textTheme修改 textTheme: ThemeData.light().textTheme.copyWith( displayMedium: ThemeData.light().textTheme.displayMedium!.copyWith( color: Colors.blue, fontFamily: GoogleFonts.merriweather().fontFamily, ), ), ); }
补充说明
Material3中部分文本样式的颜色会被ColorScheme的属性(如onSurface)覆盖,如果修复循环引用后颜色仍不生效,可以检查ColorScheme的相关配置,或者在Text组件中临时指定颜色验证:
Text("Hello", style: Theme.of(context).textTheme.displayMedium?.copyWith(color: Colors.blue))
内容的提问来源于stack exchange,提问作者Acheese
相关产品推荐
相关产品推荐

