如何修复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
相关产品推荐
相关产品推荐

