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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 05:25:32