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

Flutter中如何从Future函数返回列表并跨类调用获取结果

问题分析与解决方案

你的核心问题在于**search函数的异步逻辑处理不当**:你在函数里用了.then()处理HTTP请求,但return data会在请求完成前就同步执行,导致返回的data还是空列表,这就是为什么在class2里拿不到正确数据的原因。


修复步骤

1. 修正search函数的异步逻辑

把.then()的回调写法改成和class2一致的async/await风格,确保return data在数据填充完成后再执行:

// class1.dart
Future<List<String>> search(String stock) async {
  print("Starting get request");
  final data = <String>[]; // 改成局部变量,避免全局状态带来的意外问题
  try {
    // 用Uri.parse处理URL,比字符串拼接更安全
    final res = await http.get(Uri.parse(
        "https://www.alphavantage.co/query?function=SYMBOL_SEARCH&keywords=$stock&apikey=demo"));
    print("received response.");
    final search = searchFromJson(res.body);
    // 用for-in循环简化代码,更易读
    for (final match in search.bestMatches) {
      data.add(match.the1Symbol);
      data.add(match.the2Name);
    }
  } catch (e) {
    print("Failed to get response. " + e.toString());
    // 可选:抛出错误让调用方处理,比如提示用户请求失败
    // throw Exception("Failed to fetch stock data: $e");
  }
  return data;
}

关键改进点:

  • 用await替代.then(),让异步代码线性执行,逻辑更清晰
  • 把data声明为局部变量,避免全局列表被多次调用时意外清空或污染
  • 明确指定返回类型Future<List<String>>,让类型检查更严格,减少潜在bug
  • 使用Uri.parse()处理URL,规避字符串拼接可能带来的格式问题

2. 在class2中添加安全判断

你原有的_infoModal函数逻辑没问题,但建议加上空值判断,避免data为空时访问data[0]引发崩溃:

// class2.dart
void _infoModal(context, val) async {
  List<String> data = await _vantage.search(val);
  showModalBottomSheet(context: context, builder: (BuildContext bc) {
    return Container(
      child: data.isNotEmpty ? Text(data[0]) : const Text("No matching data found"),
    );
  });
}

为什么原来的代码不生效?

原来的search函数里,http.get().then(...)是异步任务,会在后台执行;而return data是同步执行的——也就是说,HTTP请求还没拿到响应、还没往data里加内容,函数就已经返回了空列表。改用await后,函数会等待请求完成、数据填充完毕,再返回正确的结果。

内容的提问来源于stack exchange,提问作者Alvin Heng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 11:37:55