Hello World
如果需要读取命令行参数
变量声明
在dart中Object是除了null所有类型的父类
自动推断类型
明确类型
也可以声明类型为父类
对于局部变量建议使用var
类型转换
在 Dart 中,类型转换是一种将一个数据类型转换为另一个数据类型的过程。Dart 提供了多种方式来进行类型转换,以下是几种常见的方法:
-
使用 as
操作符进行显式类型转换:
-
类型检查和转换:
使用 is
关键字来检查一个对象是否是某个类型,然后使用 as
关键字进行转换:
-
使用 toString
方法将其他类型转换为字符串:
-
使用 parse
方法将字符串转换为数字:
-
使用 tryParse
方法进行安全转换:
如果转换失败,不会抛出异常,而是返回 null:
-
列表类型转换:
可以将一个动态类型的列表转换为特定类型的列表:
-
自定义对象类型转换:
如果你有一个自定义类,你可以定义一个方法来进行类型转换:
字符串格式化
在Dart中,字符串格式化有几种常见的方法,以下是每种方法的示例:
1. 使用字符串插值 (String Interpolation)
这是Dart中最常用和最简洁的字符串格式化方法。
2. 使用 String
类的 replaceAll
方法
可以使用 replaceAll
方法进行简单的字符串替换。
3. 使用 StringBuffer
StringBuffer
提供了高效的字符串拼接方法,适用于需要大量拼接的情况。
4. 使用 dart:convert
中的 jsonEncode
进行简单的模板替换
这种方法适用于复杂的模板替换场景,可以将变量替换逻辑和模板分开。
intl
包提供了强大的国际化和格式化功能,适用于处理日期和数字格式。
空安全
dart的类型默认是非null的, 如果要使变量能接收null, 需要使用可null类型, 在类型声明后面加上?
在使用变量前需要先初始化变量, 对于可null类型, 默认有默认值null初始化, 对于非null类型, dart不会设置默认值, 强制需要初始化, 不能访问可null类型除了hashCode和toString之外的属性和方法。
不强制要求在声明局部的位置进行初始化, 但是要在其使用前分配一个值。
惰性变量
在dart中使用late
声明惰性变量, 惰性变量可以延迟初始化
如果在读取读去变量时还没有初始化, 程序将发生运行时错误
惰性初始化多用于
- 变量可能不需要, 并且初始化变量的成本很高
- 正在初始化实例变量, 其初始化设定项需要访问this
如果未使用temperature, readThermometer将不会运行
final和const
如果不修改声明的变量, 使用final
或const
代替var
, const变量是编译时常量(const 是隐式的 final)
实力变量可以是final, 但不能是const
任何变量都可以具有常量的值
可以修改非final和const的值, 即使之前是const值
可以使用类型检查(is
和 as
), 集合(if
), 拓展运算(...
和 ...?
)
final无法修改对象, 但是对象的属性是可以修改的, const对象及其字段都无法修改
运算符
描述 | 操作符 | 关联 |
---|
一元后缀 | expr++ expr— () [] ?[] . ?. ! | 无 |
一元前缀 | -expr !expr ~expr ++expr —expr await expr | 无 |
乘法级 | * / % ~/ | 左 |
加法级 | + - | 左 |
移位 | << >> >>> | 左 |
位与 | & | 左 |
位异或 | ^ | 左 |
位或 | | | 左 |
关系判断 | >= > <= as is !is | 无 |
相等 | == != | 无 |
逻辑与 | && | 左 |
逻辑或 | || | 左 |
空判断 | ?? | 左 |
三元 | expr1 ? expr2 : expr3 | 右 |
级联 | .. ?.. | 左 |
赋值 | = *= /= += 等 | 右 |
dart有两种除法 /
和~/
, /
计算结果是浮点数, ~/
计算结果是整数
is和!is用于判断值和类型的关系
??=赋值
级联操作
注释
元数据
元数据提供有关代码的信息, 元数据以@
开头, 后跟编译时常量的引用或常量构造函数的调用
所有dart代码都有的四个注释@Deprecated
, @deprecated
, @override
, 和 @pragma
@Deprecated
和@deprecated
都表示将要废弃, @Deprecated
可以自定义提示信息, @deprecated
不能自定义提示信息
库
在库中以_
开始的标识符仅在库内可见
导入库
如果两个库的标识符冲突, 可以使用指定库的前缀
延迟加载库(仅适用于Web)
library
指令, 指定库级的文档注释或元数据
数据类型
内置类型
数字类型
dart包含两种数字类型int
和double
int是不大于64位的有符号整数类型, 在javascript中用64位浮点数的的整数部分表示(相当于53位的有符号整数)
double 是64位双精度浮点数
int和double是num的子类
字符串
dart字符串是utf-16编码的, 可以使用单引号和双引号创建字符串
Bool
布尔类型只有两种值, true和false, 并且都是编译时常量
dart是强类型语言, 在if中不会隐式转换为bool
符文
对应Unicode码位, 如果要读取或写入单个Unicode字符, 使用characters
包
符号
获取符号
记录(Records)
记录是只读的, 记录可以有名称, 名称不同或类型不同, 记录的类型不同
集合类型
展开运算符
控制流在集合中的使用
泛型
泛型可以生成更好的代码, 减少重复代码
默认约束
类型别名
模式
模式可以用来匹配值或解构值
交换两个变量
守卫
共享变量并使用守卫
函数
函数是对象且具有Function类型。
命名参数
可选位置参数
函数相等
dart的所有函数都有一个返回值, 如果未指定返回值则默认返回null
dart有两种生成器, 同步生成器Iterable和异步生成器Stream
外部函数
external
是函数体和声明分开的函数。在函数声明前加external, 通常用于函数实现在另外的dart库, 或者函数的实现来自另外的语言, 引入外部的函数或值。外部函数可以是顶级函数, 实例方法, getter,setter或非重定向构造函数, 实例变量使用external
相当于外部的getter和setter(变量不是final)。
控制流
循环
分支
异常
在dart中如果抛出的异常没有被捕获则将导致isolate
挂起, 通常会导致isolate
及其程序被终止。
dart提供了Exception
和Error
类型, 但是dart中可以使用thow抛出任意的非null对象, 不要求必须是Exception
和Error
类型的对象作为异常, 通常还是使用Exception
和Error
类型的异常。
通过thow抛出的异常可以通过catch捕获到。
类
每个实例都是类的对象, 除了Null之外的所有类都源于Object, 除了顶层类Object?
都只有一个超类。拓展方法可以在不更改类和创建子类的情况下向类添加功能。
常量构造函数
实例变量
所有实例变量都会有隐式getter, 非final变量和没有初始化的late final 还会生成隐式的setter方法
声明非late的实例变量会在实例创建时, 构造函数及其初始化列表执行之前设置值, 因此非late实例变量的初始化表达式不能访问this
隐式接口
类变量
默认构造函数
如果没有声明默认构造函数, 将生成一个无参构造函数, 并会调用父类的无参构造函数
命名构造函数
超类参数
从定向构造函数
工厂构造函数
运算符重载
支持的运算符
< | + | | | >>> |
---|
> | / | ^ | [] |
<== | ~/ | & | []= |
>= | * | << | ~ |
- | % | >> | == |
显式getter和setter
继承
noSuchMethod函数
mixin
mixin不能有extends, 并且不能声明构造函数
通过on
限制使用mixin的超类
mixin class
abstract mixin class
枚举
枚举都会自动拓展Enum类, 他们都是密封的, 不能显示实例化
简单枚举
增强枚举
拓展方法
未命名的拓展
可调用对象
类修饰符
类修饰符用于控制class或mixin的使用方式
- abstract
- base
- final
- interface
- sealed
- mixin
使用base
可以用在mixin前面
如果允许从任何库或子类型不受限制的使用, 使用不带修饰符的class或mixin
abstract
定义不完整的类, 抽象类不能构造, 抽象类通常有抽象方法
base
强制继承类或mixin的实现, 基类不能在自己库之外实现
interface
abstract interface
不但无法extends, 还可以包含抽象方法
final
sealed
sealed类是隐式抽象的, 但是sealed的子类不是隐式抽象的
并发
dart的运行时是基于事件循环的
Futures
Future表示异步操作的结果, 该操作最终会带有一个值或一个错误
Streams