Dart中如何正确转换Firestore返回的数组为List<UserEmail>指定类型
错误根源
Dart 不支持将整体 List<dynamic> 直接强转为 List<Map<String, dynamic>>,即使列表内所有元素的实际类型都是 Map<String, dynamic>,这种整体转型在运行时也无法通过校验。Firestore 返回的数组字段默认的运行时类型就是 List<dynamic>,所以你原来的写法会触发类型不匹配报错。
修复方案
有两种常用的可行写法:
- 先将数组转为
List<dynamic>,遍历每个元素时单独做类型强转
UserModel.fromJson( emails = json[emailsKey] != null ? (json[emailsKey] as List<dynamic>) .map((email) => UserEmail.fromJson(email as Map<String, dynamic>)) .toList() : <UserEmail>[], )
- 用
cast方法批量转换列表元素的泛型类型(懒加载校验,适合确定数组元素结构完全符合预期的场景)
UserModel.fromJson( emails = json[emailsKey] != null ? (json[emailsKey] as List<dynamic>) .cast<Map<String, dynamic>>() .map((email) => UserEmail.fromJson(email)) .toList() : <UserEmail>[], )
小提示:如果不能完全保证Firestore中数组元素的结构,建议在转换前对每个email元素做类型校验,避免运行时崩溃。
内容的提问来源于stack exchange,提问作者flutter
相关产品推荐
相关产品推荐

