Flutter小部件测试:未应用MediaQuery设置填充

问题描述

由于flutter的测试环境不包含模拟器之类的系统状态栏,因此我想使用MediaQuery在顶部添加填充。

这是我的测试代码:

void main() {
  testWidgets('MediaQuery padding test',(WidgetTester tester) async {
    const double statusBarHeight = 24.0;

    await tester.pumpWidget(
      MaterialApp(
        home: MediaQuery(
          data: const MediaQueryData(
            viewInsets: EdgeInsets.only(top: statusBarHeight),),child: Scaffold(
            appBar: AppBar(
              title: const Text('PopupMenu Test'),);

    expect(find.byType(AppBar),findsOneWidget);
    expect(tester.getTopLeft(find.byType(AppBar)).dy,windowPaddingTop);
  });
}

由于我使用24.0添加了MediaQueryData.viewInsets的顶部填充,因此我期望AppBar的左y轴为24.0,但结果为零。
我也尝试过使用viewPadding而不是viewInsets进行测试,但是产生了相同的结果。

我想知道为什么在我的测试中未应用顶部填充的原因,以及如何解决此问题。我将不胜感激任何帮助。谢谢。

解决方法

旧答案:
[您不应以这种方式使用MediaQuery和Scaffold。 MediaQuery不应位于小部件树和中,而应使用它来检索媒体数据。 支架应覆盖整个屏幕]

更新(根据评论中的答案):

他们正在使用MediaQuery模拟非安全区域,例如某些手机上的缺口。这仅用于测试脚手架小部件以防入侵安全区域(如缺口)。

如果您只想测试,则错误在这里:

viewInsets: EdgeInsets.only(top: statusBarHeight),

应该是viewInsets的viewPadding接口:

viewPadding: EdgeInsets.only(bottom: viewPadding),

现在,如果您尝试构建一个屏幕而不是测试一个屏幕,则不需要(也不应)使用MediaQuery。只需将您的Scaffold用作根小部件即可。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...