Flutter 中刷新 ListView

Posted

技术标签:

【中文标题】Flutter 中刷新 ListView【英文标题】:Refresh ListView in Flutter 【发布时间】:2020-03-14 18:03:24 【问题描述】:

如何刷新 ListView ? 假设在 A 页中,我有一个 ListView,并且行项目中有一个菜单图标。 当我单击菜单图标时,它将显示一个底部工作表对话框,其中包含一个删除图标。 单击删除图标时,将弹出删除确认对话框。 单击确认对话框中的“是”按钮后,它将删除该项目。一旦收到“成功”状态,它将刷新ListView。 这是底部工作表删除图标的代码

 onTap: () 
          Navigator.pop(context);
          var result =  PopUpDialog().showDeleteDialog();   // pop up confirmation dialog
          if (result == 'Success') 
                print('success');
                setState(() 
                  data.removeAt(index);
               );
            else 
               print('fjeodpedp');
           
         ,

这是确认对话框中Yes 按钮的代码。

PopUpDialog-showDeleteDialog

  onPressed: () async 
      Navigator.pop(buildContext);   // dismiss confirmation dialog
          var result = await _bloc.delete();
          return result;
    ,

集团类

Future delete() async 
    Response delete = await _repo.delete();  // delete data in server
    var deleteResponse = Response.fromJson(delete.body);
    return deleteResponse.status;   // return Success
  

我希望 setState 仅在 deleteResponse.status 等于 success 时才被调用,但一旦确认,它会继续打印 fjeodpedp弹出对话框。我添加了 async-await,但仍然无法正常工作。

正确的方法是什么?

感谢您宝贵的时间。

【问题讨论】:

【参考方案1】:

我认为您不会等待对话确认。您应该使用 await 方法来等待该对话框的结果。不知道你写了什么

PopUpDialog().showDeleteDialog();

方法,但它应该是异步的以执行后续操作。

现在您可以编写此语句来解​​决错误。

var result =  await PopUpDialog().showDeleteDialog(); 

如果你的 showDeleteDialog() 是异步的,你也可以这样做 ->

PopUpDialog().showDeleteDialog().then((result)
if (result == 'Success') 
                print('success');
                setState(() 
                  data.removeAt(index);
               );
            else 
               print('fjeodpedp');
           

);

试试这个,让我知道它是否有效。

更新

int showDeleteDialog(Function onSuccess, Function onFailure) 
    _bloc = Provider.of<Bloc>(context);
    showDialog(
        context: context,
        builder: (BuildContext buildContext) 
          return AlertDialog(
              actions: <Widget>[
                FlatButton(
                  color: Colors.orange,
                  child: Text('YES', style: TextStyle(color: Colors.white)),
                  onPressed: () async 
                    Navigator.pop(buildContext);
                    var result = await _bloc.deleteWorkOrder();
                    if(onSuccess!=null) onSuccess(result); <------ Here you can pass your result directly to the function.
                    return result;
                  ,
                ),
                FlatButton(
                  color: Colors.white,
                  child: Text('CANCEL'),
                  onPressed: () 
                    if(onFailure!=null) onFailure();
                    Navigator.of(buildContext, rootNavigator: true)
                        .pop('dialog');
                  ,
                )
              ],
              title: Text(Localization.of(buildContext).deleteDialogTitle),
              content: Text(Localization.of(buildContext).deleteDialogContent));
        );

    return 0;
  

你的成功函数应该是这样的

onSuccess(result)
           if (result == 'Success') 
                print('success');
                setState(() 
                  data.removeAt(index);
               );
            else 
               print('fjeodpedp');
           


onFailure()
//Add your failiure logic here.

【讨论】:

@Tony 它不会以这种方式工作,因为你在返回中直接返回 0,所以你每次都会返回 0。 您可以做一件事,将当前函数作为参数传递给 showDialog 方法。并在确认时调用该函数。如果您感到困惑,那么我可以给您一个简短的演示。 更新了答案。请看一下 我还是不明白。什么是 onSuccess 和 onFailure? 将该索引传递给 showDialog 方法,然后将该索引重新传递给成功函数。这样您就可以管理该问题。

以上是关于Flutter 中刷新 ListView的主要内容,如果未能解决你的问题,请参考以下文章

如何在flutter中调用函数后刷新页面?

如何在 Flutter 中刷新 AlertDialog?

Flutter局部刷新方法

Flutter ValueNotifier 倒计时 局部刷新组件 在StatelessWidget 中刷新倒计时

Flutter:在 Navigation.pop 上刷新父小部件

flutter 自动刷新token