首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为“”提供BLoC (与flutter_bloc一起)

如何为“”提供BLoC (与flutter_bloc一起)
EN

Stack Overflow用户
提问于 2020-05-23 14:22:08
回答 2查看 1.1K关注 0票数 4

我正在使用包flutter_bloc进行状态管理。我想要创建一个搜索屏幕,并找到了showSearch Flutter函数,并且一直存在向BLoC实现创建的ListView提供一个ListView实例的问题。我终于成功了,但我想问一下做这件事的最佳方法是什么。下面是代码(摘录,从放置在AppBar中的Scaffold中的一个按钮开始):

代码语言:javascript
复制
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,这是问题吗?

处理这种事情的标准方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-13 16:50:53

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

票数 1
EN

Stack Overflow用户

发布于 2020-05-23 15:30:50

是的,当路线改变时,buildContext也会改变。所以你必须为新的环境提供这个集团。只需将页面包装到要使用BlocProvider导航的位置即可

代码语言:javascript
复制
Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) => 
BlocProvider(create: Mybloc(),child:MyPage()); 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61973440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档