我在Flutter中尝试获得对POST请求的正确响应时遇到了一些麻烦。这是我写的方法:
Future<void> processUnload(String code) async {
Map info = {
'code': "$code",
};
try {
var response = await http.post(
url + "/unload/code",
body: json.encode(info), headers: {
"Content-Type": "application/json",
"Authorization": "Bearer $token"
}
);
if (response.statusCode == 200) {
showUnloadOKMessage();
} else {
showUnloadNotOKMessage(response.body);
}
}catch (error) {
if (error.toString().contains("Failed host lookup")) {
notDelivered.add(OfflineCart(code, DateTime.now().toString()));
showOfflineUnloadMessage();
}
}
}
showUnloadOKMessage() {
return showDialog<void>(
context: context,
barrierDismissible: false,
builder: (BuildContext context) {
return AlertDialog(
title:
Text('Unload OK.', style: TextStyle(color: Colors.green)),
actions: <Widget>[
FlatButton(
child: Text('OK', style: botonGrandeRojo),
onPressed: () {
Navigator.of(context).pop();
FocusScope.of(contextobuild).requestFocus(focusNode);
},
),
],
);
},
);
}
showUnloadNotOKMessage(String msg) {
return showDialog<void>(
context: context,
barrierDismissible: false,
builder: (BuildContext context) {
return AlertDialog(
title: Text(msg, style: TextStyle(color: Colors.red)),
actions: <Widget>[
FlatButton(
child: Text('OK', style: botonGrandeRojo),
onPressed: () {
Navigator.of(context).pop();
FocusScope.of(contextobuild).requestFocus(focusNode);
},
),
],
);
},
);
}
问题是,发出POST请求时,在获得实际和预期的response.statusCode == 200之前,我总是得到4或5 response.statusCode ==400。因此,应用程序始终显示4或5确定消息”,然后显示预期的“卸载确定”。
我已经阅读了很多异步/等待/然后的文章(Threading in Flutter,Using Futures Guide for Beginners,Flutter Async Loader),而且我很确定问题出在我编写代码的方式上,但是我可以因为我没有使用异步调用的经验,所以无法使其正常工作。
谢谢。
我发现了错误。问题是在setState()中多次调用processUnload方法。因此,我只需要添加一个标志以防止同时调用多次并删除setState():