如何为`showSearch`提供BLoC(带有flutter_bloc)

时间:2020-05-23 14:22:08

标签: flutter bloc flutter-bloc

我正在使用软件包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,这是问题吗?

处理这种事情的规范方法是什么?

2 个答案:

答案 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的子代。