Flutter开发:Dart类初始化如何复用值避免重复颜色定义
解决方案
你完全不需要维护两份重复的浅色模式色值配置,只需要调整ThemeNotifier类内的成员声明顺序,让初始colors属性直接复用提前定义好的lightColors实例即可。
Dart 类的实例成员是按照从上到下的顺序初始化的,只要把浅色、深色的颜色实例定义挪到colors属性之前,初始化colors时直接赋值为lightColors,就不会出现初始化时找不到值的问题,也彻底消除了重复代码。
修改后的ThemeNotifier代码如下:
class ThemeNotifier with ChangeNotifier { var darkMode = false; // 先定义浅色模式颜色(作为默认初始值) final lightColors = AppColors( alpha: const Color(0xFFFFFFFF), bravo: const Color(0xFFF5F5F6), ); // 深色模式颜色 final darkColors = AppColors( alpha: const Color(0xFF222630), bravo: const Color(0xFF171920), ); // 初始化直接复用已定义的lightColors,无需重复写色值 AppColors colors = lightColors; ThemeNotifier() { Storage.read('darkMode').then((value) { darkMode = value ?? false; colors = darkMode ? darkColors : lightColors; notifyListeners(); }); } void setDarkMode() async { colors = darkColors; darkMode = true; Storage.save('darkMode', true); notifyListeners(); } void setLightMode() async { colors = lightColors; darkMode = false; Storage.save('darkMode', false); notifyListeners(); } }
优化建议
如果想让代码更易维护,你还可以把固定的浅色、深色配置抽到AppColors类里作为静态常量,后续新增颜色属性只需要修改AppColors一处即可,不需要动主题切换相关逻辑:
class AppColors { Color alpha; Color bravo; AppColors({ required this.alpha, required this.bravo, }); // 全局固定主题色配置 static final AppColors light = AppColors( alpha: const Color(0xFFFFFFFF), bravo: const Color(0xFFF5F5F6), ); static final AppColors dark = AppColors( alpha: const Color(0xFF222630), bravo: const Color(0xFF171920), ); }
调整后ThemeNotifier里不需要单独定义lightColors、darkColors变量,直接通过AppColors.light、AppColors.dark引用即可。
内容的提问来源于stack exchange,提问作者Clifton Labrum
相关产品推荐
相关产品推荐

