Flutter启动页测试报错:LateInitializationError(width未初始化)
Flutter启动页测试问题修复
错误1:LateInitializationError: Field 'width' has not been initialized
这是因为你使用了Sizer库的w单位,但测试环境未初始化Sizer所需的上下文。Sizer的w/h单位依赖MediaQuery提供的屏幕尺寸数据,直接pump Splash组件时,缺少必要的上下文包装。
解决方式:测试时用Sizer组件或手动提供MediaQuery来包裹Splash,初始化Sizer运行环境。
错误2:无法找到Assets.icons.icLogo.svg()组件
find.byWidget(Assets.icons.icLogo.svg())会创建一个全新的SVG组件实例,和界面上已渲染的实例不是同一个对象,导致匹配失败。
解决方式:给启动页里的Logo组件添加唯一Key,测试时通过find.byKey查找;或使用find.byType(确保该SVG类型在页面中唯一)。
修改后的启动页核心代码(给Logo加唯一Key)
SizedBox( height: double.infinity, width: double.infinity, child: Stack( alignment: Alignment.center, children: [ Container( color: AppColor.bgBlack, height: double.infinity, width: double.infinity, padding: EdgeInsets.symmetric(horizontal: 14.w), // 添加唯一Key用于测试定位 child: Assets.icons.icLogo.svg(key: const Key('splash_logo'))), Positioned( bottom: 0, child: Assets.icons.icSplashBg.svg( width: MediaQuery.of(context).size.width, fit: BoxFit.fill)), ], ))
修改后的测试代码
void main() { testWidgets('splash_test', (WidgetTester tester) async { // 用Sizer包裹Splash,初始化Sizer运行环境 await tester.pumpWidget( const Sizer( child: MaterialApp(home: Splash()), ), ); // 通过Key精准查找Logo组件 expect(find.byKey(const Key('splash_logo')), findsOneWidget); // 触发2秒后的页面跳转逻辑 await tester.pump(const Duration(seconds: 2)); // 验证是否成功跳转到Login页面 expect(find.byType(Login), findsOneWidget); }); }
额外注意事项
- 如果
Splash内部用Future.delayed实现自动跳转,确保用await tester.pump(Duration)或await tester.pumpAndSettle()触发状态更新,避免测试未等待跳转完成。 - 优先用
byKey查找组件,比byType更精准,避免同类型组件干扰测试结果。
内容的提问来源于stack exchange,提问作者Karan Mehta
相关产品推荐
相关产品推荐

