我正在使用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
实现中不可用,除非我在buildSuggestions
中再次显式地重新提供它。
为什么默认情况下BLoC不可用?showSearch
函数在内部推送了一个新的Navigator
Route
,这是问题所在吗?
处理这类事情的规范方法是什么?
3条答案
按热度按时间93ze6v8z1#
是的,当路由改变时,
buildContext
也会改变。因此,您必须为新上下文提供该块。只需在您想要使用BlocProvider
导航的页面中换行:wa7juj8i2#
最后,它按预期工作-推送的路由有一个新的上下文,它不是具有我的BLoC的上下文的子上下文,它是
Navigator
的子上下文。解决方案是做我最初做的事情-将BLoC显式地作为构造函数参数传递-或者确保Navigator
上下文具有BLoC,这是我最终做的;要做到这一点,请确保Navigator
是(Multi)BlocProvider
的子节点。lh80um4z3#
然后使用Bloc provider+builder显示更改