Flutter / Dart: onPressed не вызывается при нажатии на виджет AppBar в тесте виджетов

Моя проблема в том, что у меня есть виджет без состояния, который возвращает AppBarс событием onPressed. В моем соответствующем widgetTest я нажимаю на компонент и ожидаю, что будет вызван метод onPressed. Однако это не так.

Это мой виджет:

import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';

class IconAppBar extends StatelessWidget with PreferredSizeWidget {
  final VoidCallback onPressed;

  IconAppBar({this.onPressed});

  @override
  Widget build(BuildContext context) {
    return AppBar(
      leading: IconButton(
        color: Colors.black,
        icon: SvgPicture.asset(
          "resources/images/icon.svg",
          width: 24,
          height: 24,
        ),
        onPressed: onPressed,
      ),
    );
  }

  @override
  Size get preferredSize => Size.fromHeight(kToolbarHeight);
}

В тесте я создаю виджет с помощью простого теста onPressed, если компонент был нажат.

void main() {
    testWidgets("Should run onPressed when tapped",
        (WidgetTester tester) async {
      var counter = 0;
      void callback() {
        counter++;
      }

      await tester.pumpWidget(
        MediaQuery(
          data: MediaQueryData(),
          child: MaterialApp(
            localizationsDelegates: [
              GlobalMaterialLocalizations.delegate,
              GlobalWidgetsLocalizations.delegate,
              GlobalCupertinoLocalizations.delegate,
            ],
            home: IconAppBar(
              onPressed: callback,
            ),
          ),
        ),
      );

      await tester.pump(Duration(milliseconds: 300));
      await tester.tap(find.byType(IconAppBar));
      await tester.pump(Duration(milliseconds: 300));

      expect(counter, 1); // fails because actual counter is 0
    });
}

Переход на tester.pump() или же tester.pumpAndSettle()ничего не менял. Метод не называется.

Запустив это на реальном устройстве или в эмуляторе, onPressed работает должным образом.

Также дымовой тест с find.byType(IconAppBar) находит виджет.

Буду очень признателен за любую помощь или идеи. Благодаря!

РЕДАКТИРОВАТЬ: Кажется, это просто не работает с IconButton. Я просто поменял его на FlatButton с SVG в качестве его дочернего элемента, и все было в порядке.

1 ответ

Не знаю, помогает ли это:

class IconAppBar extends StatelessWidget with PreferredSizeWidget {
  final VoidCallback onPressed;

  BackButtonAppBar({this.onPressed});

  void click() {
    print("Its Working!");
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
      leading: IconButton(
        color: Colors.black,
        icon: SvgPicture.asset(
          "resources/images/icon.svg",
          width: 24,
          height: 24,
        ),
        onPressed: () {
          click();
        },
      ),
    );
  }
}
Другие вопросы по тегам