如何向`showSearch`提供BLoC(带flutter_bloc)

ohtdti5x  于 2023-05-19  发布在  Flutter
关注(0)|答案(3)|浏览(124)

我正在使用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函数在内部推送了一个新的NavigatorRoute,这是问题所在吗?
处理这类事情的规范方法是什么?

93ze6v8z

93ze6v8z1#

是的,当路由改变时,buildContext也会改变。因此,您必须为新上下文提供该块。只需在您想要使用BlocProvider导航的页面中换行:

Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) => 
BlocProvider(create: Mybloc(),child:MyPage());
wa7juj8i

wa7juj8i2#

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

lh80um4z

lh80um4z3#

class DiscoverSearchDelegate extends SearchDelegate {
final AppSearchBloc appSearchBloc = AppSearchBloc();
....
}

然后使用Bloc provider+builder显示更改

@override
  Widget buildSuggestions(BuildContext context) {
    appSearchBloc.add(AppSearchEvent.changeQuery(query));
    return BlocProvider.value(
      value: appSearchBloc,
      child: BlocBuilder<AppSearchBloc, AppSearchState>(
        builder: (context, state) {
          return SearchHistory(
            state.searchStory,
            onSearch: (value) {
              query = value;
              // showResults(context);
            },
          );
        },
      ),
    );
  }

相关问题