如何从我的异步函数返回一个值? [复制]
Posted
技术标签:
【中文标题】如何从我的异步函数返回一个值? [复制]【英文标题】: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?
【问题讨论】:
请不要编辑问题的答案。如果您有答案,请发布您自己问题的答案。由于您的问题已作为重复项关闭,如果您认为对未来用户有帮助,请添加对重复项的答案。 【参考方案1】:定义返回类型为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;
【讨论】:
【参考方案2】:错误消息是说你只能在标记为async
的方法中使用await
,所以你从同步方法调用异步方法,而Dart不喜欢这样。
您有多种选择:
-
使用
Future...then
模式:
Map<String, dynamic> payload;
decodeToken().then((data)
payload = data;
);
-
制作环绕方法
async
:
void foo() async
var payload = await decodeToken();
-
使用
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;
...
,
);
【讨论】:
以上是关于如何从我的异步函数返回一个值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 promise 将数组从我的模块返回到我的 API?异步函数和承诺 - Node.js
如果我不关心它的返回值,我应该等待一个“异步任务”函数吗? [复制]