繁体   English   中英

如何防止 FutureBuilder 重建,即使它的数据没有改变?

How to prevent FutureBuilder to rebuild even its data is unchanged?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我目前正在开发一个 Flutter 应用程序,它使用大量 REST API 与服务器端通信。 我面临一些与 FutureBuilder 小部件相关的性能问题,实现如下:

RefreshIndicator(
  displacement: 100.0,
  onRefresh: _refreshLastEntries,
  child: FutureBuilder<List<Entry>> (
    future: lastEntriesList,
    builder: (context, snapshot) {
      if(snapshot.hasError) print(snapshot.error);
      if(snapshot.data == null) return Container();
      else return ListView.builder(
        controller: _controller,
        itemCount: snapshot.data.length,
        itemBuilder: (context, index) {
          return Padding(
            padding: const EdgeInsets.all(10.0),
            child: EntryCard(entry: snapshot.data[index])
          );
        },
      );
    },
  ),
),

顺便说一句,在同一个页面构建中还有 2 个带有 RefreshIndicator 的 FutureBuilder 实现,它们用 PageView 包装。 Android Studio 中的 Flutter 性能选项卡显示平均值。 调试模式下 30 帧/秒(有时 < 30)的 fps。 在发布模式下效果更好,但仍低于 60 fps,我可以注意到 animation 滞后。

好吧,我知道问题(虽然不确定)是 FutureBuilder 试图重建,只要AsyncSnapshot有数据。 但我想不出更好的实现方式。 刷新 function _refreshLastEntries()实现为:

Future<Null> _refreshLastEntries() async {
  setState(() {
     lastEntriesList = fetchLastEntries(2);
  });
  return Future.delayed(Duration(milliseconds: 600));
}

fetchLastEntries(int)仅用于获取数据并将 map 放入某个 EntryModel class 中。 成功获取数据后,我尝试设置一个全局值,然后将其用于构建 ListView,但它不起作用。

如果这很重要,我正在使用带有 Snapdragon 835 和 Adreno 540 的小米 MI6 测试这个应用程序。

我不会附加任何其他代码作为整个 PageView 构建代码,因为很难重现相同的构建,谢谢!

1 个回复

如果未来状态没有改变, FutureBuilder小部件不应该重建。 在你的情况下可能发生的是

setState(() {
   lastEntriesList = fetchLastEntries(2);
});

_refreshLastEntries()内部导致未完成的未来重建,完成后,通过 FutureBuilder 导致另一个重建。

由于您使用的是 RefreshIndicator,我认为您不需要 FutureBuilder。 _refreshLastEntries()中执行异步工作,完成后更新 ListView.builder 小部件。 为了更清楚:

//Declare lastEntriesList as a list
List<Entry> lastEntriesList;

Future<void> _refreshLastEntries() async {
  return fetchLastEntries(2).then((lastEntries) {
    setState(() {
      lastEntriesList = lastEntries;
    });
  });
}

并按如下方式修改您的子树:

RefreshIndicator(
  displacement: 100.0,
  onRefresh: _refreshLastEntries,
  child: ListView.builder(
    controller: _controller,
    itemCount: lastEntriesList.length,
    itemBuilder: (context, index) {
      return Padding(
        padding: const EdgeInsets.all(10.0),
        child: EntryCard(entry: lastEntrieslist[index])
      );
    },
  );,
)
1 Flutter Futurebuilder 防止使用“旧数据”重建

我对颤振很陌生,我知道这个问题已经被问过几次了,但我的问题略有不同(我认为)。 我已阅读此线程、此讨论以及包括使用记忆器在内的解决方案,但我仍在苦苦挣扎。 我的情况如下。 我有一个类似于 Airbnb 的“搜索结果”页面,用户输入一个位置和一些日期,然后返回一组结果。 结果通过 API 从 get ...

2 防止 FutureBuilder 重建 flutter

我读过这个问题Flutter Switching to Tab Reloads Widgets and running FutureBuilder ,答案很好。 但如果我想要类似的东西: 我应该怎么做才能防止这个 FutureBuilder 重建? ...

3 如何防止FutureBuilder重建,即使其潜在的未来也不会改变

在Flutter中,我得到了不必要的重建。 在我的情况下,我使用FutureBuilder通过获取数据库结果来显示列表,该结果是将来的结果,并且依赖于查询参数。 我试图确保,如果查询参数未更改,FutureBuilder的未来也不会更改。但是,每次都会调用FutureBuilder的builder块 ...

4 重建 FutureBuilder

我正在尝试重建 FutureBuilder,在我的情况下,它是为了更改向用户显示的相机。 为此,我必须运行 Future,FutureBuilder 再次使用。 未来目前看起来像这样: 它正在运行的未来是这个: 我有一个按钮可以触发 FutureBuilder 的重建,它还更改了“camerafr ...

6 Flutter FutureBuilder - 即使数据为空如何返回组件?

我有一个奇怪的问题。 我正在调用一种方法来获取设备区域设置。 但我希望默认值为“是”,例如,如果没有互联网连接。 但是当我测试它时,屏幕只是空白。 它在有互联网连接时工作并返回带有语言环境的 App 组件。 但是关了就不行了。 我也试过: 但它不会工作。 ...

7 如何防止 flutter 中的数据重建

我在 initState 中使用异步等待。我使用它来防止每次加载数据。 但我得到相同的结果......数据总是首先try然后我的小部件出现......然后my resultIn将出现在最后......这是我的代码 是否有可能让resultIn=responseJson["data"]["date"] ...

8 如何防止futureBuilder不断调用

当我从TextformField选择一个值时,由于fututeBuilder不断调用,该值不会改变。 它保持旧值。 解决办法是什么? 这里是输出。 如您所见,先前的值为“5”。 当我选择“3”时,值仍然是“5”,因为futureBuilder一直在调用。 ...

10 如何防止在颤振中重建

我现在有一个问题,就是一个Row小部件包含很多图片,如下: 当我回到从网页B的网页A,该网页A将重建,但我不希望重建部件排在网页A,因为它包含了许多照片。 有什么办法吗? 谢谢!!! ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM