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

Flutter Web中FutureBuilder/StreamBuilder报RangeError但App正常怎么解决

问题原因
  • 核心错误触发点为'$sum'.substring(0, 3)代码:Flutter Web编译为JavaScript后,不存在独立的int和double类型区分,当计算出的sum为整数值(如5.0、3.0)时,toString()输出结果为"5"、"3"这类长度小于3的字符串,调用截取前3位的逻辑会直接触发范围错误。
  • 附加隐患:getReview方法声明返回类型为Future<void>,但实际返回QuerySnapshot对象,类型不匹配可能在严格校验环境下引发额外报错。
修复方案

首先修正getReview方法的返回类型声明:

Future<QuerySnapshot> getReview(String productId) async {
     final QuerySnapshot snapProducts = await FirebaseFirestore.instance
      .collection('products')
      .doc(productId)
      .collection('reviews')
      .get();
       return snapProducts;
     }

推荐使用toStringAsFixed方法固定小数位数,从根源避免字符串长度不足的问题,无需手动截取:

FutureBuilder(
  future: getReview(widget.products.id),
  builder: (context, snapshot) {
   if (snapshot.hasData) {
    final documents = snapshot.data.docs;
     final sum = documents.isEmpty
      ? 0.0
   : documents
      .map((m) => m['rating'])
        .reduce((a, b) => a + b) /
         documents.length;
        return Text(
           // 固定保留1位小数,输出格式统一为X.X,不会出现长度不足问题
           sum.toStringAsFixed(1),
           style: TextStyle(
           color: themeChange.isDarkTheme
                  ? Colors.white : Colors.black,
           ),
         );                
     }
      return const Center(child: Text('...'));
      },
    ), 

如果确实需要保留substring逻辑,可以增加长度判断做兼容:

final sumStr = '$sum';
return Text(
  sumStr.length >=3 ? sumStr.substring(0,3) : sumStr,
  style: TextStyle(
    color: themeChange.isDarkTheme ? Colors.white : Colors.black,
  ),
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:12:00