Flutter图表开发遇DocumentSnapshot.data参数类型不匹配报错求助
解决Firestore DocumentSnapshot.data的类型不匹配问题
嘿,这问题我前段时间刚踩过坑!原因很直白:Firebase Firestore的Flutter SDK更新后,DocumentSnapshot的data已经从属性改成了方法,你的写法刚好撞在了这个API变更上。
报错原因拆解
你收到的错误:The argument type 'Map<String, dynamic> Function()' can't be assigned to the parameter type 'Map<String, dynamic>',翻译过来就是:你传给Sales.fromMap的是一个函数引用(DocumentSnapshot.data是函数本身),但它需要的是函数执行后返回的Map对象。
另外你还有个小疏漏:你写的是DocumentSnapshot.data(用类名调用),但应该用循环里的具体文档实例documentSnapshot来调用方法。
修改后的代码
把DocumentSnapshot.data改成documentSnapshot.data(),同时结合空安全做处理(如果确定所有销售文档都有数据,可以用!断言):
Widget _buildBody(BuildContext context) { return StreamBuilder<QuerySnapshot>( stream: FirebaseFirestore.instance.collection('sales').snapshots(), builder: (context, snapshot) { if (!snapshot.hasData) { return LinearProgressIndicator(); } else { List<Sales> sales = snapshot.data.docs .map((documentSnapshot) => Sales.fromMap(documentSnapshot.data()!)) .toList(); return _buildChart(context, sales); } }, ); }
额外安全提示
如果你的集合里可能存在空数据的文档,建议用空合并运算符做兜底处理,避免崩溃:
Sales.fromMap(documentSnapshot.data() ?? {})
这类API变更是Firebase适配Flutter空安全时的常见调整,以后遇到类似"函数类型不能赋值给对象类型"的报错,先检查是不是SDK更新导致的属性转方法的变更哦~
内容的提问来源于stack exchange,提问作者Nari
相关产品推荐
相关产品推荐

