1、var、final、const
1.1、var
- 变量,不赋值为null,
编译期类型
1.2、dynamic
- 动态类型,
运行时类型
1.2、final
- 最终变量,只能被赋值一次,赋值后不可改变,
编译时常量
1.3、const
- 常量,初始时赋值,不可改变,
运行时常量
2、num
~/:计算时的取整操作.clamp(lower limit, upper limit):取整的上下限
.toString():转成字符串isNan: 判断一个对象是否为非数字ceil: 返回不小于该数字的最小整数floor: 返回不大于当前数字的最大整数
2.1、int
- int类型不能直接赋值成double
.isOdd:判断是否为奇数.isEven:判断是否为偶数.toDouble():转换成double类型
2.2、double
- double类型可以直接赋值int类型
.toInt():转换成Int类型
3、String
- var str = '字符串',再str = 10会出错:带赋值的初始化会固定其类型,要写成var str; str = '字符串'
str[n]:取字符串str的第n个字符+:拼接字符串,str1 + str2*:n个相同的字符串拼接,str * n$:取值,str3 = str1 + str2,$str3 或 ${str1 + str2},{}中放表达式r:字符串中不需要转译字符,让\n等这些能出现在字符串中,r'猫\n狗’.length:取字符串长度(转译字符串占1个长度,'\n':1个长度,r'\n':2个长度)
3、1、双引号""
- 创建多行字符串,直接写,直接拼到一起显示
3、2、三引号''' '''
- 创建多行字符串,并保留所有空格、换行等格式
4、list & Map
4.1、list(数组)
-
.asMap():角标做key,转成键值对 -
.forEach((element) { }:遍历内容 -
.indexOf(element,[start]):查找一个元素,返回这个元素在数组中的索引,如果数组中没有这个元素,则返回-1.该方法接收两个参数,第一个就是查找的元素,第二个是非必须参数,表示查找的起始位置。 -
.sort((Model a, Model b) {}:按模型中的某个属性进行排序list.sort((Model a, Model b) { return a.property compareTo(b.perperty); }); -
.toList():将一个可迭代类型转换为数组 -
.join(separator):将数组转换为字符串,参数为分隔符 -
reversed:反转数组,但是返回值不是一个数组,而是一个抽象类的实例化对象,所以需要通过 toList() 转换为数组 -
map(function):加工方法,该方法不会改变原数组,而是返回一个新的可迭代对象,Iterable,参数是一个回调函数。 -
any(function):遍历数组,每个元素都执行一次回调函数,判断是否满足回调函数返回值条件,如果有一个或以上元素满足,则返回 true。
4.1.1、 可变list
- var list1 = [1,2,'字符串'];
.add(value): 添加,list.add('cat');.remove(value): 删除元素,list.remove('字符串');.removeAt(index): 删除指定位置元素,list.removeAt(index);.insert(index, element): 插入,list.insert(1,'dog');.clear(): 清空.sort():排序.sublist(int start ,[int? end]):截取字符串,start:从第几位开始截取, end:截取多少位,可选的,不填为截到最后…: 扩展运算符: 将一个数组填充到另一个数组中…?: 空值判断扩展运算符List list1 = [1, 2, 3]; ///将list1填充到list2, 并判空 List list2 = [-1, 0, …?list1];
4.1.2、不可变list
- var list2 = const [1,2,'字符串'];
4.2、Map(键值对、字典)
.length:长度.keys:所有key.values:所有值.forEach((key, value) { }):遍历所有内容.isEmpty:判断集合是否为空.addAll():添加所有迭代对象中的键值对.remove(key):删除一个键值对
4.2.1、可变Map
- var json = {1 : 10, 2.5 : 'dog', '3' : 'cat'};
4.2.2、不可变Map
- var json = const {1 : 10, 2.5 : 'dog', '3' : 'cat'};
4.3、Set
- 集合:
无序、不允许存在重复的元素、最多允许一个空值 lookup: 查找Set中的某个元素
4.4、Iterable
Iterable是一个可被有序访问的元素集合。Dart中Iterable是抽象类,是不能被实例化的。但可以通过List、Set创建Iterable。- Iterable与List的不同之处在于,Iterable没有
[]操作符,因此不能使用如下方式读取特定索引的元素:但是我们可以用另一种方式来获取:
- 实现了Iterable的类,都是可以使用
for-in循环进行遍历的。for-in通过Iterator(迭代器),遍历Iterable对象。
4.4.1、first和last
- 使用Iterable的last属性会比较慢,因为它需要遍历所有的元素。当对一个空的Iterable对象使用first和last会报
StateError
4.4.2、firstWhere
- 从Iterable的对象中,获取满足条件的第一个元素
4.4.3、singleWhere
- 从Iterable的对象中,获取满足条件的一个元素,但它期望只有一个元素满足条件。如果超过一个或没有元素满足条件,则会抛
StateError。用法与firstWhere一致。
4.4.4、条件检查
4.4.4.1、every
- 使用Iterable,有时需要校验集合中的元素是否满足一些条件,可以不使用
for-in
4.4.4.2、any
- 判断是否至少有一个元素满足某个条件
4.4.5、where
- 返回满足条件的所有元素集合
4.4.6、takeWhile与skipWhile
- takeWhile会从Iterable对象中获取所有满足条件的元素,直到不满足时,会跳出迭代
- skipWhile会从Iterable对象中跳过所有满足条件的元素,直到不满足时,会获取。
4.4.7、map
Iterable对象可以使用map方法,对集合中的每个元素进行操作或替换,最终返回一个新的集合
5、运算符
??=:赋值运算,如果a为空,则赋值10,a ??= 10;??:条件表达式,如果a有值返回a,如果没值返回b,c = a ?? b
6、方法、箭头函数
- 方法也是一个对象
- 返回值和参数类型可以省略
- 当方法的执行语句
只有一句时可以使用箭头函数=> 表达式 - 可选参数:传递参数的时候必须带上形参名字
{}表示可选的,参数不用按顺序,[]表示可选的,参数要按顺序填
7、方法、函数
7.1、Dart方法作为参数传递
7.2、匿名方法
- 没有方法名称的方法
//匿名方法
(参数,可为空) {
执行代码;
}
//比如
(int i) {
print('i');
};
//常规用func接收一下
var func = (参数) {
执行代码;
}
func();
7.3、立即执行代码
((参数) {
执行代码;
};
8、闭包(closure)
- 定义在函数里边的函数,闭包也是一个对象
可以访问外部函数的局部变量- 闭包函数被释放前,
内部使用的变量不会被释放,会被闭包函数持续持有
9、Dart面对对象
9.1、整理:
- Dart中默认生成getter/setter方法
- 属性通过
点语法访问 - final修饰的属性必须定义初始值
- 当一个对象所有的属性都是final修饰时,那么这个对象可以创建为常量对象,使用const修饰
- 方法想返回内容,在方法前加关键字
factory
9.2、创建单例
9.3、初始化列表(:)
给final变量赋值校验传递的值
9.4、类方法(静态方法)
- 调用时使用
类名.属性调用,不要初始化 - static属性,全局唯一
静态方法中只能使用静态属性不能用实例属性,实例方法中却可以使用静态属性(加载静态方法时,实例属性可能并未创建)(变量 as 类名):强制类型转换- 链式编程
9.4、Dart的继承
-
使用
extends继承一个类 -
子类会隐性继承
除构造方法外的属性和方法,如果要调用父类的构造方法则要用: super显性书写 -
Dart是
单继承的
9.5、抽象类
- 不能被实例化的类,用
abstract修饰 - 抽象类中抽象方法不用写实现,继承抽象类的子类实现其中的抽象方法
9.5.1、协议接口
implement:多类实现,可以有抽象类也可有普通类,但抽象类必须有实现方法
10、Mixins混入(多继承)
- 混入类不能实现构造方法
- 混入后可以调用这多个类的方法
- 目的:给一个类增加功能
11、重载操作符
自定义类对象的比较规则(可按类中某一属性作为对象比较的标准)- 类中比较的内容
要继承于Object
12、关键字
12.1、@required
- 必须实现的内容
12.2、@protected
- 调用保护
12.3、as
- 自定义别名,如导入多个包包含同名属性、方法时,可以通过将导入的文件自定义别名,再调用的方式实现防止冲突