Dart

优点

空安全

强类型

支持 AOT 预编译

缺点

缺少对象字面量

无法直接使用字面量创建对象,必须创建对应的实体类,然后通过类创建对应的对象。

最接近对象的是 Map,可勉强用其代替,只不过使用时只能用中括号引用属性值,不能像对象那样用点号,不太方便。

枚举无法指定初始值

定义枚举,无法赋初值。这样实用性大大降低了,基本也就纯前端用用了。

后端返回某几个具体值的时候,前端对接的时候为了增强代码可读性,以及后续的维护,通常是定义一个枚举赋值的,这点 Dart 中无法直接做到。

要实现类似的效果,可参考:https://www.technicalfeeder.com/2021/08/dart-how-to-assign-values-to-enum/open in new window

接口请求返回的 JSON 数据要转成对象很麻烦

Dart 中只能先将 JSON 转为 Map,而后要自己创建对应的实体类,在其中定义 fromJson 方法,然后将 Map 转为对象。中间多了一层中转还要建模,很麻烦。

JIT & AOT

Dart 有两种运行模式:JIT 和 AOT。

  • JIT(Just In Time):即时编译,运行时编译,开发环境下使用。
  • AOT(Ahead Of Time):预编译,运行前编译,生产环境下使用。

运算符

  • 级联运算符
  • 三目运算符
  • 可选链运算符
  • 空值合并运算符
  • 等等

数据类型

  • String
  • Number:int、double、num
  • Boolean:bool
  • Symbol
  • List
  • Set
  • Map
  • 等等

TIP

Dart 中所有东西都是对象。它们都继承自 Object,默认是都是 null。

类型转换

// int to double
int a = 100
a.toDouble()

// double to int
double a = 100.0
a.toInt()
// num to String
int a = 100
double b = 100.0
a.toString()
b.toString()

// String to num
String str1 = '100'
String str2 = '100.0'
int.parse(str1)
double.parse(str2)
// JSON to Map

// Map to Object

待完善

函数参数

可选参数

void fun(int a, [String? b]) {
  ...
}

fun(1) // OK
fun(1, '11') // OK
void fun(int a, [String b = '11']) {
  ...
}

fun(1) // OK
fun(1, '11') // OK

命名参数

void fun(int a, {String? b}) {
  ...
}

fun(1) // OK
fun(1, b: '11') // OK
void fun(int a, {String b = '11'}) {
  ...
}

fun(1) // OK
fun(1, b: '11') // OK
void fun(int a, {required String b}) {
  ...
}

fun(1) // Error
fun(1, b: '11') // OK

构造函数

普通构造函数

class People{
  int? age;
  String? name;

  People(int age, String name) {
    this.age = age;
    this.name = name;
  }
}

class People{ int? age; String? name;

// 简写形式 People(this.age, this.name); }

命名构造函数

class People{
  int? age;
  String? name;
 
  People.fromMap(Map map) {
    this.age = map["age"];
    this.name = map["name"];
  }
}

常量构造函数

工厂构造函数

const & final

const 和 final 定义的都是常量,一经赋值,无法更改,只能初始化一次。且在声明时就必须初始化。

二者主要区别如下:

  • final 并不要求赋值一定是编译时常量,而 const 则要求必须是编译时常量。
  • final 修饰的对象引用本身不可更改,但其中的属性值可以更改,而 const 则属性值都不可更改。
final time = new DateTime.now(); // OK
const time = new DateTime.now(); // Error,new DateTime.now() 不是 const 常量

TIP

  • 编译时常量:编译时已经确定常量的值。
  • 运行时常量:运行时才能确定常量的值。
Last Updated:
Contributors: Vsnoy