Flutter如何访问异步Future对象返回的实际JSON数据内容
解决方案
你当前获取到的futureData是Future<Data>类型的异步任务实例,而非任务执行完成后的实际结果,且whenComplete回调不会接收异步任务的返回值,因此无法直接拿到数据。你可以通过async/await语法直接等待异步任务执行完成并获取结果,是可读性最高的实现方式,修改后的代码如下:
onPressed: () async { if (_formKey.currentState!.validate()) { // 弹出加载弹窗 showDialog( context: context, builder: (BuildContext context) => AlertDialog(title: animacaoRespostaApi()) ); try { // 等待异步请求完成,直接获取返回的Data实例 Data actualData = await fetchData(myController.text, args.url); // 异步操作结束后先关闭加载弹窗 if (context.mounted) Navigator.of(context).pop(); // 可直接通过Data类的response属性访问Json内容 print(actualData.response); // 按key获取对应字段值 print(actualData.response['id']); // 也可直接遍历response的所有键值对 actualData.response.forEach((key, value) { print('$key : $value'); }); // 页面跳转逻辑,如需传递请求结果可直接将actualData放入arguments中 if (context.mounted) { Navigator.pushNamed( context, args.rota, arguments: ParametrosRetornoConsulta(myController.text, args.url) ); } } catch (error) { // 处理请求异常,如网络错误、接口报错等 if (context.mounted) { Navigator.of(context).pop(); ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('请求失败:${error.toString()}')) ); } } } }
关键说明
await关键字会暂停当前逻辑,等待异步任务执行完成后直接返回最终结果,调用await的函数必须用async关键字标记,因此我们给onPressed的回调函数加上了async修饰。- 新增
context.mounted判断是为了避免异步操作过程中当前页面已经被销毁,操作无效context导致的异常。 - 你的
Data类已经将解析完成的Json存储在response属性中,该属性本身就是Map<String, dynamic>类型,可直接按普通Map进行取值、遍历等操作。
如果你更习惯用Future的链式调用,也可以用then方法获取结果,实现方式如下:
onPressed: () { if (_formKey.currentState!.validate()) { showDialog( context: context, builder: (BuildContext context) => AlertDialog(title: animacaoRespostaApi()) ); fetchData(myController.text, args.url) .then((actualData) { if (context.mounted) Navigator.of(context).pop(); // 同上文操作actualData即可 print(actualData.response['id']); // 跳转逻辑 if (context.mounted) { Navigator.pushNamed(context, args.rota, arguments: ParametrosRetornoConsulta(myController.text, args.url)); } }) .catchError((error) { if (context.mounted) { Navigator.of(context).pop(); ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('请求失败:${error.toString()}'))); } }); } }
内容的提问来源于stack exchange,提问作者Filipe Gonçalves Ribeiro Costa
相关产品推荐
相关产品推荐

