问题描述
由于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用作根小部件即可。