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

如何在runApp函数执行前获取EasyLocalization的翻译数据

根本原因

你代码里已经调用了EasyLocalization.ensureInitialized(),但翻译相关的配置(支持语言、资源路径、兜底语言)是写在runApp内部的EasyLocalization widget 构造参数里的,这部分配置和对应的翻译资源要等EasyLocalization widget 挂载时才会加载,所以在runApp执行前拿不到翻译内容。

解决方案

方案1:提前完成翻译全量初始化(推荐,适配现有启动逻辑)

把翻译配置提取到全局,在runApp执行前就完成所有翻译资源的加载,后续NotificationLayer就可以直接调用翻译能力。
修改后的完整代码如下:

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 提前统一定义翻译配置
  const supportedLocales = [Locale('en'), Locale('fr')];
  const translationsPath = 'assets/translations';
  const fallbackLocale = Locale('en');

  // 初始化Easy Localization基础能力
  await EasyLocalization.ensureInitialized();
  // 手动加载翻译配置和对应语言资源
  await EasyLocalization.init(
    supportedLocales: supportedLocales,
    path: translationsPath,
    fallbackLocale: fallbackLocale,
  );

  // 此时翻译资源已经加载完成,可以正常使用翻译能力
  NotificationLayer().load();

  // 强制竖屏逻辑
  SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);

  SystemChrome.setSystemUIChangeCallback((systemOverlaysAreVisible) async {
    SystemChrome.setSystemUIOverlayStyle(AppTheme.systemUIOverlayStyle);
  });

  // runApp内的EasyLocalization直接复用提前定义的配置即可
  runApp(EasyLocalization(
      supportedLocales: supportedLocales,
      path: translationsPath,
      fallbackLocale: fallbackLocale,
      child: MyApp()));
}

修改完成后,你在NotificationLayer的load方法里就可以直接用'翻译key'.tr()的方式获取对应语言的翻译内容。

方案2:延迟NotificationLayer的初始化时机

如果你不想调整翻译初始化的逻辑,可以把NotificationLayer().load()的调用放到MyApp的initState生命周期中执行,此时EasyLocalization widget已经完成挂载,翻译资源已经全部加载完成,也可以正常调用翻译能力。

注意事项

  • 如果你需要NotificationLayer的逻辑在应用启动第一时间执行,优先选择方案1
  • 调用翻译前可以通过EasyLocalization.instance.locale确认当前生效的语言是否符合预期,避免出现翻译语言不匹配的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:15:08