Flutter类型不匹配错误求解:List转List<Map<String,dynamic>>及Dynamic键Map
问题解决方法
问题根源
从数据源(Firestore或模拟数据)获取的data['rooms']是List<dynamic>类型,而你的Facility类中rooms字段声明为List<Map<String, dynamic>>,Dart无法自动完成这种泛型类型的隐式转换,因此抛出类型不兼容异常。
修正方案
你需要手动将List<dynamic>中的每个元素转换为Map<String, dynamic>,再组装成目标类型的列表。修改facilityModelFactory方法如下:
Facility facilityModelFactory(Map<String, dynamic> data) { return Facility( name: data['name'] as String, rooms: (data['rooms'] as List<dynamic>) .map((roomItem) => roomItem as Map<String, dynamic>) .toList(), ); }
边界情况处理
如果需要应对data['rooms']为空或非列表的场景,可以添加类型检查增强代码鲁棒性:
Facility facilityModelFactory(Map<String, dynamic> data) { final rawRooms = data['rooms']; return Facility( name: data['name'] as String, rooms: rawRooms is List ? rawRooms.map((roomItem) => roomItem as Map<String, dynamic>).toList() : [], // 若数据源无rooms字段,返回空列表适配required构造器 ); }
关于键为dynamic类型的Map声明
如果你的需求是允许Map的键为dynamic类型,那么rooms字段应声明为List<Map<dynamic, dynamic>>,转换逻辑只需将断言改为roomItem as Map<dynamic, dynamic>即可。但通常Firestore文档的键都是String类型,推荐使用Map<String, dynamic>更符合实际业务场景。
内容的提问来源于stack exchange,提问作者HuLu ViCa
相关产品推荐
相关产品推荐

