我正在使用包flutter_bloc进行状态管理。我想要创建一个搜索屏幕,并找到了showSearch Flutter函数,并且一直存在向BLoC实现创建的ListView提供一个ListView实例的问题。我终于成功了,但我想问一下做这件事的最佳方法是什么。下面是代码(摘录,从放置在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,这是问题吗?
处理这种事情的标准方法是什么?
发布于 2020-12-13 16:50:53
最后,它按预期工作--推送路由有一个新的上下文,它不是具有我的BLoC的上下文的子上下文,而是Navigator的子上下文。解决方案要么是执行我最初做的事情--显式地传递BLoC作为构造函数参数--要么确保Navigator上下文具有块,这就是我最终所做的;要做到这一点,请确保Navigator是(Multi)BlocProvider的子级。
发布于 2020-05-23 15:30:50
是的,当路线改变时,buildContext也会改变。所以你必须为新的环境提供这个集团。只需将页面包装到要使用BlocProvider导航的位置即可
Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) =>
BlocProvider(create: Mybloc(),child:MyPage()); https://stackoverflow.com/questions/61973440
复制相似问题