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

Flutter Widget测试EasyLocalization初始化异常排查

问题原因

两个异常本质上都是测试环境缺失EasyLocalization运行依赖的平台上下文导致的:

  • 调用EasyLocalization.ensureInitialized()挂起:EasyLocalization初始化时默认会从Flutter引擎的平台通道读取当前设备的区域设置,测试环境下没有真实原生环境返回该数据,也没有提前设置测试用的locale值,await操作会一直等待返回结果,导致测试永久挂起。
  • 跳过初始化调用报LateError:EasyLocalization内部的_deviceLocale是延迟初始化字段,必须走完整初始化流程才会被赋值,跳过初始化直接挂载组件时,渲染逻辑读取该未赋值字段就会抛出LateInitializationError。
修复方案

核心是在测试环境下提前给引擎绑定设置测试用的固定locale,模拟真实环境的locale返回,不需要修改业务侧的EasyLocalization配置,只需要调整测试初始化逻辑:

  • 初始化测试绑定后,先给测试绑定的platformDispatcher设置固定的测试locale值,避免初始化时等待原生通道返回
  • 再调用EasyLocalization.ensureInitialized()完成初始化,此时既不会挂起,内部字段也会正常赋值
  • 每次测试前重置getIt容器,避免多个测试用例之间的单例污染

修复后的测试初始化代码如下:

void main() {
  testWidgets('Should login', (WidgetTester tester) async {
    await initAppWidgetTest(tester);
    expect(find.byType(ElevatedButton), findsOneWidget);
  });
}

Future<void> initAppWidgetTest(WidgetTester tester) async {
  TestWidgetsFlutterBinding.ensureInitialized();
  // 提前设置测试用固定locale,模拟平台返回
  final testBinding = tester.binding;
  testBinding.platformDispatcher.localeTestValue = const Locale('fr', 'FR');
  // 完成EasyLocalization初始化,此时不会再出现挂起问题
  await EasyLocalization.ensureInitialized();

  // 重置依赖注入容器,避免历史测试的单例残留
  await getIt.reset();
  getIt.registerSingleton<AppRouter>(
    AppRouter(
      checkIfAuthenticated: CheckIfAuthenticated(),
    ),
  );
  await tester.pumpWidget(initApp());
  await tester.pumpAndSettle();
}

Widget initApp() {
  return EasyLocalization(
    supportedLocales: const [Locale('fr', 'FR'), Locale('en', 'EN')],
    path: './assets/languages',
    fallbackLocale: const Locale('fr', 'FR'),
    assetLoader: const CodegenLoader(),
    child: MultiProvider(
      providers: [
        ChangeNotifierProvider(
          create: (_) => CompanyInfosProvider(),
        ),
        ChangeNotifierProvider(
          create: (_) => SitesInfosProvider(),
        ),
      ],
      child: MyApp(),
    ),
  );
}

补充:如果执行测试时提示找不到语言资源,检查pubspec.yaml中是否把assets/languages目录注册到测试可用的资源路径中,确认CodegenLoader生成的资源类已被正确引入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 13:48:13