Я использую пакет flutter_bloc
для управления состоянием. Я хочу создать экран поиска и нашел функцию showSearch
Flutter, и у меня возникли проблемы с предоставлением экземпляра BLoC
для создаваемой ListView
моей SearchDelegate
реализации. Наконец-то я заставил это работать, но хотел бы спросить, как лучше всего это сделать. Вот код (отрывки, начиная с кнопки, помещенной в AppBar
в Scaffold
):
class ItemSearchButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
return IconButton(
icon: Icon(Icons.search),
onPressed: () {
final itemListBloc = context.bloc<ItemListBloc>();
showSearch(
context: context,
delegate: _ItemSearchDelegate(itemListBloc),
);
},
);
}
}
class _ItemSearchDelegate extends SearchDelegate<String> {
final ItemListBloc itemListBloc;
_ItemSearchDelegate(this.itemListBloc);
// other overridden methods
@override
Widget buildSuggestions(BuildContext context) {
return BlocProvider.value(
value: itemListBloc,
child: ItemListWidget(),
);
}
}
По сути, контекст, который вызывает метод showSearch
, имеет правильный экземпляр BLoC, но он недоступен в моей реализации SearchDelegate
, если я не предоставлю его снова явно в buildSuggestions
.
Почему BLoC по умолчанию недоступен? Функция showSearch
внутренне подталкивает новый Navigator
Route
, это проблема?
Каков канонический подход к таким вещам?