当Navigator.push时,FutureBuilder / StreamBuilder调用了不必要的时间?

时间:2019-11-04 05:31:08

标签: flutter dart stream-builder

我的FutureBuilder/StreamBuilder在使用push导航时称不必要的时间。是否可以不做任何更改就停止navigator.push

 Stream<List<Categorie>> getFromBloc;

  @override
  void didChangeDependencies() {
    getFromBloc = getData();
    super.didChangeDependencies();
  }

内部state,外部build方法

  Stream<List<Categorie>> getData()=>
     _categoryBloc.category;

构建方法

   StreamBuilder(
        stream: getFromBloc,//_categoryBloc.category,
        builder: (_, AsyncSnapshot<List<Categorie>> snapshot) {
          if (snapshot.data == null) {
               ...
          } else {
            ...
            GestureDetector(
              child:...,
              onTap:(){
              Navigator.of(context).pushNamed('/subCategory',arguments: Arguments(postModel: post));
              }
          }
        })

我在streamBuilder内添加了调试点。导航多次运行时。

1 个答案:

答案 0 :(得分:0)

每次 getFromBloc 流更改(获取新数据)时,都会调用

pushNamed。您根本不应该在build函数中的任何地方调用它。您可能想要这样做:

getFromBloc.first.then((data) => Navigator.of(context).pushNamed('/subCategory',arguments: Arguments(postModel: post)))

例如,您可以在initState中进行操作。 getFromBloc流获得新值后,回调将仅执行一次。

UPD :我错了。每次按下新路线时,不仅StreamBuilder会得到重建,而且堆栈上的每个页面也会得到重建以更新“后退”按钮。有一个issue

  

这按预期工作。通常,您应该假设   窗口小部件可以随时重建,而大部分时间不是   优化。

     

尤其是,由于其导航器状态为   已更改,因此他们可能需要更新其退回按钮的方式,并   之类的。