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

Flutter接入Firebase时报错:参数类型'Object? Function()'无法赋值给'Map<String, dynamic>'

问题排查与解决方案

错误根因

报错的核心原因是你调用Task.fromMap时传入的documentSnapshot.data是函数引用,不是实际的文档数据:DocumentSnapshot的data是一个返回Object?类型的方法,你没有调用它,且返回结果没有转为fromMap要求的Map<String, dynamic>类型,因此触发类型不匹配报错。

修复代码

1. 修正_MyHomePageState的initState逻辑

注意同时移除无意义的订阅取消调用(initState为页面首次初始化生命周期,此时订阅还未创建,直接调用todoTasks.cancel()会触发LateInitializationError):

@override
void initState() {
  super.initState();
  
  items= [];
  // 删掉原有的todoTasks.cancel(),初始化前无需取消订阅
  todoTasks = fireServ.getTaskList().listen((QuerySnapshot snapshot){
    final List<Task> tasks = snapshot.docs
      .map((documentSnapshot) => Task.fromMap(documentSnapshot.data() as Map<String, dynamic>))
      .toList();

    setState(() {
      items = tasks;
    });
  });
}

2. 可选:优化FirestoreService冗余逻辑

你当前getTaskList方法中offset和limit的默认值为0,不可能为null,判空逻辑可以删除:

Stream<QuerySnapshot> getTaskList({int offset = 0, int limit = 0}) {
  Stream<QuerySnapshot> snapshots = myCollection.snapshots();
  snapshots = snapshots.skip(offset);
  if(limit > 0) snapshots = snapshots.take(limit);
  return snapshots;
}

补充建议

可以给Task.fromMap方法增加字段缺省、类型校验逻辑,避免云端数据格式异常时直接崩溃。

内容的提问来源于stack exchange,提问作者Ghassen Moalla

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:33:02