Не могу ввести текст в тесте на флаттер

Я пытался протестировать элемент, который при нажатии IconButton текстовый объект изменяется на TextFormField. Когда я пытаюсь это проверить, я получаю следующую ошибку:

A Timer is still pending even after the widget tree was disposed.
'package:flutter_test/src/binding.dart': Failed assertion: line 672 pos 7:
'_fakeAsync.nonPeriodicTimerCount == 0'

Несмотря на то, что виджет не использует таймеры, о которых я знаю?

Пример кода:

await tester.tap(find.byType(IconButton));
await tester.pump();

expect(find.byType(TextFormField), findsOneWidget);
await tester.pump();
await tester.enterText(find.byType(EditableText), "0.2");

Я действительно не уверен, что вызывает проблему, но если я удалю последние 2 строки, все будет нормально (хотя я не могу фактически проверить свой ввод).


person Alistair McIntyre    schedule 26.04.2018    source источник


Ответы (2)


Проблема заключалась в том, что используемое текстовое поле имело задержку 300 мс, так что клавиатура могла прокручиваться для просмотра, а затем приложение могло прокручиваться до текстового поля. Я полностью проигнорировал эту задержку в текстовом поле и не учел ее.

Добавление

await tester.pump(Duration(milliseconds:400));

сработало именно так, как задумано.

person Alistair McIntyre    schedule 26.04.2018

Назначьте ключ редактируемому тексту

new EditableText(
  key: new Key('mySpecialEditableText1234'),
  controller: myCtrl,
  style: myStyle,
  focusNode: myFocusNode,
)

и получите доступ к этому виджету в своем тесте как:

find.byKey(new Key('mySpecialEditableText1234'))

Если ваш виджет не найден, вероятно, ваш tester экземпляр не перекачивает нужный виджет.

ПРИМЕЧАНИЕ. Убедитесь, что вы используете правильный путь навигации. Вы не можете напрямую прокачать виджет, который не является первым в дереве

person Arnold Parge    schedule 26.04.2018
comment
Экземпляр тестера отлично нашел виджет, я опубликую решение в качестве другого ответа. - person Alistair McIntyre; 27.04.2018