Flutter - 在得到预期的 200 之前总是得到错误的 POST 400 响应
Posted
技术标签:
【中文标题】Flutter - 在得到预期的 200 之前总是得到错误的 POST 400 响应【英文标题】:Flutter - Always getting wrong POST 400 response before getting the expected 200 【发布时间】:2020-02-24 11:12:22 【问题描述】:我在尝试在 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" Not OK 消息”,然后显示预期的“Unload OK”消息。
我已经阅读了很多 async/await/then 文章(Threading in Flutter、Using Futures Guide for Beginners、Flutter Async Loader),我很确定问题出在我编写代码的方式上,但我无法让它正常工作,因为我没有任何使用异步调用的经验。
谢谢。
【问题讨论】:
您发布的网址是什么?与curl
的行为相同吗?
【参考方案1】:
我发现了错误。问题是在 setState() 中多次调用 processUnload 方法。所以,我只需要添加一个标志来防止它同时被多次调用并删除 setState():
Widget createCodeText()
bool processing = false;
return Expanded(
child: TextField(
autofocus: true,
decoration: InputDecoration(hintText: 'Esperando lectura...'),
showCursor: false,
controller: controllerCode,
focusNode: focusNode,
onChanged: (code) async
if (!processing)
processing = true;
await processUnload (code);
processing = false;
controllerCode.clear();
,
),
);
【讨论】:
以上是关于Flutter - 在得到预期的 200 之前总是得到错误的 POST 400 响应的主要内容,如果未能解决你的问题,请参考以下文章
Flutter 'showDatePicker' 抛出异常:错误:预期值为 'String' 类型,但得到类型为 'Null' 的值之一
NSLocalizedDescription=(200-299) 中的预期状态码,得到 400
AFNetworking 错误:“(200-299)中的预期状态代码,得到 404”
NSLocalizedDescription=(200-299)中的预期状态码,得到 422
RestKit .20 RKRequestDescriptor postObject - (400-499) 中的预期状态代码,得到 200