在Flutter StreamBuilder中设置initialData出现类型不匹配错误如何解决
错误原因
你为StreamBuilder指定的泛型是DocumentSnapshot<Map<String, dynamic>>,所以initialData参数要求传入的值必须和这个类型匹配,你之前直接传入字符串、数字等基础类型,本身不属于DocumentSnapshot的子类,自然会触发类型不匹配报错,强制类型转换也无法解决该问题。
解决方案
方案1:修改空数据兜底逻辑(最推荐,无需额外改配置)
你现有代码已经做了snapshot.data == null的判断,不需要额外设置initialData,直接把兜底展示的内容改成你要的默认值即可,修改后的完整代码如下:
class PriceUpdaterWidget extends StatefulWidget { const PriceUpdaterWidget({ Key? key, required this.loginService, required this.code, }) : super(key: key); final LoginService loginService; final String? code; _PriceUpdaterWidgetState createState() => _PriceUpdaterWidgetState(); } class _PriceUpdaterWidgetState extends State<PriceUpdaterWidget> { @override Widget build(BuildContext context) { SellerNameService isSellerName = Provider.of<SellerNameService>(context, listen: false); var sellerName = isSellerName.isSellerName; return StreamBuilder<DocumentSnapshot<Map<String, dynamic>>>( stream: FirebaseFirestore.instance .collection('shoppers') .doc(widget.loginService.loggedInUserModel!.uid) .collection("cartItems") .doc(widget.code) .snapshots(), builder: (BuildContext context, AsyncSnapshot<DocumentSnapshot<Map<String, dynamic>>> snapshot) { if (snapshot.hasData && snapshot.data!.exists) { return Text( snapshot.data![sellerName].toStringAsFixed(2), textAlign: TextAlign.center, ); } else { // 这里直接返回你想要的默认展示内容即可,比如默认显示0.00 return Text( '0.00', textAlign: TextAlign.center, ); } }); } }
注:这里额外加了snapshot.data!.exists的判断,避免文档不存在时触发空异常
方案2:调整流映射,直接传入数值类型的initialData
如果你确实需要使用initialData参数,可以把原始的DocumentSnapshot流映射为你需要的价格数值流,修改后initialData就可以直接传入数字类型的默认值:
class _PriceUpdaterWidgetState extends State<PriceUpdaterWidget> { @override Widget build(BuildContext context) { SellerNameService isSellerName = Provider.of<SellerNameService>(context, listen: false); var sellerName = isSellerName.isSellerName; return StreamBuilder<double>( // 把原始流映射为double类型的价格流 stream: FirebaseFirestore.instance .collection('shoppers') .doc(widget.loginService.loggedInUserModel!.uid) .collection("cartItems") .doc(widget.code) .snapshots() .map((docSnap) => docSnap.data()?[sellerName] ?? 0.00), // 现在initialData可以直接传double类型的默认值 initialData: 0.00, builder: (BuildContext context, AsyncSnapshot<double> snapshot) { return Text( snapshot.data!.toStringAsFixed(2), textAlign: TextAlign.center, ); }); } }
内容的提问来源于stack exchange,提问作者SenTinel
相关产品推荐
相关产品推荐

