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 ValueNotifier 倒计时 局部刷新组件 在StatelessWidget 中刷新倒计时