Dart中能否使用Symbol传递类成员名获取对应成员的值?
问题成因
- 你当前直接打印
Symbol对象,输出的是Symbol类型的默认序列化结果,自然不会得到类成员的实际值,Symbol本质只是标识符的封装对象,本身不携带对应成员的值信息。 - 另外你的现有代码逻辑存在两处问题:
a、b是Foo的实例成员,静态方法output没有持有Foo实例的前提下,本身就无法访问到实例的属性值- 没有用到Dart的映射查找逻辑,自然无法把
Symbol和对应的类成员关联起来取值
实现方案
可以用Symbol实现你的需求,根据运行环境不同有两种实现方式:
方式1:反射实现(仅支持Dart VM、Flutter调试/Profile模式)
Dart官方提供的dart:mirrors反射库可以通过Symbol动态查找类成员值,实现代码如下:
import 'dart:mirrors'; import 'package:flutter/foundation.dart'; // Flutter环境需要导入 class Foo { String a = 'A'; String b = 'B'; static void output(Foo instance, Symbol symbol) { // 获取实例的镜像对象 InstanceMirror instanceMirror = reflect(instance); // 通过Symbol查找对应字段的取值 dynamic fieldValue = instanceMirror.getField(symbol).reflectee; debugPrint("The value is '$fieldValue'"); } } void main() { final foo = Foo(); Foo.output(foo, #a); // 输出:The value is 'A' }
注意:Flutter Release模式默认禁用了dart:mirrors,该方式无法在Release环境下运行。
方式2:静态映射表实现(全平台兼容,支持Flutter Release)
如果需要兼容全平台,可以手动维护Symbol到类成员的映射表,不需要反射性能更高:
import 'package:flutter/foundation.dart'; // Flutter环境需要导入 class Foo { String a = 'A'; String b = 'B'; // 预定义Symbol到字段取值的映射关系 static const Map<Symbol, String Function(Foo)> _symbolFieldMap = { #a: (instance) => instance.a, #b: (instance) => instance.b, }; static void output(Foo instance, Symbol symbol) { final String? fieldValue = _symbolFieldMap[symbol]?.call(instance); debugPrint("The value is '$fieldValue'"); } } void main() { final foo = Foo(); Foo.output(foo, #a); // 输出:The value is 'A' }
内容的提问来源于stack exchange,提问作者buttonsrtoys
相关产品推荐
相关产品推荐

