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
相关产品推荐
相关产品推荐

