0

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。导航时它会运行多次。

4

1 回答 1

1

每次getFromBloc流更改(获取新数据)时都会调用 pushNamed。您根本不应该在 build 函数中的任何地方调用它。你可能想这样做:

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

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

UPD:我误会你了。每次推送新路由时,不仅 StreamBuilder 会重建,而且堆栈上的每个页面都会重建以更新后退按钮。有一个问题

这是按预期工作的。一般来说,您应该假设所有小部件都可以随时重新构建,而它们并非主要只是一种优化。

特别是,路线将重建,因为它们的导航器状态已更改,因此它们可能需要更新它们如何绘制按钮等。

于 2019-11-04T05:39:58.067 回答