文章目录
- 前言
- 一、main
- 二、数据类型
- 1.num
- 2.var & final & const
- 3. String
- 4.bool
- 5.List
- 6.Map
- 7.dynamic
- 三、运算符
- 1.算数运算符
- 2.逻辑运算符
- 3.赋值运算符
- 4.关系运算符
- 5.条件运算符
- 四、流程控制
- 1.if
- 2.for & for in
- 3. while & do while
- 4. switch case
- 5.break & continue
- 五、方法
- 1.`Funtion {} [] 可选位置参数、可选命名参数、参数默认值`
- 2.方法对象
- 3.匿名方法
- 4.闭包
- 六、面向对象
- 1.class & object
- 2.计算属性
- 3.constructor
- 4.factory constructor
- 5.初始化列表
- 6.call()
- 7.对象操作符
- 8.static
- 9.extends
- 10.继承中的构造方法
- 11.abstract class
- 12.interface
- 13.Mixins
- 14.operator
- 15.enum
- 16.DateTime
- 17.异步编程
- 六、正则表达式
- 七、其他补充
- 1.typedef 给类型取一个别名
- 2.私有属性
- 总结
前言
在自身有Java基础的前提下,使用Flutter进行了一段时间的项目开发。发现还是许多关于Dart的基础知识不是很理解,所以从零开始学习了Dart,查缺补漏,不断学习进步。
一、main
二、数据类型
1.num
- int 和 double是num 的子类
- floor 向下取整
- ceil 向上取整
- 4.0.0 /0.0 NaN
- round 四舍五入
- ~/ 除法取整
2.var & final & const
- 使用var申明变量,可赋予不同类型的值
- var 申明变量未初始化时为 null
- final 申明一个只能赋值一次的变量
- 使用const申明一个常量
- 使用const申明的必须是编译期常量)
3. String
- 三个单引号或者双引号可输出多行文本
- \n 换行 \t tab
- 引号前面加 r 不转义
- 两个字符串相比较 == 比较的是内容
- 差值表达式 ${} 只有一项的时候可以省略括号
- str * 10 字符串复制
- endsWith 是否以什么结束
- startWith 是否以什么结束
- split 以什么分隔,得到的是一个数组
- 字符串连接 + 两个向量连接 ‘a’ ‘b’ 空格两个字符串连接,必须是字符串不能是变量
- 字符串转数字 int.parse() double.parse()
- 数字转字符串 .toString() 保留精度 toStringAsFixed(位数)
- substring(start,end) 字符串截取前包后不包,只有一个参数的时候表示从当前index开始截取到最后
- splitMapJoin()查询“,”,用onMatch的返回值替换“,”用onNonMatch的返回值替换其他
- contains(‘a’,[index]);当有两个参数时从index位置开始判断
- replaceAll(’,’,’’)
- replaceFirst(’’,’’,[index])当没有index表示,只替换第一个,有时表示从index开始第一个
- replaceRange(start,end,’’)范围替换,前包后不包
- replaceAllMapped(’’,function,[index])从index开始 用方法返回值替换指定的字符串
- indexOf(’’,[index])
- lastIndexOf(’’,[index])
- toLowerCase()
- toUpperCase()
- trim() trimRight() trimLeft() 去除空格
- pad(index,[内容]) padRight(index,[内容]) padLeft(index,[内容]) 补齐长度,默认以’’
- compareTo() ascii码比较
4.bool
- false
- true
5.List
- 在dart中数组和List是一样的概念
- indexOf() 查找元素所在位置,找到返回元素所在下标,没有找到则返回-1
- sort() 排序参数支持排序规则的方法 默认按照ascii码表排序
- add() 添加一个元素(从末尾添加)
- insert(index,value) 插入指定位置的元素
- forEach() 参数为一个方法 List 遍历
- 不可变List List list = const []
- sublist(start,end)//一个参数的时候表示,截取List中下标为start的值,两个参数的时候表示截取从start到end之间的值(前包后不包)(第二个为可选参数)
- list1.addAll(list2) //两个list合并,得到的list1是两个list合并的结果
- insertAll(index,list) //在指定index处插入list其余顺延
- followedBy(list)将自身和参数内list合并成一个List,返回Iterable
- remove(obj)删除具体的元素
- removeAt(index)删除指定index位置元素
- removeLast()删除末尾元素
- removeRange(start,end)范围删除
- removeWhere()根据条件删除
- clear()清空数组
- list13[0] = 2;修改指定index位置的值
- setRange(startIndex,endIndex,list)范围内修改List的值,含头不含尾
- replaceRange(start,end,list)范围内替换,含头不含尾
- fillRange(start,end,value)从start-end每个元素用value替换,含头不含尾
- retainWhere(()=>(bool));根据条件筛选元素
- setAll(index,list)从index开始,使用list内的元素逐个替换本list中的元素
- indexOf(element,[start]);从index处开始查找指定元素,返回指定元素的索引,从前往后
- lastIndexOf(obj,[start]);从index处开始查找指定元素,返回指定元素的索引,从后往前
- elementAt(index)获取指定索引位置的元素
- any((element) =>(bool))判断List中是否有任意一个元素符合给定的参数
- every((element)=>(bool))判断List中是否每个元素都符合参数的函数
- contains(obj)List中是否存在给定的obj
- firstWhere((element) => (bool))返回第一个满足条件的元素
- indexWhere((e)=>(bool))返回第一个满足元素的index
- lastIndexWhere((e)=>(bool))从后面往前找,返回第一个满足条件的元素的index
- lastWhere((e)=>(bool))从后面往前找,返回第一个满足条件的元素的值
- forEach() 遍历每一个元素
- map()遍历现有List的每一个元素,并做处理,返回一个新的Iterable
- fold(initValue,(preValue,element)=>())根据现有的List和给定的initValue指定一个参数函数规则,对List每个元素做操作,并将结果返回
- reduce((a,b)=>())用指定的方法对元素做连续操作,将结果返回
- skip(count)越过count个元素后,开始返回list的Iterable+
- skipWhile((e)=>(bool))根据参数函数。找到第一个不符合条件的元素,然后将其及其后的元素返回
- take(count)从0开始取count个元素,并返回结果
- takeWhile((e)=>(bool))从0开始取,直至第一个不符合函数的元素,将其前面的元素都返回
- where((e)=>(bool))根据指定参数函数筛选每个元素,符合条件的元素组成一个新的Iterable
- singleWhere((e)=>(bool))找到唯一满足条件的元素
- whereType()从无指定泛型的List中,筛选出指定类型的数据
- cast()将List的泛型提升到其父类
- expand()根据现有的List,指定一个规则,生成一个新的List
- toSet()将List转为Set去除后面重复的元素
- asMap() 将list转为Map
- shuffle() List内元素,重新随机排列
- sort()List自身排序
- sublist(start,[index])从指定index截取list,含头不含尾
- length
- isEmpty
- isNotEmpty
- reversed
- first
- last
- toSet().toList() 数组去重
6.Map
- Map的key value 可以是任意类型
- length
- isEmpty
- isNotEmpty
- keys 得到所有的key _CompactIterable
- values 得到所有的value _CompactIterable
- containsKey(’’) containsValue(’’)
- remove() //参数为key
- List 转 Map 默认会以下标为key list的内容为value 下标从零开始
- forEach() //参数为一个方法 使用见代码)
- cast()泛型提升为父祖类
- putIfAbsent()存在key就获取值,不存在则添加到map然后返回值
- addEntries()合并两个map如果key有重复,被合并的map的value覆盖前者
- addAll()整体合并另一个map,泛型要一致
- removeWhere()根据条件批量删除
- putIfAbsent() 添加(key,返回value的方法)
7.dynamic
- 动态数据类型
三、运算符
1.算数运算符
- +
- -
- *
- /
- ~/ 除法取整
- % 求余数
- ++
- –
2.逻辑运算符
- !
- &&
- ||
3.赋值运算符
- ==
- ?== 当前者为null时执行后面
- +=
- -=
- *=
- /= 被除数需要是double类型
- ~/= ~/
4.关系运算符
- >
- <
- =
- ==
- >=
- <=
- !=
- 两个字符串比较 == 比较的是内容
5.条件运算符
- ? 正常三木运算符
- ?? 前者为空执行后者
四、流程控制
1.if
- 和其他语言一致
2.for & for in
- 和其他语言一致
3. while & do while
- 和其他语言一致
4. switch case
- 1.比较类型: num ,String ,编译器常量,对象,枚举
- 2.非空case必须有一个break;
- 3.default处理默认情况
- 4.continue跳转
- 5.可以加标签跳转,用法看代码
5.break & continue
- 和其他语言一致
五、方法
1.Funtion {} [] 可选位置参数、可选命名参数、参数默认值
- 在Dart中方法也是对象,并且有具体的类型Function
- 返回值类型、参数类型都可以省略
- 箭头语法 => expr 是{return expr;}的缩写。只适用于一个表达式
- 方法都有返回值,如果没有指定默认返回一个null
- 箭头语法不能写rerun
- 三目运算可以写箭头语法
- 可选参数: {} 可选命名参数 []可选位置参数
- 必须参数只能放在第一,可选参数放在后面
- 使用 = 在可选参数指定默认值,默认值只能是编译期的常量
- 可选参数默认值:没有传递参数的时候使用,传递参数时则使用传递的参数
- 方法对象:方法可以作为对象赋值给其他变量,方法可以作为参数传递给其他方法
2.方法对象
- 方法对象:方法可以作为对象赋值给其他变量,方法可以作为参数传递给其他方法
- 当将方法作为变量赋值时。写方法名称即可,变量加小括号调用
- 当将方法作为参数传递的时候,也是写明方法名称即可。注意不能使用可选命名参数
3.匿名方法
- 可赋值给变量,通过变量进行调用
- 可在其他方法中调用或传递给其他方法
4.闭包
- 闭包是一个方法(对象)
- 闭包定义在其他方法内部
- 闭包是定义在方法内部的方法
- 闭包能访问外部方法内的局部变量,并持有其状态
六、面向对象
1.class & object
- 使用关键字class申明一个类
- 使用关键字new创建一个对象,new可以省略
- 所有对象都继承于Object类
- 属性默认会生成getter和setter方法
- 使用final申明的属性只有getter方法
- 属性和方法通过 . 访问
- 方法不能被重载
- 通过初始化列表对final修饰的属性进行初始化
2.计算属性
- 顾名思义,计算属性的值是通过计算而来,本身不存储值
- 计算属性赋值,其实就是通过计算转换到其他实例变量
3.constructor
- 如果没有定义构造方法,则会有一个默认构造方法
- 如果存在自定义构造方法,则默认构造方法无效
- 构造方法不能重载,可以有命名构造方法
- 何为构造方法,及创建对象的时候调用的方法
- 在构造方法中对属性进行初始化,可以是使用this.属性名的语法糖形式(该方式对属性赋值在构造方法执行之前,所有可以对final类型的变量进行初始化)
- 常规方式的构造方法对属性进行初始化,不能对final类型的变量进行初始化
- 使用命名构造方法,可以实现多个构造方法 类名称.方法的方式实现
- 常量构造方法:如果类是不可变状态,可以把对象定义为编译期时常量。
- 常量构造方法:使用const申明构造方法,并且所有变量都为final.使用const声明对象,可以省略
4.factory constructor
- 工厂构造方法类似于设计模式中的工厂模式
- 在构造方法前添加关键字factory实现一个工厂构造方法
- 在工厂构造方法中可以返回对象
- map初始化
static final Map<String,Logger> _cache = <String,Logger>{};
- final属性的赋值需要在构造方法执行之前进行
5.初始化列表
- 初始化列表会在构造方法执行之前执行
- 使用逗号分隔初始化表达式
- 初始化列表常用于设置final变量的值
6.call()
- 如果类实现了call()方法,则该类的对象可以作为方法使用
- 方法只要是call名称,返回值和参数可以根据需要指定
7.对象操作符
- ?. 条件成员访问 不为null时执行
- 类型转换 as
- 是否制定类型 is is!
- 级联操作 …
8.static
- 使用static关键字来实现类级别的变量和函数
- 静态成员不能访问非静态成员,非静态成员可以访问静态成员
- 类中的常量需要使用static const 申明
9.extends
- 使用关键字extends继承一个类
- 子类会继承父类可见的属性和方法,不会继承构造方法
- 子类能够复写父类的方法、getter和setter
- 单继承、多态性(父类引用指向子类对象)
10.继承中的构造方法
- 子类的构造方法默认会调用父类的无名无参构造方法
- 如果父类没有无名无参构造方法,则需要显示调用父类的构造方法
- 在构造方法参数后使用 : 显示调用父类构造方法
- 父类的构造方法在子类的构造方法体开始执行的位置调用
- 如果有初始化列表,初始化列表会在父类的构造方法之前执行
11.abstract class
- 抽象类使用abstract表示,不能直接被实例化
- 抽象方法不用abstract修饰,无实现
- 抽象类可以没有抽象方法
- 有抽象方法的类一定要申明成抽象
12.interface
- 类和接口是统一的,类就是接口
- 建议使用抽象类的方式作为接口
- 每个类都隐式的定义了一个包含所有实例成员的接口
- 如果是复用已有类的实现,使用继承(extends)
- 如果只是使用已有类的外在行为,使用接口(implements)
13.Mixins
- Mixins类似于多继承,是在多类继承中重用一个类代码的方式
- 作为Mixin的类不能有显式的构造方法
- 作为Mixin的类只能继承自Object
- 使用关键字with连接一个或多个mixin
14.operator
- 操作符复写
15.enum
- 枚举是一种有穷序列集的数据类型
- 使用关键字enum定义一个枚举
- 常用于代替常量,控制语句等
- index从0开始
- 不能指定原始值
- 不能写方法
16.DateTime
- DateTime.now()
- DateTime([int month = 1,int day = 1,int hour = 0,int minute = 0,int second = 0,int millisecond = 0,int microsecond = 0]);
- DateTime.utc(int year,[int month = 1, int day = 1,int hour = 0,int minute = 0,int second = 0,int millisecond = 0,int microsecond = 0]);
- 解析时间 ISO 8601 DateTime.parse(’’)
- 时间增减量add(new Duration(minutes: 5)) add(new Duration(minutes: -5))
- 时间比较 isAfter中(param)是否在param之后
- 时间比较 isBefore(param)是否在param之前
- 时间差 difference print([difference.inDays, difference.inHours]);//d1与d2相差的天数与小时
- 时间戳 print(now.millisecondsSinceEpoch);//单位毫秒,13位时间戳 print(now.microsecondsSinceEpoch);//单位微秒,16位时间戳
- padLeft(int width,String padding):如果字符串长度小于width,在左边填充padding
- 防止某一段代码重复执行
17.异步编程
- 在Dart中与Promise对应的是Future
- Dart是单线程的,没有线程抢占,数据安全
- Future对象封装了Dart的异步操作,两种状态(uncompleted)(completed)
- 在Dart中,所有涉及到IO的函数都封装成一个Future对象返回,在你调用一个异步函数的时候,在结果或者错误返回之前,你得到的是一个uncompleted状态的Future
- completed也有两种状态,一种代表成功返回结果,一种代表失败返回错误
- FutureOr 是个特殊的类型,它没有类成员,不能实例化,也不可以继承,看来它很可能只是一个语法糖 受限制的dynamic类型,因为它只能接受Future或者T类型的值 请避免声明函数返回类型为FutureOr
- 如果Future内的函数执行发生异常,可以通过Future.catchError来处理异常
- Future支持链式调用
- 申明了async的函数,返回值必须是Future对象。即便你在async函数里面直接返回T类型的数据,编译器会自动帮你包装成Future类型的对象。如果是void函数则返回Future
- 在遇到await的时候,又会把Future类型拆包,原来的数据类型暴露出来
- await所在的函数必须添加async关键字
- 事件循环 (Event Loop) isolate
- 事件队列:用来处理外部的事件,如果IO、点击、绘制、计时器(timer)和不同 isolate 之间的消息事件等。
- 微任务队列:处理来自于Dart内部的任务,适合用来不会特别耗时或紧急的任务,微任务队列的处理优先级比事件队列的高,如果微任务处理比较耗时,会导致事件堆积,应用响应缓慢。
- 你可以通过Future.microtask 来向isolate提交一个微任务
- 多线程 在Dart中,你可以通过Isolate.spawn 来创建一个新的isolate
六、正则表达式
七、其他补充
1.typedef 给类型取一个别名
2.私有属性
在dart中,_表示私有属性,与Java不一样。dart的私有属性是针对文件的,和类没有关系。意思是,以下划线开头的属性只在当前文件内可以访问。
总结
完整代码地址:gitee 欢迎参与,共同学习进步。