Тестирование флаттера: как вы можете прокручивать с помощью DropDownButton?
Мне не удалось применить документацию по ручке прокрутки с виджетами DropdownButton и DropdownButtonFormField.
Я попытался создать список из 10 000 строк, прокрутил, чтобы найти 750-ю, и коснулся ее. Тест генерирует предупреждающее сообщение при последнем касании: «Вызов tap()... который не сработает... Возможно, виджет на самом деле находится за пределами экрана, или другой виджет закрывает его, или виджет не может получить указатель Мероприятия."
Почему-то тест говорит, что проходит, что очень настораживает.
Любая помощь будет очень признательна.
Вот код, который я использовал для виджета:
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
const title = 'Long List';
// Generate a list of "Item 1" ... "Item 10000"
List<String> items = List<String>.generate(10000, (i) => "Item $i");
return MaterialApp(
title: title,
home: Scaffold(
body: buildListView(items),
),
);
}
DropdownButton buildListView(List<String> items) {
// Flutter documentation implementation https://api.flutter.dev/flutter/material/DropdownButton-class.html
return DropdownButton(
items: items.map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
onChanged: (value) {},
);
}
}
И "проходной" тест:
testWidgets('Counter increments smoke test', (WidgetTester tester) async {
// Build our app and trigger a frame.
await tester.pumpWidget(MyApp());
// Find the list
final listFinder = find.byType(Scrollable);
// Item searched from list
final itemFinder = find.text('Item 750');
// Open the list
await tester.tap(find.byType(DropdownButton<dynamic>));
await tester.pumpAndSettle();
// Scroll until the item to be found appears.
await tester.scrollUntilVisible(
itemFinder,
500.0,
scrollable: listFinder,
maxScrolls: 100
);
await tester.pumpAndSettle();
// Tap the value generates warning "A call to tap()...that would not hit..."
await tester.tap(itemFinder);
await tester.pumpAndSettle();
// But finding the value passes ?...
expect(itemFinder, findsOneWidget);
});