【问题标题】:Stateful Builder not updating list in flutter while using interactiveScrollViewer使用 interactiveScrollViewer 时,有状态的 Builder 不会在颤动中更新列表
【发布时间】:2021-01-19 12:42:39
【问题描述】:

我正在使用 InteractiveScrollViewer,并且列表未在添加和更新功能上更新,因此我将 StatefulBuilder 用于 CardList。现在它在同一页面上工作正常,但如果我推送另一个页面,即 endDrawer 并在我弹出页面时更新项目,页面中不会显示任何效果。

StatefulBuilder(
                              builder:
                                  (BuildContext context,
                                          StateSetter _setState) =>

我正在更新抽屉关闭时运行的某个函数中的项目列表。我无法在这个函数中发送 _setstate,因为这个函数是全局函数。

我可以为嵌套滚动视图使用哪些其他技术。

编辑:

 bloc.getAllFoodItems(_id).then((value) {
      if (!mounted) return;
      setState(() {
        _itemList = value;
        if (menuItemsList != null && menuItemsList.length != 0)
          for (int i = 0; i < menuItemsList.length; i++) {
            if (menuItemsList[i].id != null) {
              int ls = -1;
              if (_itemList != null)
                ls = _itemList
                    .indexWhere((item) => item.itemID == menuItemsList[i].id);

              if (ls != -1) {
                setState(() {
                  menuItemsList[i].quantity = _itemList[ls].quantity;
                });
              } else
                setState(() {
                  menuItemsList[i].quantity = 0;
                });
            }
          }
      });
    });

此代码在绘图关闭时运行。

【问题讨论】:

  • 你能告诉我们Drawer关闭时运行的函数吗?
  • endDrawer: DrawerPage(回调: setDrawerOpened, ),
  • void setDrawerOpened(bool isOpen) { print(isOpen); if (!isOpen) { _fetchCount(); } }

标签: flutter scroll flutter-layout updating stateful


【解决方案1】:

您的问题是状态管理。

当您说您正在从另一个页面更新时,主要问题是您的抽屉可能没有全局保存状态,因此任何想要获取信息以构建 CardsList 的页面都将使用相同的信息。

现在主要的决策点是决定您要使用哪个状态管理系统。您可以拥有以下任何一种甚至更多:Provider、Bloc、InheritedWidget 等。 以下是 Flutter 官方文档中关于许多选项的列表: https://flutter.dev/docs/development/data-and-backend/state-mgmt/options

PS:对于简单的应用,我推荐 MobX 或 GetX,因为它减少了样板。

【讨论】:

  • 我正在使用 bloc 并更新来自 bloc 的列表中的项目数量。
  • 列表已更新,但由于每张卡的 _setState 而未显示。
  • @B.Ayaz 能否请您添加您的 bloc 代码和用于更新状态的代码?否则我无法为您提供详细的帮助
  • void setDrawerOpened(bool isOpen) { print(isOpen); if (!isOpen) { _fetchCount(); } }
  • 添加了完整的功能
猜你喜欢
  • 2021-05-23
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 2020-08-04
  • 1970-01-01
  • 2019-05-14
相关资源
最近更新 更多