本文介绍了 Dart 的环境搭建以及 Dart 语法,包括变量与常量、数据类型、函数、操作符、类、泛型等等。
安装
-
在 Dart for Windows (gekorm.com) 下载安装包安装 Dart SDK。
-
在 VSCode 中安装 Dart 和 Code Runner 插件。
-
新建一个
.dart
文件,输出 “Hello dart!” :
void main() {
print('Hello dart!');
}
Run Code:
Hello dart!
变量和常量
变量
在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];
常用的属性和方法:
常用属性:
length 长度
reversed 翻转,结合 toList()
isEmpty 是否为空
isNotEmpty 是否不为空
常用方法:
add(value) 增加
addAll(list) 拼接数组
indexOf(value) 查找,传入 value 返回 index,找不到返回 -1
remove(value) 删除,传入 value
removeAt(index) 删除,传入索引值
fillRange(startIndex,endIndex,value) 修改,[参数1, 参数2)的数据修改为参数3
insert(index,value); 指定位置插入
insertAll(index,list) 指定位置插入List
toList() 其他类型转换成List
join(分隔符) List 转换成 String
split(分隔符) String 转化成 List
forEach
map
where
any
every
这些方法在 Set 和 Map 中大多也可以使用
Set
Set
表示容器中的对象唯一,按照添加的先后顺序排序。Set 是没有顺序且去重后的集合,所以没有索引值。
Set set = {'a', 'b', 'a', 'c'};
print(set); // {a, b, c}
print(set.toList()); // [a, b, c]
Map
Map
按照添加的先后顺序排序。
Map map = {'foo': 'apple', 'bar': 'banana'};
print(map); // {foo: apple, bar: banana}
print(map.keys.toList()); // [foo, bar]
print(map.values.toList()); // [apple, banana]
map.addAll({'baz':'pear'});
map.remove("baz");
print(map.containsValue("apple")); // true
循环数据的方法
forEach
、map
、where
、any
、every
List:
for、for ... in:略
forEach:
List list=["apple", "banana", "pear"];
list.forEach((value){
print(value); // apple banana pear
})
map:
List list=["apple", "banana", "pear"];
List newList = list.map((value){
return value + "1";
}).toList();
print(newList); // [apple1, banana1, pear1]
where:
List list = [1, 2, 3, 4, 5];
List newList = list.where((value){
return value > 3;
}).toList();
print(newList); // [4, 5]
any:只要 value 中有满足条件的就返回 true
bool b = list.any((value){
return value > 3;
});
print(b); // true
every:每一个 value 都要满足条件才返回 true
Set:同 List
Map:
forEach:
Map person = {
"name": "Jack",
"age": 20,
};
person.forEach((key, value){
print("$key - $value"); // name - Jack age - 20
});
函数
像JS,函数也是对象,类型为Function
。因此函数也可以作为变量的值当函数的参数或者返回值。
支持使用=>
缩写语法,不同于 ES6 的箭头函数,这里箭头只能指向函数的返回值:
String hello(var name) => 'hello $name';
// 等价于
String hello(var name){
return 'hello $name';
}
若没有返回值,默认为null
。
入口函数
入口函数即 main
函数,如果没有返回值可以省略 void。
可选参数
- 可选命名参数
命名参数要用花括号括起来,命名参数可以有默认值,不指定默认值则为 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 中闭包这个概念很重要,这里不再重复,后期会专门写一篇文章来说明。