Dart 基础
安装
https://docs.flutter.dev/community/china#download-flutter-archives-based-on-a-mirror-site
下载地址 https://dart.dev/get-dart/archive
环境变量配置
1 2
| export DART_HOME=~/.local/share/Dart/dart-sdk-3.5.4 export PATH=$PATH:$DART_HOME/bin
|
重启终端, 检查 dart 版本
输出如下
1
| Dart SDK version: 3.5.4 (stable) (Wed Oct 16 16:18:51 2024 +0000) on "linux_x64"
|
Hello World
1 2 3
| void main(List<String> args) { print("hello world"); }
|
注释
单行注释
多行注释
变量
使用 var 关键字定义变量, 会自动推断变量的数据类型
1
| var userName = "Zhang San";
|
也可以手动指定变量类型
var 和 数据类型 不能同时使用
使用 var 关键字, 不需要指定数据类型
使用数据类型定义变量, 不需要 var 关键字
命名规则
必须遵守规则
- 变量名由数字、字母、下划线、美元符号**$** 组成, 不能以数字开头
- 标识符不能是保留字和关键字
- 变量名严格区分大小写, 比如 age 和 Age 是两个不同的变量
开发规范
变量名要有意义,变量名使用名词,方法名使用动词
正面的例子
1
| String userName = "ZhangSan";
|
反面例子
1 2
| String aa = "ZhangSan"; String ab = "man";
|
常量
const 定义常量,定义时必须赋值
1 2
| const PI1 = 3.14; const double PI2 = 3.14;
|
final 定义常量, 定义时可以不赋值,只能赋值一次
1 2 3 4 5 6 7
| final PI3; PI3 = 3.14;
final double PI4; PI4 = 3.14;
final double PI5 = 3.14;
|
final 是惰性初始化的,只有在第一次使用前才初始化
数据类型
字符串
字符串类型, 使用 单引号 或者 双引号 包括的字符
多行字符串可以使用 三个 单引号 或者 三个双引号
1 2 3 4 5 6 7
| String userName = "ZhangSan"; String userSex = 'man'; String userInfo = """ 我的名字是 ZhangSan, 我今年 20 岁, 我在 XXXX 学校读书。 """
|
数值类型
整数 int
小数
1
| double mathScore = 85.5;
|
布尔类型
1 2
| bool isOK = true; bool isHot = false;
|
List 列表
1 2 3 4 5 6 7 8 9 10
| var list1 = ["张三", 18, false];
var list2 = <String>["ZhangSan", "LiSi"];
var list3 = []; list3.add("value");
var list4 = List.filled(5, 0);
var list5 = List<String>.filled(5, "");
|
Map 字典
1 2 3 4
| var map1 = new Map(); map1["name"] = "张三"; map1["age"] = 18; map1["sex"] = "男";
|
1 2 3 4 5
| var map2 = { "name": "张三", "age": 18, "sex": "男", };
|
1
| var userName = map2["name"];
|
数据类型转换
parse
1 2
| var age = "18"; int userAge = int.parse(age);
|
运算符
算术运算符
关系元算符
逻辑运算符
赋值运算符
1 2 3 4 5 6 7 8 9
| = ??=
+= -= *= /= %= ~/=
|
分支
1 2 3 4 5 6 7 8
| var a = "3.14"; var b = 3.14;
if (a == b){ print("相等"); }else{ print("不相等"); }
|
1 2 3 4 5 6 7
| if(){
}else if(){
}else{
}
|
switch - case
1 2 3 4 5 6 7 8 9 10 11 12 13
| var flag = 1;
switch (flag) { case 1: print("男"); break; case 2: print("女"); break; default: print("保密"); break; }
|
for
1 2 3
| for(var i=0; i<10; i++){ print(i); }
|
while
1 2 3 4 5
| var i = 1; while(i< 10){ print(i); i++; }
|
do while
1 2 3 4 5
| var i = 1; do{ print(i); i++; }while(i<10);
|
continue
continue 可在 while for do while 循环中使用
break
break 可以在 switch while for 循环中使用
1 2 3 4 5
| var list1 = ["桃子", "苹果", "橘子"];
for (var fruit in list1) { print(fruit); }
|
1 2 3 4
| var list1 = ["桃子", "苹果", "橘子"]; list1.forEach((v){ print(v); });
|
1 2 3 4 5 6 7 8
| var map2 = { "name": "张三", "age": 18, "sex": "男", }; map2.forEach((k, v){ print("$k, $v"); });
|
自定义方法
自定义方法基本格式
1 2 3 4
| 返回值类型 方法名 (参数1, 参数2, 参数3...){ 方法体 return 返回值; }
|
箭头函数
匿名函数
面向对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Person{ String userName = "张三"; int userAge = 18;
void getInfo(){ print("我的名字是 ${this.userName}, 我今年 ${this.userAge} 岁"); } }
void main(List<String> args) { var p1 = new Person(); p1.getInfo(); }
|
1 2 3 4 5 6 7 8 9 10 11 12
| class Person{ String userName = "张三"; int userAge = 18; Person(){ print("构造方法"); } void getInfo(){ print("我的名字是 ${this.userName}, 我今年 ${this.userAge} 岁"); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| class Person{ String userName=""; int userAge=0;
Person(String userName, int userAge){ this.userName = userName; this.userAge = userAge; }
void getInfo(){ print("我的名字是 ${this.userName}, 我今年 ${this.userAge} 岁"); } }
|
1 2 3 4 5 6 7 8 9 10
| class Person{ String userName=""; int userAge=0;
Person(this.userName, this.userAge);
void getInfo(){ print("我的名字是 ${this.userName}, 我今年 ${this.userAge} 岁"); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class Person{ String userName=""; int userAge=0;
Person(this.userName, this.userAge); Person.userName(this.userName); Person.userAge(this.userAge);
void getInfo(){ print("我的名字是 ${this.userName}, 我今年 ${this.userAge} 岁"); } }
void main(List<String> args) { var p1 = new Person.userAge(18); p1.userName = "张三"; p1.getInfo(); }
|
私有属性 _
私有方法 _
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class Person{ String _userName=""; int userAge=0;
Person(this.userName, this.userAge); Person.userName(this.userName); Person.userAge(this.userAge);
void getInfo(){ print("我的名字是 ${this.userName}, 我今年 ${this.userAge} 岁"); } }
void main(List<String> args) { var p1 = new Person.userAge(18); p1.userName = "张三"; p1.getInfo(); }
|
静态属性, 静态方法
static
继承 extends
调用父类的构造方法
重写父类方法, @override
抽象类、多态、接口