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

Flutter应用本地化:如何通过字符串键值获取翻译值?

动态获取Flutter本地化翻译值的实现

直接写AppLocalizations.of(context).c报“类型中未定义getter”的核心原因是:通过官方flutter gen-l10n生成的AppLocalizations类,所有翻译条目都是编译期硬编码的类成员getter,并非支持动态查询的Map结构。点号取属性的语法在编译阶段就会校验成员是否存在,完全不支持用字符串变量动态获取对应值。

推荐方案:使用生成类内置的动态查询方法

Flutter 3.0及以上版本,通过官方l10n流程生成的AppLocalizations类已经内置getString方法,专门支持通过字符串键获取翻译值,无需额外自定义逻辑:

String c = "closed";
// 替换原静态写法 AppLocalizations.of(context).closed
String closedTranslation = AppLocalizations.of(context).getString(c);

如果翻译条目带占位参数,可按方法定义传入参数列表:

// 对应翻译值为 "欢迎来到{appName}" 的键 "welcomeTip"
String tipText = AppLocalizations.of(context).getString("welcomeTip", ["我的应用"]);

旧版本兼容方案

如果使用的Flutter版本低于3.0,生成类没有内置getString方法,可以借助gen-l10n生成的lookupMessage静态方法实现查询:

String getTranslationByKey(String key, BuildContext context) {
  final appLocal = AppLocalizations.of(context);
  // 调用生成类自带的静态查找方法
  return lookupMessage(
    key,
    locale: appLocal.localeName,
    appLocalizations: appLocal,
  ) ?? key; // 键不存在时兜底返回原键,避免空值异常
}

// 调用示例
String c = "closed";
String closedText = getTranslationByKey(c, context);

常见踩坑提醒

  • 不要使用dart:mirrors反射机制动态读取类属性,Flutter Release构建会裁剪反射相关代码,直接导致运行时崩溃。
  • 动态查键的方式会绕过编译期静态校验:如果字符串键拼写错误,编译阶段不会抛出异常,只会在运行时返回原键值,需要做好统一兜底逻辑。

内容的提问来源于stack exchange,提问作者Mark Sameh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 09:36:03