为什么async-await
在我的情况下不起作用?我在pageA中有一个按钮。单击后,将弹出删除确认对话框。
一旦单击确认对话框中的Yes
按钮,它将从服务器中删除数据并返回成功代码,即101返回到PageA。
一旦pageA收到返回值,它将刷新ListView
。
PageA按钮
onTap: () async {
Navigator.pop(context);
var result = await PopUpDialog().showDeleteDialog();
if (result == 101) {
setState(() {
data.removeAt(index); // remove the index in listView
});
} else {
print('fjeodpedp');
}
},
PopUpDialog
class PopUpDialog {
var result;
Future<int> showDeleteDialog() async {
....
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);
result = await _bloc.delete(); // delete server data
if (result == 101) {
return result;
}
},
),
FlatButton(
color: Colors.white,
child: Text('CANCEL'),
onPressed: () {
Navigator.of(buildContext, rootNavigator: true)
.pop('dialog');
},
)
],
....
});
return 111;
}
}
但是问题是,一旦弹出删除确认对话框,我将得到 fjeodpedp 。
答案 0 :(得分:0)
由于showDialog
是异步的,因此您return 111
在对话结束之前。
您可以尝试使用setState((){})
代替它,这样不会太混乱
答案 1 :(得分:0)
显示对话框后,您将立即返回111。不确定您的意图是什么,但在我看来,您不需要此行,因为您正在处理页面A上的返回值。
尝试删除此行,然后看看它如何进行。
答案 2 :(得分:0)
如果您按如下所示进行操作,那会更好。
animation-play-state: running
答案 3 :(得分:0)
我通常将Function参数传递给我的 showDialog 函数,例如 onYes 和 onCancel ,然后从 onTap 对话框中的em>或 onPressed 事件。
以下是基于您的原始代码的有效示例:
import 'package:flutter/material.dart';
class TestPage extends StatefulWidget {
@override
createState() => _TestPageState();
}
class _TestPageState extends State<TestPage> {
final int index = 5; // Sample index
final data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; // Sample data
@override
Widget build(BuildContext context) {
return Container(
child: RaisedButton(
child: Text("Click me"),
onPressed: () {
showDeleteDialog(
onYes: () { // This will be called when user taps 'YES'
setState(() {
data.removeAt(index); // remove the index in listView
print("removed");
});
},
onCancel: () { // This will be called when user taps 'CANCEL'
print('fjeodpedp');
}
);
},
),
);
}
void showDeleteDialog({Function onYes, Function onCancel}) async {
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);
if (null != onYes) onYes(); // Ensure the reference exists before calling it
},
),
FlatButton(
color: Colors.white,
child: Text('CANCEL'),
onPressed: () {
Navigator.pop(buildContext);
if (null != onCancel) onCancel(); // Ensure the reference exists before calling it
},
)
],
);
}
);
}
}
希望这会有所帮助:)