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

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。具体步骤:

  1. 在项目根目录的l10n.yaml里添加配置,指定生成lookup方法
  2. 调整ARB文件的结构,让每个翻译项的key和你需要的textCode对应
  3. 重新生成本地化文件后,就可以直接用AppLocalizations.of(context)!.lookup(key)来获取文本

不过这个方案需要对Flutter l10n的配置有一定了解,适合大规模项目使用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 22:02:49