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

