如何向 `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.

的子项