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

Flutter:如何在async/await与then后正确调用Future函数?

问题分析与解决方案

核心问题

你的代码存在几个关键问题:

  1. Token未正确传递:getToken()返回的token(value)没有赋值给getSchools依赖的tk变量,导致网络请求的api_key参数无效,请求失败但无报错提示。
  2. 异步函数未处理异常:getSchools是异步函数,调用时未用await或捕获异常,内部出错时不会暴露错误信息,看起来像“未执行”。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 23:33:22