Flutter:在DragTarget的onWillAccept函数内等待警报对话框的响应



我最近开始学习Flutter,在使用Droppable和DragTarget处理拖放时遇到了一些问题。当我将可拖动元素拖动到DropTarget元素上时,我在onWillAccept方法中进行了一些验证。这里的一个条件要求我在返回true并转到onAccept方法之前,与用户确认他们是否愿意继续他们的操作。出于某种原因,代码执行不会等待用户的操作返回。

这就是我的DragTarget看起来的

DragTarget<Map>(
builder: (context, listOne, listTwo) {
return Container();
},
onWillAccept: (value) {
if(condition1) {
return true;
} else if(condition2) {
return true;
} else {
if(!condition3) {
return true;
} else {
await _showConfirmation();
return false;
}
}
},
onAccept: (value) {
print(value);
},
)

_showConfirmation方法看起来像这个

Future<void> _showConfirmation() async {
return showDialog<void>(
context: context,
barrierDismissible: false,
builder: (BuildContext context) {
return AlertDialog(
title: Text('Attention'),
content: SingleChildScrollView(
child: ListBody(
children: <Widget>[
Text('Some message")
],
),
),
actions: <Widget>[
FlatButton(
child: Text('Accept'),
onPressed: () {
Navigator.of(context).pop();
return true;
},
),
FlatButton(
child: Text('Cancel'),
onPressed: () {
Navigator.of(context).pop();
return false;
},
)
],
);
},
);
}

添加wait没有帮助,因为onWillAccept不是异步的。使其异步也无济于事。

_showConfirmation().then((result) {
return result
})

上面的代码也没有帮助。在许多情况下,拖动的项目会挂在"拖动目标"框上。

如有任何帮助,我们将不胜感激,谢谢。

这里发生的是,_showConfirmation()返回一个Widget,而不是布尔值——这似乎是您从提供的代码片段中所期望的。当前设置允许在不等待布尔值的情况下返回false。

await _showConfirmation();
return false;

您可以使用then((等待返回值,而不是_showConfirmation()返回Widget并继续返回false。

更改_showConfirmation()以返回布尔

Future<bool> _showConfirmation() async {
...
}

然后在返回之前呼叫等待。

return await _showConfirmation();

相关内容

  • 没有找到相关文章

最新更新