flutter - 如何在 Flutter 的 Futures 中使用 Futures?
问题描述
Soo,标题可能有点令人困惑,但现在让我澄清一下。我有一个名为 UserController 的类,它有一个名为 updateUserData 的方法。它获取一个 Map<String, dynamic> 并使用地图值中给定的任何内容更新用户的给定属性。
我想做的是:向服务器发送补丁请求,等待服务器返回更改的用户对象,将其写入某个局部变量并将值或错误返回给调用该方法的任何人(在我的情况下是一个 GUI 类)。
目前的方法是:
Future<User> updateUserData(Map<String, dynamic> changes) async {
return await http.patch(
"url",
headers: {HttpHeaders.authorizationHeader: "token"},
body: changesMap
).then((newUserObject) => {
currentUser = newUserObject;
//return new user object for display
}); //error from server gets forwarded to GUI.
}
可悲的是,这根本不起作用。似乎 Flutter/dart 不知道在那里返回什么(它给了我一个 return_of_invalid_type_from_closure 错误)。我希望很清楚我的目标是什么。我想在这个方法中使用“then”子句,但仍然返回一个未来,它要么包含我从服务器获得的用户,要么包含我得到的错误。
我怎么做?到目前为止,我查阅了很多 Future 教程,但没有一个使用过类似的东西。
解决方案
你永远不需要使用async/await
with then
。在您的情况下,最简单的做法是等待您的请求的响应,然后将其放入您的本地变量。
然后你只需要返回值。
Future<User> updateUserData(Map<String, dynamic> changes) async {
final response = await http.patch(
"url",
headers: {HttpHeaders.authorizationHeader: "token"},
body: changesMap,
);
// You need to parse the response to get your User object.
final responseJson = json.decode(response.body);
newUserObject = User.fromJson(responseJson);
currentUser = newUserObject;
return newUserObject;
}
如果您需要将您的 Map 解码为一个类,您可以在此处查看给出的答案
推荐阅读
- python - 如何在 O(1) 中的 numpy 中获得反向映射?
- json - SQL Server 2017 的 Json 输出格式
- function - SSRS 函数需要从附加数据集中读取字段
- java - else 有问题(如果没有理由,程序跳转到 else)
- angular - 选择器返回 404
- javascript - 在每次迭代结束时无条件执行的 RxJs 运算符
- javascript - 离子确认警报:在继续之前等待点击警报
- java - 如何在 Inteliij IDEA 中使用由“数据库”实用程序连接的数据库?
- javascript - 浏览器使用 JS socket.io 连接多个套接字
- r - rbind() 返回矩阵而不是数据帧,arrange() 不安排时间