跳转至

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, 更多>{}

// 实例化
类名 名称 = 类名<数据类型, 数据类型>()