3

我正在使用该软件包flutter_bloc进行状态管理。我想创建一个搜索屏幕,并找到了Flutter 功能,并且在为我的实现创建的实例提供实例时showSearch遇到了问题。我终于让它工作了,但想问一下最好的方法是什么。这是代码(摘录,从放置在 a 中的按钮开始):BLoCListViewSearchDelegateAppBarScaffold

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,这是问题吗?

处理此类事情的规范方法是什么?

4

2 回答 2

1

最后它按预期工作 - 推送的路由有一个新上下文,它不是具有我的 BLoC 的上下文的子级,它是Navigator. 解决方案是要么做我最初做的事情——将 BLoC 作为构造函数参数显式传递——要么确保Navigator上下文具有 BLoC,这就是我最终所做的;为此,请确保Navigator(Multi)BlocProvider.

于 2020-12-13T16:50:53.093 回答
1

是的,当路线改变时,buildContext也会改变。因此,您必须将该集团提供给新的环境。只需将页面包装在要导航的位置BlocProvider

Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) => 
BlocProvider(create: Mybloc(),child:MyPage()); 
于 2020-05-23T15:30:50.427 回答