0

由于 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,但它产生了相同的结果。

我想知道我的测试中没有应用顶部填充的原因,以及如何解决这个问题。我将不胜感激任何帮助。谢谢。

4

1 回答 1

0

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

更新(基于评论中的答案):

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

如果你只是想测试,错误在这里:

viewInsets: EdgeInsets.only(top: statusBarHeight),

它应该是 viewPadding 而不是 viewInsets:

viewPadding: EdgeInsets.only(bottom: viewPadding),

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

于 2020-08-21T20:01:36.720 回答