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();
},
),
);
}
}