问题:ThemeData中ColorScheme的inversePrimary覆盖后,AppBarTheme颜色未生效
问题分析与解决方法
问题原因
你在创建ThemeData时,直接使用Theme.of(context).colorScheme.inversePrimary设置AppBarTheme.color,但此时context中的主题是当前已存在的旧主题,而非你正在构建的新ThemeData,所以获取到的是默认的inversePrimary颜色(紫色),而非自定义的粉色。
解决方法
不需要通过context获取,直接引用你创建的ColorScheme实例,或在ThemeData内部直接访问自身的colorScheme属性:
方案1:提前定义ColorScheme变量
final colorScheme = ColorScheme.fromSeed( seedColor: Colors.green, inversePrimary: Colors.pink, brightness: Brightness.light, ); final theme = ThemeData( colorScheme: colorScheme, appBarTheme: AppBarTheme( color: colorScheme.inversePrimary, ), );
方案2:使用copyWith间接访问自身colorScheme
如果不想单独定义变量,可以通过copyWith方法,基于已初始化的ThemeData访问其colorScheme:
final theme = ThemeData( colorScheme: ColorScheme.fromSeed( seedColor: Colors.green, inversePrimary: Colors.pink, brightness: Brightness.light, ), ).copyWith( appBarTheme: AppBarTheme( color: colorScheme.inversePrimary, ), );
额外说明
- 构建
ThemeData时,不要依赖当前context中的主题,因为context的主题是上层Widget提供的旧主题,还未更新为你正在创建的新主题。 - 若在
MaterialApp中设置主题,确保将构建好的ThemeData赋值给theme属性,后续子Widget通过Theme.of(context)就能获取到正确的自定义主题。
内容的提问来源于stack exchange,提问作者Anmol Singh
相关产品推荐
相关产品推荐

