Flutter中使用copyWith时AppBarTheme未生效的问题
问题原因及解决方案
你的问题出在Flutter ThemeData的主题合并逻辑和copyWith的处理机制上:
为什么初始ThemeData里的appBarTheme不生效?
当你在ThemeData构造函数里设置appBarTheme时,Flutter会自动把你传入的自定义样式和基于primarySwatch生成的默认AppBarTheme合并,这个合并后的主题依赖初始的colorScheme。当你调用copyWith修改colorScheme后,新的ThemeData虽然保留了原来合并好的appBarTheme,但这个旧主题和新colorScheme对应的全局样式(比如默认文本主题)产生优先级冲突,导致你的自定义titleTextStyle被覆盖。
而当你在copyWith里显式声明appBarTheme时,Flutter会基于新的colorScheme重新合并主题,你的自定义样式会被正确优先应用,所以能生效。
两种解决方案
方案一:保持copyWith,显式传入appBarTheme
直接使用你注释掉的生效代码即可:
@override Widget build(BuildContext context) { return MaterialApp( title: 'Personal Expenses', theme: theme.copyWith( colorScheme: theme.colorScheme.copyWith(secondary: Colors.amber), appBarTheme: AppBarTheme( titleTextStyle: TextStyle(fontFamily: 'OpenSans', fontSize: 40)), ), home: MyHomePage(), ); }
方案二:直接在初始ThemeData里配置colorScheme
避免后续copyWith修改带来的冲突,一次性完成所有主题配置:
class MyApp extends StatelessWidget { final ThemeData theme = ThemeData( colorScheme: ColorScheme.fromSwatch(primarySwatch: Colors.purple) .copyWith(secondary: Colors.amber), fontFamily: 'Quicksand', appBarTheme: AppBarTheme( titleTextStyle: TextStyle(fontFamily: 'OpenSans', fontSize: 40)), ); @override Widget build(BuildContext context) { return MaterialApp( title: 'Personal Expenses', theme: theme, home: MyHomePage(), ); } }
内容的提问来源于stack exchange,提问作者Jerm
相关产品推荐
相关产品推荐

