Тестирование флаттера: как вы можете прокручивать с помощью 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);
});

0 ответов

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