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

