针对 null 安全性进行了更新
我扩展了标准的ThemeData 类,以便随时可以访问自己的主题字段:
Theme.of(context).own().errorShade
或者这样:
ownTheme(context).errorShade
可以使用以下新字段定义和扩展主题(通过在某个ThemeData 实例上调用addOwn()):
final ThemeData lightTheme = ThemeData.light().copyWith(
accentColor: Colors.grey.withAlpha(128),
backgroundColor: Color.fromARGB(255, 255, 255, 255),
textTheme: TextTheme(
caption: TextStyle(
fontSize: 17.0, fontFamily: 'Montserrat', color: Colors.black),
))
..addOwn(OwnThemeFields(
errorShade: Color.fromARGB(240, 255, 200, 200),
textBaloon: Color.fromARGB(240, 255, 200, 200)));
final ThemeData darkTheme = ThemeData.dark().copyWith( ...
...
主题可以以常规方式应用于MaterialApp 小部件:
MaterialApp(
...
theme: lightTheme,
darkTheme: darkTheme,
)
想法是将主题化所需的所有自定义字段放在单独的类OwnThemeFields中。
然后用 2 个方法扩展 ThemeData 类:
-
addOwn() 将ThemedData 的某个实例连接到OwnThemeFields 实例
-
own() 允许查找与给定主题数据关联的自己的字段
还可以创建ownTheme 辅助方法来缩短自己字段的提取时间。
class OwnThemeFields {
final Color? errorShade;
final Color? textBaloon;
const OwnThemeFields({Color? errorShade, Color? textBaloon})
: this.errorShade = errorShade,
this.textBaloon = textBaloon;
factory OwnThemeFields.empty() {
return OwnThemeFields(errorShade: Colors.black, textBaloon: Colors.black);
}
}
extension ThemeDataExtensions on ThemeData {
static Map<InputDecorationTheme, OwnThemeFields> _own = {};
void addOwn(OwnThemeFields own) {
_own[this.inputDecorationTheme] = own;
}
static OwnThemeFields? empty = null;
OwnThemeFields own() {
var o = _own[this.inputDecorationTheme];
if (o == null) {
if (empty == null) empty = OwnThemeFields.empty();
o = empty;
}
return o!;
}
}
OwnThemeFields ownTheme(BuildContext context) => Theme.of(context).own();
完整来源:https://github.com/maxim-saplin/dikt/blob/master/lib/ui/themes.dart