【问题标题】:FutureBuilder/StreamBuilder called unnecessary times when Navigator.push?当 Navigator.push 时,FutureBuilder/StreamBuilder 调用了不必要的时间?
【发布时间】:2019-11-04 05:31:08
【问题描述】:

我的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 中添加了调试点。导航时它会运行多次。

【问题讨论】:

    标签: flutter dart stream-builder


    【解决方案1】:

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

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

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

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

    这是按预期工作的。一般来说,你应该假设所有 小部件可以随时重建,但它们大部分只是一个 优化。

    特别是,路线将重建,因为它们的导航器状态已 改变了,所以他们可能需要更新他们如何画回按钮和 之类的。

    【讨论】:

    • 请再次检查我的问题。我在点击按钮时导航。
    猜你喜欢
    • 2021-12-12
    • 2020-11-09
    • 2018-11-23
    • 2021-01-28
    • 2020-04-21
    • 2019-12-25
    • 2021-12-18
    • 1970-01-01
    • 2022-08-19
    相关资源
    最近更新 更多