这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战
因为需要学习移动开发,这里速推一下 Dart。
安装
-
在 Dart for Windows (gekorm.com) 下载安装包安装 Dart SDK。
-
在 VsCode 中安装 Dart 和 Code Runner 插件。
-
新建一个
.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);
常量
使用 const 和 final 定义。
const PI = 3.14;
const 需要是编译时常量,而final不需要:
const constDateTime = DateTime.now(); // 报错
final finalDateTime = DateTime.now();
数据类型
数值
数值类型 num 包含 int 和 double 两个子类。
String
Dart 字符串是 UTF-16 编码的字符序列。
可以在字符串中通过 ${expression} 语法插入表达式。
可以通过 == 比较字符串。
bool
if和assert(下文介绍)表达式里面,它们的值必须是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。
可选参数
- 可选命名参数
命名参数要用花括号括起来,命名参数可以有默认值,不指定默认值则为 null:
String add({var a, var b = 1}) => '$a' + '$b';
var a = add(b: 2);
print(a); // null2
- 可选位置参数
在方括号内可以设置非必填参数,默认值可加可不加,默认值为 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
}
取整除 ~/
相较于/仅仅多了取整的功能。
类型操作 as, is, 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);
}
级联 ..
相当于链式调用。