Тест виджета 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
, Я ожидал, что верхняя левая ось Y AppBar будет 24.0
, но результат нулевой.
Я также пробовал тестировать сviewPadding
вместо того viewInsets
, но он дал тот же результат.
Я хочу знать причину, по которой в моем тесте не применяется заполнение сверху, и как решить эту проблему. Буду признателен за любую помощь. Спасибо.
1 ответ
Старый ответ:
[Вы не должны использовать MediaQuery и Scaffold таким образом.
MediaQuery не должен находиться внутри дерева виджетов и использовать его для получения мультимедийных данных. Эшафот должен покрывать весь экран]
Обновление (на основе ответа в комментариях):
Они используют MediaQuery
для имитации небезопасной зоны, например, выемки в некоторых мобильных устройствах. Это используется только для проверки виджета каркаса от вторжения в безопасные зоны (например, выемки).
Если вы просто хотите протестировать, ошибка здесь:
viewInsets: EdgeInsets.only(top: statusBarHeight),
Это должно быть viewPadding вместо viewInsets:
viewPadding: EdgeInsets.only(bottom: viewPadding),
Теперь, если вы пытаетесь создать экран вместо тестового, вам не нужно (и не нужно) использовать MediaQuery. Просто используйте Scaffold в качестве корневого виджета.