Я использую: https://pub.dartlang.org/packages/flutter_typeahead.
Это мой код:
@override
Widget build(BuildContext context) {
return BlocBuilder(bloc: _bloc, builder: (_, state) {
if (state is TypeHeadSearchStateInitialized) {
suggestions = [];
state.value.forEach((element) => suggestions.add(element.name));
}
return TypeAheadFormField(
textFieldConfiguration: TextFieldConfiguration(
controller: _typeAheadController,
decoration: InputDecoration(
prefixIcon: _icon,
hintText: _hintText),
),
suggestionsCallback: (String pattern) async {
return suggestions;
},
itemBuilder: (context, suggestion) {
if (suggestions.isNotEmpty)
return ListTile(
title: Text(suggestion),
);
},
onSuggestionSelected: (suggestion) {
this._typeAheadController.text = suggestion;
},
hideOnEmpty: true,
);
});
}
И это тест, который я делаю, чтобы проверить, будут ли отображаться предложения после того, как пользователь вставит что-то в textField:
testWidgets('Should return a ListTile for suggestions', (WidgetTester tester) async {
await _prepare(tester);
when(_mockService.getAllSuggestions("Name")).thenAnswer((_) async => generateTestResults(1));
await tester.enterText(find.byWidgetPredicate((Widget widget) => widget is TextField), "Name");
await tester.pump();
expect(find.byWidgetPredicate((Widget widget) => widget is ListTile), findsOneWidget);
});
Блок работает нормально, я его отлаживаю и он входит в TypeHeadSearchStateInitialized
, выполняя предложения с
state.value.forEach((element) => suggestions.add(element.name));
но затем сборка просто возвращает TypeAheadFormField, а не сборку предложений, и тест не пройден.