调用返回http.Response的方法时,无法访问状态码和响应体如何解决?
问题描述
我用单独Dart文件中的Services类提供API服务:
import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; class Services { static Future<http.Response> login(String username, String password) async { var url = "https://10.0.2.2:5001/api/Login/LoginSystem"; Map data = {"Username": username, "Password": password}; var body = json.encode(data); var response = await http.post(Uri.parse(url), headers: { "content-type": "application/json", "accept": "application/json" }, body: body); print(response.statusCode); print(response.body); return response; } }
调用该服务的login方法时,无法访问response.statusCode和response.body:
onPressed: () { var response = Services.login("fa2020", "123"); if (response.statusCode == 200) { showDialog<String>( context: context, builder: (BuildContext context) => const AlertDialog( title: Text("ALert"), content: Text(response.body), )); } }
修复方案
问题核心是异步方法未正确处理:Services.login返回的是Future<http.Response>,直接赋值得到的是未完成的Future对象,而非实际的响应数据。同时AlertDialog的const修饰符也会导致动态值无法传入,需要同步修正。
修改后的调用代码如下:
onPressed: () async { // 添加async标记异步函数 // 用await等待login方法执行完成,获取真实的Response对象 var response = await Services.login("fa2020", "123"); if (response.statusCode == 200) { showDialog<String>( context: context, // 去掉const,因为response.body是运行时动态值 builder: (BuildContext context) => AlertDialog( title: const Text("Alert"), // 固定文本可保留const content: Text(response.body), ), ); } }
关键要点
- 在
onPressed回调前加async,声明这是异步函数 - 调用
Services.login时加await,等待Future执行完毕,此时才能拿到真实的http.Response对象,正常访问statusCode和body属性 - 移除
AlertDialog的const修饰符,因为response.body是运行时生成的动态内容,无法作为常量参数传入
内容的提问来源于stack exchange,提问作者Alex Wright
相关产品推荐
相关产品推荐

