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
相关产品推荐
相关产品推荐

