Flutter中如何动态调用l10n生成的AppLocalizations类内的get方法?
嘿,我懂你想通过字符串key动态调用翻译get方法的需求——直接用[]访问肯定不行,因为生成的AppLocalizations是普通Dart类,不是Map结构。下面给你几个适配现有代码的可行方案:
方案1:给本地化类新增翻译Map映射(最推荐)
这个方法简单可靠,适合大多数场景,只需要在生成的本地化子类里加一个返回键值对的Map,同时在父类中定义抽象方法:
第一步:修改本地化类
先在抽象父类AppLocalizations里添加抽象getter:
abstract class AppLocalizations { AppLocalizations(this.locale); final String locale; // 新增:定义抽象翻译映射方法 Map<String, String> get translations; // 原有其他抽象getter... String get splashPageViewTitle1; String get splashPageViewTitle2; String get splashPageViewTitle3; }
然后在AppLocalizationsEn里实现这个getter:
class AppLocalizationsEn extends AppLocalizations { AppLocalizationsEn([String locale = 'en']) : super(locale); @override String get splashPageViewTitle1 => 'Welcome!'; @override String get splashPageViewTitle2 => 'Let\'s go'; @override String get splashPageViewTitle3 => 'Byebye'; // 实现翻译映射 @override Map<String, String> get translations => { 'splashPageViewTitle1': splashPageViewTitle1, 'splashPageViewTitle2': splashPageViewTitle2, 'splashPageViewTitle3': splashPageViewTitle3, // 后续新增翻译都要在这里添加对应映射 }; }
第二步:在页面中动态调用
现在你就可以直接通过splashData里的textCode获取对应翻译了:
Expanded( flex: 3, child: PageView.builder( onPageChanged: (value) { setState((){ currentPage = value; }); }, itemCount: splashData.length, itemBuilder: (context, index) => SplashContent( image: splashData[index]["image"], // 这里通过translations Map动态取值,加个默认值防止key不存在 text: AppLocalizations.of(context)!.translations[splashData[index]["textCode"]] ?? 'Missing Text', ), ), ),
方案2:用反射实现动态调用(适合特殊场景)
如果你的翻译量极大,不想手动维护Map,可以用Dart的反射机制,但要注意Flutter发布模式下默认禁用反射,需要额外配置,且性能略低于直接调用:
第一步:添加反射依赖
在pubspec.yaml里添加依赖:
dependencies: reflectable: ^4.0.6
第二步:编写反射工具函数
import 'dart:mirrors'; /// 通过key动态获取本地化文本 String getLocalizedText(AppLocalizations loc, String key) { final instanceMirror = reflect(loc); final fieldSymbol = Symbol(key); // 检查是否存在对应的getter方法 if (instanceMirror.hasGetter(fieldSymbol)) { return instanceMirror.getField(fieldSymbol).reflectee as String; } // 找不到时返回默认提示 return '[$key]'; }
第三步:在页面中使用
text: getLocalizedText(AppLocalizations.of(context)!, splashData[index]["textCode"])
⚠️ 注意:发布模式下需要配置flutter build时保留反射相关代码,否则会报错,所以除非必要,优先用方案1。
方案3:自定义l10n生成规则(进阶)
如果你想从根源解决这个问题,可以修改Flutter l10n的生成配置,让它生成一个支持key查找的方法,而不是一个个getter。具体步骤:
- 在项目根目录的
l10n.yaml里添加配置,指定生成lookup方法 - 调整ARB文件的结构,让每个翻译项的key和你需要的
textCode对应 - 重新生成本地化文件后,就可以直接用
AppLocalizations.of(context)!.lookup(key)来获取文本
不过这个方案需要对Flutter l10n的配置有一定了解,适合大规模项目使用。
内容的提问来源于stack exchange,提问作者Chimoki
相关产品推荐
相关产品推荐

