如何高效获取Flutter类静态常量列表以校验配置参数?
解决方法
方案1:用代码生成自动维护合法参数列表
Flutter移动端禁用了dart:mirrors反射,所以可以借助build_runner+source_gen自动生成合法参数列表,新增参数时只需添加静态常量,运行生成命令就能自动同步列表,不用手动维护两份内容。
步骤如下:
- 先在
pubspec.yaml里加开发依赖:
dev_dependencies: build_runner: ^2.4.6 source_gen: ^1.4.0
- 创建生成器文件
parameter_list_generator.dart:
import 'package:source_gen/source_gen.dart'; import 'package:build/build.dart'; import 'package:analyzer/dart/element/element.dart'; class ParameterListGenerator extends GeneratorForAnnotation<GenerateParameterList> { @override String generateForAnnotatedElement( Element element, ConstantReader annotation, BuildStep buildStep) { if (element is ClassElement) { final constants = element.fields .where((field) => field.isStatic && field.isConst) .map((field) => field.name) .toList(); return ''' // GENERATED CODE - DO NOT MODIFY BY HAND import '${element.library.source.uri}'; const List<String> validParameters = [ ${constants.map((name) => '_Parameter.$name').join(',\n ')} ]; '''; } return ''; } } class GenerateParameterList { const GenerateParameterList(); }
- 给你的
_Parameter类加注解:
import 'package:your_package_name/parameter_list_generator.dart'; @GenerateParameterList() class _Parameter { static const String backgroundColor = 'background_color'; static const String image = 'image'; // 新增参数直接加在这里就行 }
- 运行生成命令:
flutter pub run build_runner build
生成的文件里会自动出现validParameters列表,校验配置键时直接用:
bool isValidKey(String key) { return validParameters.contains(key); }
方案2:把参数改成枚举(重构现有结构)
如果能调整现有代码结构,把参数名定义成枚举,枚举值对应配置键,这样天然就能拿到所有合法参数:
enum Parameter { backgroundColor('background_color'), image('image'); final String key; const Parameter(this.key); // 直接获取所有合法键 static List<String> get validKeys => values.map((e) => e.key).toList(); }
校验时用Parameter.validKeys.contains(key)即可,新增参数只需要在枚举里加新项,自动同步合法列表。
方案3:手动维护但加编译时检查(临时简单方案)
如果不想引入代码生成或改结构,可以在_Parameter类里加静态列表,同时用断言做编译时检查,确保所有常量都在列表里:
class _Parameter { static const String backgroundColor = 'background_color'; static const String image = 'image'; static const List<String> validParameters = [ backgroundColor, image, // 新增参数时记得加这里 ]; // 编译时自动检查,漏加参数会触发断言错误 static const bool _check = () { final constants = <String>{backgroundColor, image}; assert(constants.length == validParameters.length); assert(constants.containsAll(validParameters)); return true; }(); }
这样如果漏加了参数,编译阶段就会报错提醒你,减少遗漏概率。
内容的提问来源于stack exchange,提问作者jon
相关产品推荐
相关产品推荐

