从Firebase Firestore获取数据时为何需要将返回值转换为Dart对象?
为什么Firestore读取数据时推荐转换为模型类
documentSnapshot.data() 默认返回的是 Map<String, dynamic> 类型,你完全可以不转换直接使用,但转换为专门的模型类主要是为了解决直接操作Map的各类潜在问题,核心原因如下:
- 类型安全保障
Dart是强类型编程语言,dynamic类型的变量在编译阶段不会做类型校验。比如你不小心把字符串类型的email当成数字做运算,直接用Map取值的话编译不会报错,只有运行到对应代码才会触发类型异常,排查成本很高。用模型类会提前给每个字段定义好固定类型,编译阶段就能发现绝大多数类型不匹配的错误。 - 避免硬编码键名错误
直接操作Map取值时,每次都要手动写字段的键名,比如data['username'],如果不小心把键名写错成'userName'或者'usrename',编译阶段不会有任何提示,运行时只会拿到null或者错误值,小项目还好,代码量上去之后这类问题非常难排查。用模型类的话,字段都定义为类的属性,调用时IDE会自动补全,不会出现拼写错误的问题。 - 统一处理数据逻辑
你可以在模型类里封装和用户数据相关的所有逻辑,比如拼接用户全名、判断用户权限、处理字段默认值等等。比如如果Firestore里的username字段为空,你可以在fromMap转换方法里统一赋值为默认的「匿名用户」,不用每次用到这个字段的时候都单独做判空处理。 - 代码可维护性更高
如果后续需要修改用户字段,比如把username改成nickname,你只需要修改模型类里的转换逻辑就可以,不用全局搜索所有手动写的'username'键名一个个改,大大降低迭代成本。
补充说明:其实写入数据的时候也推荐用模型类的toMap方法来生成提交的Map,而非手动构造,一样能避免手动写Map时的键名拼写错误、类型传错的问题,你现在没出问题只是因为当前逻辑简单、字段少,等项目复杂度上去之后模型类的优势会非常明显。
内容的提问来源于stack exchange,提问作者saeed khan
相关产品推荐
相关产品推荐

