Dart基础
语言基础
官方文档 是比较好的学习资料。
关键词
int?
:类型可以表示整数或者 null,明确该表达式不为空,但 Dart 不这么认为时,可以增加!
var
:Dart 是强语言类型,但是可以使用var
来生命变量。dynamic
表示动态类型,实际是Object 类型,可以将类型检查延迟到运行时进行late
:定义一个非空的变量,但是初始化在其后;懒初始化final
和const
都表示常量,final
变量只可以赋值一次,运行时才确定,const
变量在编译时确定,(const 变量同时也是 final 的),static const
表示静态常量
操作符
??
:A ?? 9,即表示 A 如果为空,则返回 9_
:表示private
方法
- 通过
.empty()
可以创建一个空参数的类
一些语言特性
- 编译:可以通过
AOT (ahead of time,提前编译)
和JIT (just in time 即时编译)
两种方式编译。AOT 在执行前全部编译完成,避免运行时的性能消耗。JIT 可以边解释边运行,用性能换时间。Dart 两者都支持,在开发测试的过程中使用 JIT,缩短开发周期。在发布期间使用 AOT,保证代码高效执行。 - 空安全:类似
Kotlin
的空安全,从编译阶段降低空指针异常。详细信息见这里。
Future/Stream 异步
- 通过
async/await
语法糖,轻松实现异步。本质上会转换成 Future 对象,通过then
执行下一步操作。 - Future 的所有 API 返回仍然是 Future 类型的,和 Javascript 的 Promise 比较相似,可以串成流式操作。
Future.delayed(new Duration(seconds: 2),(){
//return "hi world!";
throw AssertionError("Error");
}).then((data){
//执行成功会走到这里
print("success");
}).catchError((e){
//执行失败会走到这里
print(e);
}).whenComplete((){
//无论成功或失败都会走到这里
});
Stream
可以接收多条异步结果,Future
只有一个 ^2ae8ed
Mixin 关键词
由于 Dart 没有多继承,为了实现多继承的方法,用 Mixin
声明,在使用时用 with
。而 Mixins 定义的类不能有构造方法
class Person {
eat() => print('Person eat');
}
mixin Walk {
walk() => print("Walk walk");
}
mixin Talk on Person {
talk() => print('Talk talk');
}
// cat 混合Talk会报错,因为Talk只能在Person上实现
class Cat with Walk {}
// 在多混合的情况下,如果有复写的方法,有限顺序 Talk> Walk > Person > Boy
class Boy extends Person with Walk, Talk {}
mixins extends implements 之间的关系
可以同时存在,但需要有顺序 extends -> mixins -> implements
- extends:继承。和Java继承一样
- 单继承
- 不能继承构造函数
- 重写方法使用 @override 父类调用 super
- 无公有,私有变量和方法区别,但一般约定俗成, _ 开头为私有
- mixins:混合,with 关键词。维基百科这样描述 「 在面向对象的语言中,mixins类是一个可以把自己的方法提供给其他类使用,但却不需要成为其他类的父类。」
- 混合的对象是类,且可以多混合
- 有混合的先后顺序
- implements:接口实现。Flutter没有 interface ,类就是隐式的接口,接口里包含类里的方法和变量
- class 就是 interface
- 需要在子类中实现接口的方法和变量,关键词 @override
- 可实现多个接口
命名参数
// 可选参数,print(sum2(1, 1, c: 1, d: 1)) 输出4
int sum1(a, b, {c, d}) => a + b + c + d;
// 可选参数带默认值,print(sum2(1, 1, d: 1)) 输出6
int sum2(a, b, {c = 3, d}) => a + b + c + d;
// 可选参数必填时用required修饰符修饰 print(sum3(1, 1, d: 1, e: 1)) 输出7
int sum3(a, b, {c = 3, d, required e}) => a + b + c + d + e;
闭包
/// Returns a function that adds [addBy] to the
/// function's argument.
Function makeAdder(int addBy) {
return (int i) => addBy + i;
}
void main() {
// Create a function that adds 2.
// 相当于 function add2(i) => i +2;
var add2 = makeAdder(2);
// Create a function that adds 4.
var add4 = makeAdder(4);
assert(add2(3) == 5);
assert(add4(3) == 7);
}