我如何从我的异步函数返回一个值?

时间:2021-03-03 17:50:16

标签: flutter dart asynchronous

所以我有一个异步函数:

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 表达式只能在异步函数中使用。”

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

如果我这样做:

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

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

2 个答案:

答案 0 :(得分:2)

错误消息说您只能在标记为 #tippy-1 的方法中使用 await,因此您正在从同步方法调用异步方法,而 Dart 不喜欢那样。< /p>

您有多种选择:

  1. 使用 async 模式:
Future...then
  1. 使周围的方法Map<String, dynamic> payload; decodeToken().then((data) { payload = data; });
async
  1. 使用 void foo() async { var payload = await decodeToken(); } (如果您需要在构建方法中使用未来的数据):
FutureBuilder

答案 1 :(得分:0)

定义返回类型为Future<Map<String, dynamic>>

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;
}