【问题标题】:How to refresh flutter UI on AlertDialog close?如何在 AlertDialog 关闭时刷新颤振 UI?
【发布时间】:2019-05-21 19:35:51
【问题描述】:

我正在开发某种时间跟踪应用程序。它背后的主要思想很简单 - 为想要的项目添加小时数并显示每天的小时总和。

我为此使用 Flutter 和 dart,我有以下内容: - 每个工作日的卡片列表 - 卡片已实现手势检测器点击 - 此操作将显示所选日期的所有项目 - 弹出 AlertDialog 以添加小时

我正在尝试在警报对话框弹出关闭时刷新所选日期的总小时数,而不重新加载所有数据。

有人可以帮助我了解如何实现刷新吗?

到目前为止我尝试过的如下:

  1. 我在导航到上一个屏幕之前更新了数据上下文(传递的值)
  2. 我使用 StatefulWidget 来为我的应用添加交互性
  3. 我在返回上一屏幕之前使用 setState 更改数据,但没有任何成功。
  4. 我在谷歌上找到了多种“刷新”用户界面的方法,但都没有成功
  5. 我尝试使用 setState(),因为它可以完美处理某些数据,但出现以下错误:“构建函数返回 null。”
  6. 我将 setState 添加为 ShowDialog 的一部分,但出现以下错误:“在构建期间调用了 setState() 或 markNeedsBuild()。”所以我添加了额外的逻辑来检查数据是否脏,但在一天结束时我得到了相同的结果。

对此的期望行为是单击卡片并显示所选日期的所有项目。添加新值后,我想回到同一个地方(打开卡片),新添加的项目将显示在列表中,以及当天更新的总小时数。

现在,我完成了部分编辑。我打开卡片并编辑现有项目之一。数据已保存,但当我返回上一个屏幕时,我无法更新 UI 上的小时数。当我再次打开编辑屏幕时,显示的数据符合预期。

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    首先,您需要在Stateful Widget 中调用您的showDialog,以便访问,顾名思义,进入一个状态。然后,在该屏幕中,您可以调用一个方法并显示您的对话框,它将返回一个Future<void>,这意味着您可以在对话框关闭后执行该操作,例如

    showDialog(// Yours params).then((_)=>setState((){}));

    并且您的 UI 将更新以匹配更改。

    【讨论】:

    • 使用 Navigator 返回上一页时也会出现同样的问题。当用户返回特定页面时,flutter 也无法判断该页面现在是否可见。我用来实现这一点的相同解决方案。
    • hi try await showDialog( //你的对话代码 ).then((val){ Navigator.pop(_context); });
    • .then((_) 中的下划线是什么?
    • 这是一个 Dart 命名约定,用于将被忽略的变量(因此,根本不使用)。
    【解决方案2】:

    当想要刷新屏幕时,在弹出导航器中返回 true

    FlatButton(
        onPressed: () {
            Navigator.of(context).pop(true);
          },
        child: Text("Close"))
    

    结果为真时刷新屏幕

       final result = await showDialog<bool>(
          context: context,
          builder: (context) => MyDialog(),
        )
       if(result){// refresh screen}
    

    【讨论】:

      猜你喜欢
      • 2021-11-11
      • 2021-10-20
      • 2020-12-20
      • 2018-11-13
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2019-01-28
      相关资源
      最近更新 更多