Flutter如何根据传入的字符串名称获取类中的变量?
如何通过Symbol获取URLsList中对应的图标URL?
你原来的写法list.(symbol)在Dart里是不合法的语法,因为Dart不支持直接通过字符串变量名来访问类的成员变量。这里给你两种解决方案,优先推荐第一种,简单又高效:
推荐方案:用Map存储Symbol与URL的映射
把原来的类成员变量改成静态Map来存储,这样获取对应URL的逻辑会非常简洁,而且扩展性更强:
String getIconsURL(String symbol) { // 直接从Map取值,用??处理symbol不存在的情况,返回默认URL return URLsList.iconUrls[symbol] ?? 'https://your-default-icon-url.com'; } class URLsList { // 静态Map,无需实例化类就能访问,更高效 static final Map<String, String> iconUrls = { 'XVG': 'some url', 'BTC': 'some url', // 后续加新的symbol直接在这里添加键值对就行 }; }
为什么推荐这个方案?
- 简洁高效:不用实例化类,直接通过静态Map取值,性能更好
- 扩展性强:新增/删除symbol只需要修改Map,不用改动类的结构
- 容错性高:通过
??可以处理传入不存在的symbol的情况,避免空指针异常
备选方案:使用反射(不推荐)
如果你一定要保留类成员变量的形式,可以用Dart的反射机制,但这种方式复杂度高,而且在Flutter的release模式下可能会因为代码树摇出现问题,所以只做参考:
首先需要在pubspec.yaml中添加依赖:
dependencies: reflectable: ^4.0.0
然后编写代码:
import 'package:reflectable/reflectable.dart'; // 定义反射能力 class URLReflector extends Reflectable { const URLReflector() : super(instanceInvokeCapability); } const urlReflector = URLReflector(); // 给URLsList添加反射注解 @urlReflector class URLsList { final XVG = 'some url'; final BTC = 'some url'; } String getIconsURL(String symbol) { final list = URLsList(); final instanceMirror = urlReflector.reflect(list); // 通过反射获取成员变量的值 return instanceMirror.invokeGetter(symbol); }
注意事项
- 反射会增加代码复杂度和运行时开销
- Flutter release模式下,树摇优化可能会移除反射相关代码,导致功能失效
- 无法处理不存在的symbol,需要自己额外加判断逻辑
总的来说,优先选择Map的方案,不管是维护还是性能都更优。
内容的提问来源于stack exchange,提问作者Musa Usman
相关产品推荐
相关产品推荐

