首页 > 解决方案 > 如何在 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 教程,但没有一个使用过类似的东西。

标签: flutterasynchronousdartfuture

解决方案


你永远不需要使用async/awaitwith 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 解码为一个类,您可以在此处查看给出的答案


推荐阅读