Flutter调用API无法获取int/double值 Future返回实例而非实际值
问题原因
- 所有被
async关键字修饰的Dart方法,返回值永远是Future封装的异步对象,直接调用这类方法不加await等待异步结果完成,拿到的就是未被解析的Future实例,所以打印结果为Instance of Future<int>,拿不到实际的int数值。 - 原代码存在隐藏的类型兼容问题:
jsonDecode解析数字类型时默认返回num类型,如果后端接口返回的是浮点型数值(比如200.0),直接赋值给int类型的stok变量会触发类型转换异常。 - 原代码把
setState写在请求方法内部耦合度太高,如果该方法在非State上下文调用会直接报错。
修复方案
- 调用
getStock这类异步方法时,必须使用await关键字等待异步执行完成,才能拿到实际返回的int值,且调用代码必须运行在async标记的函数内。 - 对接口返回的解析值做显式类型转换,通过
num.toInt()兼容后端返回int/double两种数字类型的场景。 - 把状态更新逻辑和数据请求逻辑解耦,拿到返回值之后再根据需要调用
setState刷新界面。
修正后的方法代码
Future<int> getStock(String refProd) async { int stok = 0; final response = await http.get( Uri.parse("http://127.0.0.1:8000/api/produit/stock/$refProd"), headers: <String, String>{ 'Content-Type': 'application/json; charset=utf-8', 'Accept': 'application/json; charset=utf-8', }, ); if (response.statusCode == 200) { // 显式做类型转换,兼容double/int返回 stok = (jsonDecode(response.body) as num).toInt(); return stok; } else { throw Exception('DB ERROR!'); } }
正确的调用示例
如果是在普通异步方法中调用:
// 异步函数内可以使用await void fetchAndPrintStock() async { // 必须加await等待结果返回 final realStockValue = await getStock('1200'); print(realStockValue); // 拿到值之后再更新UI状态 // setState(() { // stock = realStockValue; // }); }
如果是在initState这类不支持直接加async的生命周期中调用,可以用then链式获取结果:
@override void initState() { super.initState(); getStock('1200').then((realStockValue) { print(realStockValue); setState(() { stock = realStockValue; }); }); }
不要直接用
getStock('xxx').toString()的方式打印,这种写法没有等待异步任务执行,拿到的永远是Future实例对象。
内容的提问来源于stack exchange,提问作者KarimHachicha
相关产品推荐
相关产品推荐

