【问题标题】:how do I return a value from my async function? [duplicate]如何从我的异步函数返回一个值? [复制]
【发布时间】:2021-06-02 08:22:43
【问题描述】:

所以我有一个异步函数:

Future decodeToken() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  var token = await prefs.getString('token');
  final Map<String, dynamic> payload = json.decode(
    ascii.decode(
      base64.decode(base64.normalize(token.split(".")[1])),
    ),
  );
  return payload;
}

当我尝试做的时候:

var payload = await decodeToken();

它抛出一个错误说“等待表达式只能在异步函数中使用。”

我尝试取出“await”并打印有效载荷变量,但显然它打印“Instance of Future”

如果我这样做:

decodeToken().then((value)=>print(value)) 

它正确打印了值,但我想在变量中使用它,如何返回异步函数的 vvalue?

【问题讨论】:

  • 请不要编辑问题的答案。如果您有答案,请发布您自己问题的答案。由于您的问题已作为重复项关闭,如果您认为对未来用户有帮助,请添加对重复项的答案。

标签: flutter dart asynchronous


【解决方案1】:

定义返回类型为Future&lt;Map&lt;String, dynamic&gt;&gt;

Future<Map<String, dynamic>> decodeToken() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  var token = await prefs.getString('token');
  final Map<String, dynamic> payload = json.decode(
    ascii.decode(
      base64.decode(base64.normalize(token.split(".")[1])),
    ),
  );
  return payload;
}

【讨论】:

    【解决方案2】:

    错误消息是说你只能在标记为async的方法中使用await,所以你从同步方法调用异步方法,而Dart不喜欢这样。

    您有多种选择:

    1. 使用Future...then 模式:
    Map<String, dynamic> payload;
    decodeToken().then((data) {
      payload = data;
    });
    
    1. 制作环绕方法async:
    void foo() async {
      var payload = await decodeToken();
    }
    
    1. 使用FutureBuilder(如果您需要构建方法中的未来数据):
    Widget build(BuildContext context) {
      return FutureBuilder(
        future: decodeToken(),
        builder: (context, snapshot) {
          if (!snapshot.hasData) {
            // Future hasn't completed yet, display something in the meantime
            return CircularProgressIndicator();
          }
          // Future has completed, get data
          var payload = snapshot.data;
          ...
        },
      );
    }
    

    【讨论】:

      猜你喜欢
      • 2016-01-14
      • 2021-10-18
      • 1970-01-01
      相关资源
      最近更新 更多