Dart
主入口
main(){
// 代码
}
基础
变量定义
var 名称; 不需要给定类型
final 名称; 只能赋值一次
const 名称 = 1; 只能声明时赋值
数据类型 名称; 指定数据类型
空安全
数据类型? 变量名; 可空
数据类型? 函数名(){} 可返回空
变量!.属性 变量之前设置了可空 调用需要添加 ! , 有值 返回属性, 无值 抛出异常
运算符
+ - * /
++ 加等于 1
-- 减等于 1
+= 加等于
-= 减等于
! 取反
== != 相等判断
&& 逻辑与
|| 逻辑或
?? 空判断
> < >= <=
is 类型判断
as 类型转换
.. 连 缀
表达式
变量 ??= 值; 只在空的情况下赋值
变量1 ?? 变量2 左边表达式返回空值,则会返回右边的表达式
变量1 ?? 变量2 ?? 变量3
表达式 ? 值1 : 值2 表达式如果为true则 返回 值1 否则 返回 值2
箭头语法
该函数将在其右侧执行表达式并返回其值
name => 1+1;
语法
备注
print();
打印
as
is 也可以是 is! 相反
流程控制语句
if
判断
if (条件) {
// 代码
} else if (条件) {
// 代码
} else {
// 代码
}
for
遍历循环
for (final 名称 in 可迭代变量) {
print(名称);
}
循环
for (int month = 1; month <= 12; month++) {
print(month);
}
break 结束循环
continue 结束本次循环
while
循环
while (条件) {
// 代码
}
break 结束循环
continue 结束本次循环
switch
```dart switch (变量) { case '值': // 代码 break; case '值': // 代码 break; default: // 代码 }
try
try {
// 代码
} catch (e) {
// 异常处理代码
}
函数
返回类型 名称(参数, {可选参数, 可选参数}){
// 代码
return 值 // 返回类型是 void 时不需要 return
}
描述
返回类型可以为空
返回类型为 void 代表没有返回值
命名参数 和 默认参数
名称(a, {required int b, int c='默认值', int? w}){
// 代码
}
required 必传
数据类型? 可空
可选参数 和 默认参数
名称(int a, [int? b, int c='值']) {
# 代码
}
肩头函数
返回 一行代码执行后的 值
void 名称() => # 代码
匿名函数
定义一个方法给变量
var 名称=(参数){
# 代码
}
泛形函数
调用时规定 T 的数据类型, T 可以直接拿去当数据类型使用, 减少冗余 操作类型校验
// 函数定义
T 函数名<T>(T value){
return value;
}
// 调用
函数名<数据类型>(值);
面向对象
实例化
类名 名称 = 类()
var 名称 = 类()
类
class 名称 {
String? name; // 属性
int? age; // 私有属性
late int id; // 延迟初始化
String 名称2 = '值'; // 属性
// 构造方法
类名(String name, int age) {
// 代码
this.name = name
}
// 方法
void 名称5(参数, 参数) {
// 代码
}
}
_变量 私有
方法名开头 _ 代表私方法
构造方法
直接赋值给属性
类名(this.名称1, this.名称2, this.名称3);
动态赋值 不需要传参数
类名(this.名称1):名称2='值', 名称3='值';
命名构造方法
类里可以有多个 命名构造方法
实例化 命名构造方法 后不会执行 默认构造方法
类名.名称(参数1,次数2) {
// 代码
}
实例化
var 名称 = 类名.命名构造方法()
get
方法 直接以属性访问的方式执行
// 方式 1
int get 名称3 => 代码;
// 方式 2
get 名称4{
// 代码
return 值 // 此行可选
}
set
方法 直接以属性赋值的方式执行
// 方式 1
set 名称(value) => 代码
// 方式 2
set 名称(value){
// 代码
}
static
静态属性 静态方法
// 静态方法
static 名称(){
// 代码块
}
// 静态属性
static 类型 名称;
继承
class 类名 extends 继承的类(){}
实例化时 给父类传参
// 构造方法 给 父类默认构造方法 转参
类名(参数1, 参数1): super(参数1, 参数1){}
// 构造方法 给 父类命名构造方法 转参
类名(参数1, 参数1): super.父类命名构造方法(参数1, 参数1){}
在子类里使用父类方法
super.方法名()
多态
重写父类方法
@override
方法名(){
// 代码
}
抽象类
不能被实例化, 基础的 抽象类 子类 必须实现全部抽象方法
abstract class 抽象类名{
抽象方法名();
// 普通方法 可以被调用
方法名(){
// 代码
}
}
接口
需要实现父类的全部 方法(包括普通方法) 和 属性, 用于规定结构
class 类名 implements 继承的类{
@override
String 名称;
@override
方法名(){}
}
实现多个接口
class 类名 implements 继承的类1, 继承的类2{}
with
全新特性 类似多继承, 父类不能继承其他类, 父类不能有构造方法
class 类名 with 继承的类1, 继承的类2{}
混合
class 类名 extends 继承的类1 with 继承的类2, 继承的类3{}
泛形类
实例化时规定 T 的数据类型, T 可以直接拿去当数据类型使用
// 定义
class 类名<T, P, 更多>{}
// 实例化
类名 名称 = 类名<数据类型, 数据类型>()