Flutter Fire文档中fromJson与toJson实现方式不同的原因是什么
问题1:为什么fromJson和toJson实现方式存在差异
两者的定位完全不同:
toJson是Movie类的实例方法,触发调用的前提是已经存在一个Movie实例,它的作用是把当前实例的属性序列化为Firestore可识别的Map<String, Object?>结构,不需要生成新对象,直接返回组装好的Map即可。- 官方示例中的
Movie.fromJson是命名构造函数,作用是把传入的Json Map反序列化为全新的Movie类实例,用的是Dart构造函数的初始化列表语法,直接委托主构造函数生成实例,不需要写return语句。
问题2:你改写的fromJson写法是否合法
完全不合法,也不是官方写法的简化版,存在三个核心问题:
- 返回类型不匹配:你声明的返回值是
Object,而withConverter要求fromFirestore回调返回的是Movie类型,类型校验直接不通过。 - 返回值类型错误:你用括号包裹的
(title: xxx, genre: xxx)是Dart的*记录(Record)*类型,和Movie类没有任何关联,就算你把返回值改成Movie也会报错,这根本不是类实例。 - 定位错误:你写的是普通成员方法,而反序列化用的fromJson需要是类的静态方法/命名构造函数,不需要依赖已有的Movie实例就能调用。
如果你确实想写带return的fromJson,可以用工厂构造的写法,和官方示例的效果完全等价:
factory Movie.fromJson(Map<String, Object?> json) { return Movie( title: json['title']! as String, genre: json['genre']! as String, ); }
官方示例的初始化列表写法只是更简洁的等价实现,不需要显式写return。
内容的提问来源于stack exchange,提问作者samarth
相关产品推荐
相关产品推荐

