如何向 `showSearch` 提供 BLoC(flutter_bloc)
How to provide a BLoC (with flutter_bloc) to `showSearch`
我正在使用包 flutter_bloc
进行状态管理。我想创建一个搜索屏幕,并找到了 showSearch
Flutter 函数,并且在向我的 SearchDelegate
实现创建的 ListView
提供 BLoC
实例时遇到了问题。我终于成功了,但想问一下最好的方法是什么。这是代码(摘录,从放置在 Scaffold
中的 AppBar
中的按钮开始):
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
实现中不可用,除非我在 [=21] 中再次明确地重新提供它=].
为什么 BLoC 默认不可用? showSearch
函数在内部推送一个新的 Navigator
Route
,是这个问题吗?
处理此类事情的规范方法是什么?
是的,当路线改变时,buildContext
也会改变。因此,您必须将该集团提供给新的上下文。只需使用 BlocProvider
:
将您的页面包裹在您想要导航的位置
Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) =>
BlocProvider(create: Mybloc(),child:MyPage());
最后它按预期工作 - 推送的路由有一个新的上下文不是具有我的 BLoC 的上下文的子项,它是 Navigator
。解决方案是要么做我最初做的事情——明确地将 BLoC 作为构造函数参数传递——要么确保 Navigator
上下文具有 BLoC,这是我最终做的;为此,请确保 Navigator
是 (Multi)BlocProvider
.
的子项
我正在使用包 flutter_bloc
进行状态管理。我想创建一个搜索屏幕,并找到了 showSearch
Flutter 函数,并且在向我的 SearchDelegate
实现创建的 ListView
提供 BLoC
实例时遇到了问题。我终于成功了,但想问一下最好的方法是什么。这是代码(摘录,从放置在 Scaffold
中的 AppBar
中的按钮开始):
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
实现中不可用,除非我在 [=21] 中再次明确地重新提供它=].
为什么 BLoC 默认不可用? showSearch
函数在内部推送一个新的 Navigator
Route
,是这个问题吗?
处理此类事情的规范方法是什么?
是的,当路线改变时,buildContext
也会改变。因此,您必须将该集团提供给新的上下文。只需使用 BlocProvider
:
Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) =>
BlocProvider(create: Mybloc(),child:MyPage());
最后它按预期工作 - 推送的路由有一个新的上下文不是具有我的 BLoC 的上下文的子项,它是 Navigator
。解决方案是要么做我最初做的事情——明确地将 BLoC 作为构造函数参数传递——要么确保 Navigator
上下文具有 BLoC,这是我最终做的;为此,请确保 Navigator
是 (Multi)BlocProvider
.