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

Flutter中如何通过字符串变量动态访问AppLocalizations的getter属性

解决方案

Flutter默认禁用dart:mirrors反射库,无法通过字符串直接动态调用实例getter,我们可以通过运算符重载+映射表的方式实现你需要的调用效果。

方案1:手动实现(适合翻译键较少的小型项目)

直接给生成的AppLocalizations类加扩展,重载[]运算符即可:

extension AppLocalizationsKeyAccess on AppLocalizations {
  String operator [](String key) {
    switch (key) {
      case 'helloWorld':
        return helloWorld;
      case 'welcomeMessage':
        return welcomeMessage;
      // 依次添加你所有的翻译key对应case
      default:
        // 未匹配到key的兜底展示
        return '⚠️ Undefined key: $key';
    }
  }
}

方案2:自动生成映射表(适合中大型项目)

如果翻译键很多,手动维护case容易遗漏,你可以写一个简易脚本扫描arb翻译文件的所有key,自动生成映射表:

// 以下映射表可通过扫描arb文件自动生成,无需手动维护
final Map<String, String Function(AppLocalizations)> _locGetterMap = {
  'helloWorld': (loc) => loc.helloWorld,
  'welcomeMessage': (loc) => loc.welcomeMessage,
  'logoutTip': (loc) => loc.logoutTip,
};

extension AppLocalizationsKeyAccess on AppLocalizations {
  String operator [](String key) {
    final getter = _locGetterMap[key];
    return getter?.call(this) ?? '⚠️ Undefined key: $key';
  }
}

调用效果

实现后你就可以直接用期望的写法调用:

final appLocalizations = AppLocalizations.of(context)!;
const key = 'helloWorld';
print(appLocalizations[key]); // 输出对应翻译文本

注意:映射表中的key需要和arb翻译文件中定义的key完全一致,大小写敏感。

内容的提问来源于stack exchange,提问作者A.A

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 19:36:05