我正在尝试使用 基于现有亮色主题创建暗色主题lightTheme.copyWith(brightness: Brightness.dark)
。但是,该应用似乎忽略了暗色主题的亮度。
我的 main.dart 使用以下代码:
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: Themes.lightTheme,
darkTheme: Themes.darkTheme,
themeMode: ThemeMode.dark,
...
);
}
其中Themes.lightTheme
和Themes.darkTheme
定义如下:
class Themes {
static ThemeData get lightTheme => ThemeData(
colorSchemeSeed: Colors.green,
);
static ThemeData get darkTheme => lightTheme.copyWith(
brightness: Brightness.dark,
);
}
调试器显示深色主题包含brightness: Brightness.dark
。
但是,当我按如下方式定义黑暗主题时,一切正常copyWith
:
class Themes {
static ThemeData get lightTheme => ThemeData(
colorSchemeSeed: Colors.green,
);
static ThemeData get darkTheme => ThemeData(
colorSchemeSeed: Colors.green,
brightness: Brightness.dark,
);
}
有人能指出我对 Dart/Flutter 知识的盲点并解释一下发生了什么吗?
环境:
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.29.3, on Microsoft Windows [Version 10.0.22631.5262], locale xx-XX)
[✓] Windows Version (11 Home 64-bit, 23H2, 2009)
[✓] Android toolchain - develop for Android devices (Android SDK version 35.0.1)
[✓] Chrome - develop for the web
[✓] Visual Studio - develop Windows apps (Visual Studio Community 2022 17.13.6)
[✓] Android Studio (version 2024.3)
[✓] VS Code (version 1.99.3)
[✓] Connected device (3 available)
[✓] Network resources
它
ThemeData.copyWith
只会改变brightness
属性本身(或者更确切地说,是ColorScheme
属性内部)。亮度本身只会影响 iOS 系统状态栏文本颜色等内容。ThemeData
另一方面,构造函数的功能要多得多。给定colorSchemeSeed
并brightness
为你创建一整套配色方案:这里的问题是,简单地使用
lightTheme.copyWith(brightness: Brightness.dark)
并不能将主题完全转换为适当的暗主题。虽然
brightness:Brightness.dark
它确实会更新亮度字段,但它无法正确更新其他主题属性,例如背景颜色、文本颜色和默认样式,这些属性是纯深色主题自带的。这些属性是在你使用以下代码显式创建主题时由 Flutter 内部生成的:brightness: Brightness.dark.
解决方案:
ThemeData
使用with单独定义您的黑暗主题brightness: Brightness.dark
,就像您在此处所做的那样:这可确保所有与主题相关的属性与深色主题正确对齐。