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

Flutter中如何无需context调用AppLocalizations实现模型类多语言赋值

实现方案

你可以通过全局存储AppLocalization实例的方式,实现无需context调用国际化能力,具体修改步骤如下:

步骤1:修改AppLocalization类,新增全局静态实例

在你的AppLocalization定义文件中,新增静态实例存储逻辑,每次通过context获取实例时同步更新全局存储值:

class AppLocalization {
  // 存储全局单例
  static AppLocalization? _instance;
  // 对外暴露单例访问入口
  static AppLocalization get instance {
    assert(_instance != null, '请在App初始化完成后再调用AppLocalization.instance');
    return _instance!;
  }

  static AppLocalization? of(BuildContext context) {
    final instance = Localizations.of<AppLocalization>(context, AppLocalization);
    // 每次通过context获取实例时,同步更新全局单例
    if (instance != null) _instance = instance;
    return instance;
  }

  // 你原有剩下的代码保持不变,比如home、frequentQuestion等词条的getter定义
  String get home => '对应语言的首页文本';
  String get frequentQuestion => '对应语言的常见问题文本';
}

步骤2:修改MenuItems模型类,适配动态国际化

原来的const静态变量是编译期常量,无法适配运行时切换语言的需求,需要改成动态getter:

class MenuItems {
  // 改为静态getter,运行时实时拉取当前语言的文本
  static MenuItem get home => MenuItem(AppLocalization.instance.home, Icons.home);
  static MenuItem get frequentQuestion => MenuItem(AppLocalization.instance.frequentQuestion, Icons.question_answer);

  static List<MenuItem> get all => <MenuItem>[
    home,
    frequentQuestion,
  ];
}

注意事项

  • 确保在调用AppLocalization.instance前已经完成初始化:最简单的触发方式是在MaterialApp的initState中调用一次AppLocalization.of(context),即可完成全局实例赋值
  • 语言切换后,使用MenuItems的UI需要重新构建,才能拉取到最新的文本
  • 如果需要更安全的实例管理,也可以使用get_it等依赖注入框架存储AppLocalization实例,逻辑和全局静态存储一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 15:54:04