Flutter主题类优化咨询:避免强制实现全部属性
解决Flutter主题类需实现所有属性的繁琐问题
方案1:基础主题类+按需重写
放弃强制实现所有属性的抽象类,改用带默认值的基础主题类,让各主题子类仅重写自身需要的属性,未重写的属性直接继承基础类的默认值。
基础主题类代码:
import 'package:flutter/material.dart'; class MyBaseColorScheme { static const MyBaseColorScheme defaultTheme = MyBaseColorScheme(); const MyBaseColorScheme(); // 所有属性设置通用默认值 Color color1({required Brightness brightness}) => Colors.grey.shade500; Color get color2 => Colors.grey.shade500; Color get color3 => Colors.grey.shade500; Color get color4 => Colors.grey.shade500; Color get color5 => Colors.grey.shade500; IconThemeData get icon1 => const IconThemeData(color: Colors.grey); IconThemeData get icon2 => const IconThemeData(color: Colors.grey); TextStyle get text1 => const TextStyle(color: Colors.grey); TextStyle get text2 => const TextStyle(color: Colors.grey); TextStyle get text3 => const TextStyle(color: Colors.grey); TextStyle get text4 => const TextStyle(color: Colors.grey); TextStyle get text5 => const TextStyle(color: Colors.grey); }
主题子类代码:
class Theme1 extends MyBaseColorScheme { const Theme1() : super(); // 仅重写需要自定义的属性 @override Color color1({required Brightness brightness}) { return brightness == Brightness.light ? Colors.red : Colors.blue; } @override Color get color2 => Colors.red; }
使用方式:
final currentTheme = Theme1(); // 调用自定义属性 final dynamicColor = currentTheme.color1(brightness: Brightness.light); // 未自定义的属性自动使用基础类默认值 final defaultColor = currentTheme.color3;
方案2:动态Map存储主题属性
用Map存储每个主题的专属属性,完全不需要预先定义所有属性,仅在主题中添加需要的键值对,通过安全方法获取属性。
主题类代码:
import 'package:flutter/material.dart'; typedef ThemeProperty = dynamic; class MyColorScheme { final Map<String, ThemeProperty> _properties; const MyColorScheme(this._properties); // 安全获取属性,支持默认值 T getProperty<T>(String key, [T? defaultValue]) { if (_properties.containsKey(key) && _properties[key] is T) { return _properties[key] as T; } if (defaultValue != null) { return defaultValue; } throw ArgumentError('属性 $key 未定义且无默认值'); } } // 定义主题时仅添加需要的属性 const Theme1 = MyColorScheme({ 'color1': (Brightness brightness) => brightness == Brightness.light ? Colors.red : Colors.blue, 'color2': Colors.red, 'text1': TextStyle(color: Colors.red, fontSize: 16), });
使用方式:
// 获取自定义的动态颜色 final color1 = Theme1.getProperty<Function(Brightness)>('color1')(Brightness.light); // 获取自定义颜色 final color2 = Theme1.getProperty<Color>('color2'); // 获取带默认值的未定义属性 final defaultTextStyle = Theme1.getProperty<TextStyle>('text2', const TextStyle(color: Colors.grey));
方案3:带默认实现的抽象类
保留抽象类结构,但给每个抽象方法/属性添加默认实现,子类可选择性重写需要的属性,未重写的使用父类默认值。
抽象类代码:
import 'package:flutter/material.dart'; abstract class MyColorScheme { static const MyColorScheme Theme1 = Theme1(); static const MyColorScheme Theme2 = Theme2(); const MyColorScheme(); // 给所有属性添加默认实现 Color color1({required Brightness brightness}) => Colors.grey.shade500; Color get color2 => Colors.grey.shade500; Color get color3 => Colors.grey.shade500; Color get color4 => Colors.grey.shade500; Color get color5 => Colors.grey.shade500; IconThemeData get icon1 => const IconThemeData(color: Colors.grey); IconThemeData get icon2 => const IconThemeData(color: Colors.grey); TextStyle get text1 => const TextStyle(color: Colors.grey); TextStyle get text2 => const TextStyle(color: Colors.grey); TextStyle get text3 => const TextStyle(color: Colors.grey); TextStyle get text4 => const TextStyle(color: Colors.grey); TextStyle get text5 => const TextStyle(color: Colors.grey); }
主题子类代码:
class Theme1 extends MyColorScheme { const Theme1() : super(); @override Color color1({required Brightness brightness}) { return brightness == Brightness.light ? Colors.red : Colors.blue; } // 仅重写需要的属性,其他自动使用父类默认值 }
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

