我正在使用软件包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
,这是问题吗?
处理这种事情的规范方法是什么?
答案 0 :(得分:1)
是的,当路线更改时,buildContext
也会更改。因此,您必须将该块提供给新上下文。只需用BlocProvider
将页面包装在您要导航的位置即可:
Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) =>
BlocProvider(create: Mybloc(),child:MyPage());
答案 1 :(得分:0)
最后,它按预期方式工作-推送的路由具有一个新上下文,该上下文不是具有我的BLoC的上下文的子代,它是Navigator
的子代。解决方案是要么做我最初做的事情-明确地将BLoC传递为构造函数参数-要么确保Navigator
上下文具有BLoC,这是我最终要做的事情;或者为此,请确保Navigator
是(Multi)BlocProvider
的子代。