You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:26:48