Тест виджета 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 в качестве корневого виджета.

Другие вопросы по тегам