You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 08:54:08