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
相关产品推荐
相关产品推荐

