「 Dart 」快速上手 Dart

288 阅读2分钟

这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战

因为需要学习移动开发,这里速推一下 Dart。

安装

  1. Dart for Windows (gekorm.com) 下载安装包安装 Dart SDK。

  2. 在 VsCode 中安装 Dart 和 Code Runner 插件。

  3. 新建一个 .dart 文件,输出 "Hello dart!" :

void main() {
  print('Hello dart!');
}

Run Code:

Hello dart!

入口方法

入口方法即 main 方法,方法如果没有返回值的情况下可以省略 void。

变量和常量

变量

在Dart中变量的声明有三个关键字:var 、dynamic 和 Object 。

像 JS,Dart 中的变量可以不预先定义变量类型,也可以在变量前加类型来声明变量:

var a = 114514;
String str = 'this is string';

使用这两种方法声明变量之后,后续不能够更改变量类型。

var a = 114514;
a = '12345'; // 报错

使用dynamic 来声明变量可以使得在编译阶段不检查类型,这与 JavaScript 一样:

dynamic str = 'this is string'; 
str = 114514;
print(str);

常量

使用 constfinal 定义。

const PI = 3.14;

const 需要是编译时常量,而final不需要:

const constDateTime = DateTime.now(); // 报错
final finalDateTime = DateTime.now();

数据类型

数值

数值类型 num 包含 intdouble 两个子类。

String

Dart 字符串是 UTF-16 编码的字符序列。

可以在字符串中通过 ${expression} 语法插入表达式。

可以通过 == 比较字符串。

bool

ifassert(下文介绍)表达式里面,它们的值必须是bool类型。默认值是null而非false

List

List类似数组,默认接收的类型是dynamic,可以向其中添加任意对象:

List list = [1, 2, 3];
list.add('hello');
print(list); // [1, 2, 3, hello]

Set

Set 表示容器中的对象唯一,按照添加的先后顺序排序。

  Set set = {'a', 'b', 'a', 'c'};
  print(set); // {a, b, c}

Map

Map 按照添加的先后顺序排序。

Map map = {'foo': 'apple', 'bar': 'banana'};
print(map); // {foo: apple, bar: banana}

函数

像 JS,函数也是对象,类型为Function。因此函数也可以作为变量的值当函数的参数或者返回值。

支持使用=>缩写语法,不同于 ES6 的箭头函数,这里箭头只能指向函数的返回值:

String hello(var name) => 'hello $name';
// 等价于
String hello(var name){
    return 'hello $name';
}

若没有返回值,默认为null

可选参数

  1. 可选命名参数

命名参数要用花括号括起来,命名参数可以有默认值,不指定默认值则为 null

String add({var a, var b = 1}) => '$a' + '$b';
var a = add(b: 2);
print(a); // null2
  1. 可选位置参数

在方括号内可以设置非必填参数,默认值可加可不加,默认值为 null

String add(var a, [var b = 1]) => '$a' + '$b';
var a = add(1);
print(a); // 11

匿名函数

即省略函数名的函数:

var func = (a, b) => a + b;
print(func(1, 2)); // 3

闭包

在 JS 中闭包这个概念很重要,这里不再重复,后期会专门写一篇文章来说明。

操作符

?.

下面的例子中,若 p 为空,则返回 null,若 p 不空,则返回 p.name 。

class Person{
  var name;
}

void main() {
  var p = Person();
  print(p?.name); // null
}

取整除 ~/

相较于/仅仅多了取整的功能。

类型操作 asis is!

num n1 = 1;
int n2 = n1 as int;
if(n2 is int){
	print('n2 is int')
}

判空 ??

若 a 为空,则 b = 1;反之 b = a:

void main() {
     var a;
     var b = a ?? 1;
     print(b);
}

级联 ..

相当于链式调用。