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

