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

Flutter调用API无法获取int/double值 Future返回实例而非实际值

问题原因
  1. 所有被async关键字修饰的Dart方法,返回值永远是Future封装的异步对象,直接调用这类方法不加await等待异步结果完成,拿到的就是未被解析的Future实例,所以打印结果为Instance of Future<int>,拿不到实际的int数值。
  2. 原代码存在隐藏的类型兼容问题:jsonDecode解析数字类型时默认返回num类型,如果后端接口返回的是浮点型数值(比如200.0),直接赋值给int类型的stok变量会触发类型转换异常。
  3. 原代码把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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 03:48:22