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

如何修复Dart中“List<dynamic>不是Map<dynamic, dynamic>子类型”错误?

Firebase Realtime Database Dart应用类型转换错误排查

运行集成Firebase实时数据库的Dart应用时,遭遇错误:type 'List<dynamic>' is not a subtype of type 'Map<dynamic, dynamic>',无法正常加载数据库中的问题数据。

引发问题的代码

import 'package:http/http.dart' as http;
import './question_model.dart';
import 'dart:convert';

class DBconnect {
  final url = Uri.parse(
      'https://quizzapp-f2354-default-rtdb.firebaseio.com/questions.json');
  Future<List<Question>> fetchQuestions() async {
    return http.get(url).then((response) {
      var data = json.decode(response.body) as Map<String, dynamic>;
      List<Question> newQuestions = [];
      data.forEach((key, value) {
        var newQuestion = Question(
          id: key,
          title: value['title'],
          options: Map.castFrom(value['options']),
        );
        newQuestions.add(newQuestion);
      });
      return newQuestions;
    });
  }
}

Firebase Realtime Database存储的JSON数据

{
    "questions": {
        "first": {
            "title": "Who is the best player in the world?",
            "options": {
                "messi": "true",
                "ronaldo": "false",
                "haaland": "false",
                "mbappe": "false"
            }
        },
        "second": {
            "title": "2 + 2 = ?",
            "options": {
                "1": "false",
                "2": "false",
                "3": "false",
                "4": "true"
            }
        }
    }
}

错误原因

请求URL返回的JSON结构是一个包含questions键的顶层对象,而非直接的问题集合。代码错误地将整个响应体解析为问题集合Map并直接遍历,导致遍历到的value并非单个问题数据,而是整个问题列表,后续访问value['options']时自然触发类型不匹配错误。

修复方案

修改代码,先从解析后的顶层Map中取出questions字段对应的问题集合,再遍历该集合创建Question实例:

import 'package:http/http.dart' as http;
import './question_model.dart';
import 'dart:convert';

class DBconnect {
  final url = Uri.parse(
      'https://quizzapp-f2354-default-rtdb.firebaseio.com/questions.json');
  Future<List<Question>> fetchQuestions() async {
    return http.get(url).then((response) {
      // 解析整个响应体
      var responseData = json.decode(response.body) as Map<String, dynamic>;
      // 取出实际存储问题的集合
      var questionsData = responseData['questions'] as Map<String, dynamic>;
      List<Question> newQuestions = [];
      questionsData.forEach((key, value) {
        var newQuestion = Question(
          id: key,
          title: value['title'],
          options: Map.castFrom(value['options']),
        );
        newQuestions.add(newQuestion);
      });
      return newQuestions;
    });
  }
}

额外检查:确认Question类中options字段的类型为Map,确保与Firebase中存储的结构一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 06:35:31