Flutter:如何在async/await与then后正确调用Future函数?
问题分析与解决方案
核心问题
你的代码存在几个关键问题:
- Token未正确传递:
getToken()返回的token(value)没有赋值给getSchools依赖的tk变量,导致网络请求的api_key参数无效,请求失败但无报错提示。 - 异步函数未处理异常:
getSchools是异步函数,调用时未用await或捕获异常,内部出错时不会暴露错误信息,看起来像“未执行”。 await与then混用:这种写法会打乱异步流程逻辑,增加调试难度。
修正后的代码
1. 修复getData函数
getData() async { try { // 先获取token并赋值 String tk = await MainClass().getToken(); // 调用getSchools并等待结果,同时捕获异常 List<SchoolInfo> schools = await getSchools(tk); // 后续处理学校数据,比如更新UI状态 print('获取到${schools.length}所学校'); } catch (e) { print('请求出错: $e'); } }
2. 修正getSchools函数
将token作为参数传入(避免依赖全局变量,代码更规范),同时修复语法错误:
Future<List<SchoolInfo>> getSchools(String tk) async { try { http.Response response = await http.post( Uri.parse('${MainClass().getBaseUrl()}api/getMegaCandidByAgentId'), headers: {'Content-Type': 'application/json'}, // 必须添加JSON请求头 body: jsonEncode(<String, String>{ 'api_key': tk, 'agent_id': id, // 确保id变量已正确定义 }), ); var js = json.decode(response.body); var status = js['success']; if (status == 'Ok') { final data = js['data']; List<SchoolInfo> info_ = []; for (var ls in data) { // 修复SchoolInfo构造的语法错误(补充闭合括号) SchoolInfo info = SchoolInfo(ls['id'], ls['name']); info_.add(info); } return info_; } else if (status == 'Error') { var sms = js['message']; print(sms); return []; // 用空列表替代未定义的error_,避免报错 } else { print('Unknown Error'); return []; } } catch (e) { print('网络请求异常: $e'); return []; } }
关键说明
- 参数传递token:避免用全局变量传递token,通过参数传递更清晰,能避免变量未及时更新的问题。
- 强制捕获异步异常:所有异步操作都要用
try-catch包裹,否则出错时无任何提示,难以定位问题。 - 添加JSON请求头:用
jsonEncode发送请求体时,必须指定Content-Type: application/json,否则后端无法正确解析请求。 - 统一用
await处理异步:await是then的语法糖,混用会让异步流程混乱,统一用await代码更易读。
内容的提问来源于stack exchange,提问作者Serenity Emmanuel
相关产品推荐
相关产品推荐

