Flutter DataTable数据绑定报错:期望Map类型却得到函数类型
错误修复方案:Expected a value of type 'Map<String, dynamic>', but got one of type '() => Map<String, dynamic>'
核心问题
这个错误是因为你在将Firestore文档数据转换为Kasalar_object实体时,传递了方法引用(data)而不是方法调用后的Map结果(data()),或者实体类的转换逻辑存在参数类型不匹配。
分步修复
1. 修正Kasalar_object实体类的转换方法
确保实体类的fromSnapshot或fromMap方法正确获取并处理Firestore的Map数据:
class Kasalar_object { final String id; final String kasaAdi; // 示例字段,替换为你的实际字段 // 其他业务字段 Kasalar_object({required this.id, required this.kasaAdi}); // 从Firestore文档快照生成实体 factory Kasalar_object.fromSnapshot(DocumentSnapshot doc) { // 必须调用data()获取Map,不能直接传doc.data(这是方法本身) final Map<String, dynamic> data = doc.data() as Map<String, dynamic>; return Kasalar_object( id: doc.id, kasaAdi: data['kasaAdi'] ?? '', // 处理可能的null值 // 其他字段赋值 ); } }
2. 修正StreamBuilder中的数据转换逻辑
在StreamBuilder里将QuerySnapshot正确转换为实体列表,确保每个文档都调用fromSnapshot:
StreamBuilder<QuerySnapshot>( stream: FirebaseFirestore.instance.collection('kasalar').snapshots(), builder: (context, snapshot) { if (snapshot.hasError) return const Text('加载失败'); if (!snapshot.hasData) return const CircularProgressIndicator(); // 转换为实体列表 final kasalarList = snapshot.data!.docs .map((doc) => Kasalar_object.fromSnapshot(doc)) .toList(); return PaginatedDataTable( source: MyKasaData(kasalarList), columns: const [ DataColumn(label: Text('ID')), DataColumn(label: Text('Kasa Adı')), // 其他列配置 ], // 分页相关配置 ); }, )
3. 确保MyKasaData数据源正确接收实体列表
检查MyKasaData类是否正确使用实体类的字段:
class MyKasaData extends DataTableSource { final List<Kasalar_object> kasalarList; MyKasaData(this.kasalarList); @override DataRow? getRow(int index) { if (index >= kasalarList.length) return null; final kasa = kasalarList[index]; return DataRow.byIndex( index: index, cells: [ DataCell(Text(kasa.id)), DataCell(Text(kasa.kasaAdi)), // 其他单元格配置 ], ); } // 实现DataTableSource的必填方法 @override int get rowCount => kasalarList.length; @override bool get isRowCountApproximate => false; @override int get selectedRowCount => 0; }
排查要点
如果修改data为data()后仍报错,检查以下场景:
- 是否在某个转换逻辑中漏改,比如在
map方法的lambda表达式里是否误传了doc.data而不是doc.data() - 实体类的构造函数或转换方法是否错误地接收了
Function类型参数,而非Map<String, dynamic> - 是否存在嵌套的文档引用,子文档的数据转换也需要调用
data()
内容的提问来源于stack exchange,提问作者Berkay Isıkoglu
相关产品推荐
相关产品推荐

