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

Flutter从Firestore获取Map<String, List<bool>>类型转换报错解决

Flutter Firestore 类型转换报错修复方案

问题表现

拉取Firestore数据时运行抛出类型转换错误:

E/flutter (31422): [ERROR:flutter/lib/ui/ui_dart_state.cc(198)] Unhandled Exception: type 'List' is not a subtype of type 'List' in type cast

对应Firestore存储结构参考:
Firestore数据结构截图

原有数据转换方法实现:

Round.fromMap(Map snapshot)
  : round = snapshot['round'],
    isFinished = snapshot['isFinished'] ?? false,
    questions = List<Question>.from(
        snapshot['questions']?.map((x) => Question.fromMap(x))),
    playersAnswers =
        Map<String, List<bool>>.from(snapshot['playersAnswers']);

错误原因

Firestore 序列化返回的所有数组默认类型为List<dynamic>,即便数组内存储的全是布尔值,也不会自动推断为List<bool>。直接对整个Map做强制类型转换时,内层列表的dynamic类型不会被自动转换,最终触发类型不匹配异常。

修复代码

需要手动遍历playersAnswers的每一组键值对,对内层的列表做显式类型转换,调整后的fromMap实现如下:

Round.fromMap(Map snapshot)
  : round = snapshot['round'],
    isFinished = snapshot['isFinished'] ?? false,
    questions = List<Question>.from(
        snapshot['questions']?.map((x) => Question.fromMap(x))),
    playersAnswers = snapshot['playersAnswers'] == null
        ? null
        : Map.from(snapshot['playersAnswers']).map(
            (key, value) => MapEntry(
              key as String,
              (value as List<dynamic>).cast<bool>(),
            ),
          );

注意事项

  • 如果项目里其他自定义类的fromMap方法中存在嵌套列表/Map的类型转换,都需要按同样逻辑手动处理内层类型,不要直接做整体强制类型转换
  • 空安全版本的写法可以根据自身业务调整空值判断逻辑,cast<bool>()和map((e) => e as bool).toList()实现效果一致,二选一即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 09:54:27