Dart基础

Dart基础
Photo by Tony Pepe / Unsplash

语言基础

官方文档 是比较好的学习资料。

关键词

  • int?:类型可以表示整数或者 null,明确该表达式不为空,但 Dart 不这么认为时,可以增加 !
  • var:Dart 是强语言类型,但是可以使用 var 来生命变量。dynamic 表示动态类型,实际是Object 类型,可以将类型检查延迟到运行时进行
  • late:定义一个非空的变量,但是初始化在其后;懒初始化
  • finalconst 都表示常量,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

  1. extends:继承。和Java继承一样
  • 单继承
  • 不能继承构造函数
  • 重写方法使用 @override 父类调用 super
  • 无公有,私有变量和方法区别,但一般约定俗成, _ 开头为私有
  1. mixins:混合,with 关键词。维基百科这样描述 「 在面向对象的语言中,mixins类是一个可以把自己的方法提供给其他类使用,但却不需要成为其他类的父类。」
  • 混合的对象是类,且可以多混合
  • 有混合的先后顺序
  1. 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);
}