【问题标题】:How do I use Futures in Futures in Flutter?如何在 Flutter 的 Futures 中使用 Futures?
【发布时间】:2020-10-13 18:34:23
【问题描述】:

Soo,标题可能有点令人困惑,但现在让我澄清一下。 我有一个名为 UserController 的类,它有一个名为 updateUserData 的方法。它获取一个 Map 并使用地图值中给定的任何内容更新用户的给定属性。

我想做的是:向服务器发送补丁请求,等待服务器返回更改的用户对象,将其写入某个局部变量,然后将值或错误返回给调用该方法的人(在我的例子中是一个 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 教程,但没有一个使用过类似的东西。

【问题讨论】:

    标签: flutter asynchronous dart future


    【解决方案1】:

    您永远不需要将async/awaitthen 一起使用。在您的情况下,最简单的做法是等待您的请求的响应,然后将其放入您的本地变量中。

    那么你只需要返回值。

    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 解码为 Class,you can see the answer given here

    【讨论】:

    • 我大致了解这些变化,但现在我遇到了与我找到的 this 文档相同的问题。我不明白如何在这里/那里计算返回类型。由于我的方法明确指出它将返回一个 Future 对象,但 newUserObject 的类型是 User,而不是 Future
    • @Panossa 在这里你可以得到处理这些错误的详细方法medium.com/flutter-community/…
    • 关于第一个问题,您的方法返回一个 Future 因为它是异步的。因此,每次调用时,都需要等待响应。
    • 另外,我想向你推荐 Dio 包。它有一些很酷的功能。看看错误处理部分:pub.dev/packages/dio#handling-errors
    • 谢谢,这对我帮助很大!所有的。 :D(虽然我必须说我不喜欢 Dio 的语法,所以我可能不会使用它)
    猜你喜欢
    • 1970-01-01
    • 2019-11-18
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 2012-12-25
    • 2013-02-09
    • 1970-01-01
    相关资源
    最近更新 更多