一、Dart语言的前世今生
Dart语言就是为了解决JS存在的缺陷,可Node.js出现让JS可以在移动端跑起来,React,RN,vue等,Dart语言沉寂了一段时间,专注于大前端和跨平台生态语言。
出生名门待遇自然不会差:在 Google 内部孵化了移动开发框架 Flutter,弯道超车进入了移动开发的领域;而在 Google 未来的操作系统 Fuchsia 中,Dart 更是被指定为官方的开发语言。
二、Dart语言的特性
JIT(Just in Time)运行时即时编译,在开发周期使用,可以动态下发执行代码,效率高;AOT(Ahead of Time)提前编译,可以生成二进制代码,运行速度快,但是每次执行前都需要提前编译,效率低。
如何区分一门语言究竟是 AOT 还是 JIT 呢?通常来说,看代码在执行前是否需要编译即可。如果需要编译,通常属于 AOT;如果不需要,则属于 JIT。
内存分配和垃圾回收
Dart VM的内存分配就是在堆上累叠,内存增长是线性的。在Dart中并发是通过Isolate实现,它可以看作线程,但是不共享内存,独立运行,这样做的的作用就是让Dart实现无锁的快速分配。
垃圾回收,采用多生代算法。采用“半空间”机制,将那些活跃的对象拷贝到备用空间,然后整体释放当前空间所有内存,这样很适合flutter中大量widget销毁重建场景。
单线程模式:类似于OC C++ JAVA大多数以抢占式的方式切换线程,会利用到锁,说到锁这涉及到与内核的上下文切换,很耗性能。
一个函数从执行到结束没有其他Dart代码打断,所以在Dart中没有线程之后Isolate(隔断区),隔断区之间不会共享内存。
三、基础语法与类型变量:Dart语言如何表示信息?
var 来声明一个变量,表示类型是交由编译器推断决定,默认情况下未初始化的变量的值都是null。
const 表示变量在编译期间即能确定的值;final用来定义运行时确定的值,而一旦确定后就不可再变。被final或者const 修饰的变量,变量类型可以省略。
Object和dynamic,Object是所有对象的根基类,任何类型的数据都可以复制给Object声明的对象,类似OC的id,dynamic和var声明的变量可以赋值任意对象,而dynamic,什么的变量可以在后期改变赋值类型。dynamic声明的对象编译器会提供所有可能的组合,而Object声明的对象只能使用Object的属性和方法,否则编译器会报错。
dynamic a;
Object b;
main() {
a = "";
b = "";
printLengths();
}
printLengths() {
// no warning
print(a.length);
// warning:
// The getter 'length' is not defined for the class 'Object'
print(b.length);
}
四、函数
函数是一段用来独立完成某个功能的代码,在Dart中所有类型都是对象类型,函数也是对象,Function,这就意味着函数可以 被定义为变量,甚至可以被定义为参数传递给另一个函数。不能用重载,但是提供了可选命名参数和可选参数。在声明函数时加{}表示指定调用参数,给参数加[]表示这些参数可以忽略
“_”可作为private方法,不加则为public。“_”限制范围并不是类访问级别,而是库访问级别。
五、复用
继承父类:子类由父类派生,会自动获取父类成员变量和方法实现,子类可以根据需求覆写构造函数和父类方法;
接口实现:子类获取的仅仅是接口的成员变量符号和方法符号,需要重新实现成员变量以及方法声明和初始化,负责编译器会报错。(类似于OC中协议)
混入(MiXin):具有实现方法的接口,这样可以解决Dart缺少对多重继承支持问题,还能避免由于多重继承可能导致的歧义。关键字with
1.一般来讲,单继承,多实现,混入是多继承
A.继承是子类需要复用父类的方法实现
B.实现接口是复用接口的参数,返回值,和方法名,但不复用方法的实现,在Dart中实现抽象类 更像在java中实现用interface修饰的接口
C.混入是多继承,当被混入的类有多个同名方法时,调用子类的该方法时,会调用with声明的最后一个拥有该方法的类中的该方法,同时混入中的父类不能继承
六、运算符
?.运算符: p?.printInfo()代表如果某个p为空那就跳过,避免产生异常
??= 运算符:a??=value如果 a 为 null,则给 a 赋值 value,否则跳过。
?? 运算符:a??b 如果 a 不为 null,返回 a 的值,否则返回 b。
七、异步支持
关键字Future 将来执行的方法
static Future login(String phone, String code) async {
var response = await http.get('api_url', queryParameters: {
'phone': phone,
'code': code,
});
User user = User.fromJsonMap(response.data);
user.phone = phone;
return user;
}
async:用来表示函数是异步的
await:来表示等待异步执行完成才会走下一步
async/await都只是一个语法糖,编译器或者解释器最终都会将其转化为一个Promise(Future)的调用链