[学习笔记 Day01] Future 基础:Dart 语言从初识到异步编程的代码编写的蜕变

DartSDK

作用:用于帮助编写、编译、调试和运行

注意:

  1. 文件后缀名:.dart
  2. 入口:main() 方法
  3. 绝大部分结尾需要加分号,{} 后面不加分号!

如何需要了解更多或是安装 DartSDK,移步至下面所推荐的文章!

基础语法

常量和变量

变量的语法:

var 变量名 = 值;

常量语法:

const 常量名 = 值;
final 常量名 = 值;

补充:

  • DataTime.now():护球当前时间
  • print():打印输入

常用的数据类型

  • 字符串 String(可用单引 / 双引号)
    • 常用的属性和方法:
      • 匹配开头第一个字符是否是“新”字:.startWith("新")
    • 语法:
String 属性名 = '文本${变量名}'

//${变量名}  等价于 $变量名
  • 数字类型:int / num(可整数,也可小数) / double
    • 赋值关系:
      • double 不能直接赋值给 int 类型,但可间接,如 toInt() 方法
      • int 不能直接赋值给 double 类型,但可间接,如 toDouble() 方法
      • num 不能直接赋值给 double 类型,但可间接,如 toDouble() 方法
      • double 能直接赋值给 num 类型
  • 布尔类型 bool
  • 列表类型 List
    • 语法:List 变量名 = [v1 ,v2 ,v3 ,...];
    • 常用方法:
      • add(e):在尾部添加元素 e
      • addAll(列表):在尾部添加一个列表
      • remove(e):删除元素 e (第一个)
      • removeLast(e):删除元素 e (最后一个)
      • removeRange(start ,end):删除范围内的数据(不包含 end)
    • 常用的操作方法和属性:
      • 循环:.forEach(item)
      • 是否满足条件:.every(item){return 布尔值}
      • 筛选出满足条件的数据:.where((item){return 布尔值})
      • 列表长度:.length
      • 获取最后一个元素:.last
      • 获取第一个元素:.first
      • 是否为空:.isEmpty
  • 字典类型 Map:
    • 声明语法:Map 变量名 = {key:value}
    • 获取某个键的值:变量名[key]
    • 常用的操作方法:
      • 循环:.forEach((key,value){})
      • 再添加一个字典:.addAll(map)
      • 是否包含某个 key:.containsKey(key)
      • 删除某个键值对:.remove(key)
      • 清空字典:.clear()
  • 动态类型 dynamic:
    • 特点:允许变量运行时自由改变类型,同时绕过编译时的静态类型检查
    • 语法:dynamic 变量名 = 值 / 表达式;

dynamic 和 var 的区别:

类型名称区别
dynamic运行可自由改变类型,无编译检查,方法和属性直接调用
var0根据初始值推断类型,有编译检查,仅限推断属性和方法

空安全机制

通过编译静态检查将运行时空指针提前暴露。

常用的操作符:

操作符说明示例代码示例说明
可空类型:?声明可空变量string? name;允许 String 或 null
安全访问:?.对象为 null 可跳过操作,返回 nulluser?.name;user 为 null,返回 null
非空断言:!.保证变量非空(否则运行时崩溃)name!.length断言 name 非空
空合并:??在左侧为 null 返回右侧默认值name??"Jack"name 为 null,返回 Jack

运算符

算术运算符:+、-、*、/、~/(整除,向下取整)、%

赋值运算符:+=、-=、*=、/=

比较运算符:==、!=、>、>=、<、<=

逻辑运算符:&&、||、!

流程控制

if 分支:

if (){}
if (){} else {}
if (){} else if (){} else {}
if (){} else if (){ if (){} else {} } else {}

三元运算符:表达式 ? true : false

switch / case结构

循环语句:

while(){}
for(int i = 0;i<10;i++){}

函数

语法:

返回值类型 函数名(参数列表){
      函数体;
}

可选位置参数:

  • [参数列表] 包裹,按照顺序传递
  • 可选参数可以提供默认值!

可命名参数:

  • 使用 {参数列表} 包裹,按照 参数名=值 的方式进行传递,无需关注顺序!

匿名函数:

Function 变量名 = (){}

箭头函数:

函数名(参数列表) => 代码;

定义语法:

class 类名{

}

实例化语法:

类名 对象名 = 类名();

属性 / 方法:

对象名.属性名 / 方法名();

默认构造函数:

class 类名 {
      类名({参数列表}){}
}

命名构造函数:

class 类名 {
      类名.构造函数名({参数列表}){}
}

//实例化语法:
类名 对象名 = 类名.构造函数名(参数列表);

构造函数语法糖:

class 类名{
      类名({this.属性1,this.属性2});
      类名.命名函数({参数列表});
}

公有属性:提供自我或其他外部文件和类使用

私有属性:仅提供自身使用,使用 _属性名 / _方法名() 来区分

导入其他文件中的类的语法格式:

import '文件名.dart'

继承:Dart 属于单继承

class 类名 extends 父类名 {
      类名({参数列表}){}
}

重写:通过使用 @override 注解来重写父类方法,扩展其行为

super 语法:

子类构造函数({参数列表}):super({参数列表})

多态

抽象类:使用 abstract 关键字实现

语法:

abstract class 类名{}

通过继承实现抽象类:

class 类名 implements 抽象类名 {
      @override
      抽象类中的抽象方法(){}
}

类的混入:

在不使用传统继承的情况下,向类中添加新的功能

方式:

  • 定义:使用 mixin 关键字定义一个对象
  • 使用:使用 with 关键字将定义的对象混入到当前对象中

特点:一个类支持 with 多个 mixin ,调用优先级遵循“后来居上”的原则

语法:

mixin 类名1 {}

class 类名2 with 类名1 {} 

泛型

允许使用类型参数,限定类型的同时,让类型更加灵活,让代码更加健壮和可维护型更强

语法:

void 方法名<T>(参数列表){}

分类:泛型集合、方法和类。

异步编程

Dart 是单线程语言,即同时只能做一件事,遇到耗时任务就会造成程序阻塞

Dart 采用单线程 + 事件循环的机制来完成耗时任务

事件循环:

  • 执行同步代码 => 执行微任务队列 => 执行事件队列 => 结束
  • 微任务队列:Future.microtask()
  • 事件队列:FutureFuture.delayed()IO 操作

Future

代表一个异步操作的最终结果

状态:Uncompleted(等待)、Completed with a value(成功)、Completed with a error(失败)

创建:Future((){})

  • 执行成功:不抛出异常 => 成功状态 => then((){})
  • 执行失败:throw Exception() => 失败状态 => catchError((){})

语法:

Future f = Future((){});

f.then((){});
f.catchError((){});

// 链式调用
f.then((value){
      return Future(()=>"")
}).then((value){
      return Future(()=>"")
}
...
.catchError((error){})

async / await

特点:async 总等后面的 Future 执行成功,才会执行下方的逻辑

语法:

函数名() async {
      try {
            await Future({});// 执行成功后才执行后面的逻辑
      } catch(error){
            // 执行失败的逻辑
      }
}

补充:

// Duration():时间函数
// 延迟函数
Future.delayed(Duration(seconds:3));

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容