factory帮我们做了什么?

来源:10-7 Json转换成对象

demonCry

2022-09-08

class VideoModel {
  String title = '';
  String url = '';
  int playCount = 0;

  VideoModel(this.title, this.url, this.playCount);

  factory VideoModel.fromJSon(Map<String,dynamic> json) => VideoModel(json['title'], json['url'], json['playCount']);
}

factory这个关键字具体帮我们做了什么呢? 感觉直接写个叫做fromJSON的静态方法也是一样的效果?

写回答

1回答

马超老师

2022-09-09

这个地方把Factory换成Static method确实是完全一样的。

其实大多数场景下这两者是一样的,这里总结了5种常见情况,是factory可以实现而static method实现不了的:

1、和Java一样,Dart中一个类如果没有写构造器,则会自动创建一个无参默认构造器。但是如果有一个factory构造器,那么编译期就不会创建默认构造器了,但是static method不会有这个效果;

2、factory构造器可以省略函数名。如果类中没有定义匿名构造器,则可以直接用类名来定义factory;

3、可以忽略泛型参数。假如class都声明中有泛型参数,那在static method中返回值也要填上完整的类名+泛型参数,但是如果是factory就可以直接用类名,这个在泛型参数很长的时候比较适用;

4、factory可以声明成const;

5、构造器重定向可以省略参数。当Dart类中有多个构造器都时候,经常会做构造器都重定向(构造器A调用构造器B),这时候如果用static method,就需要把所有的参数都传给目标构造器。而factory中重定向构造器只需要写函数名,编译期会自动帮我们传递参数,这个算是一个语法糖。


整体来讲,绝大多数场景下可以static method和factory可以互换,factory更像是一种语法糖,在一些特定场景下可以帮助我们省略一些代码。


2
0

基于Flutter 3.x 实战跨平台仿抖音App混合开发

以短视频APP为例,快速上手原生/Flutter 混合开发

481 学习 · 120 问题

查看课程