导图社区 Dart语言基础学习思维导图
Dart语言基础学习思维导图,适合有编程语言功底的学习
编辑于2020-04-27 22:17:16Dart语言学习
重要概念
任何变量都是一个对象,不论是int,null还是函数;所有对象都继承子Object
Dart 是强类型的,但是 Dart 可以推断类型;明确动态类型:dynamic
Dart 是强类型的,但是 Dart 可以推断类型
Dart 支持泛型
Dart支持顶级函数(main); 支持内嵌函数,局部函数
Dart支持顶级变量
Dart没有public,private,protected,如果以"_"开头,表示库私有
变量
变量的定义
var name = 'beason' //类型推导为string
dynamic name = 'beason' //动态类型,编译时不会进行类型推导,运行时进行类型推导
通过dynameic定义的变量,会关闭类型检查
String name = "beason" //指定类型为String
思考:var, dynamic,object定义变量的区别?
默认值
未初始化的变量默认都是Null,无论是数字还是其他类型
Final/Const
使用过程中从来不会被修改的变量:final和const
Final 只能被设置一次:必须在构造函数体执行之前初始化
Const在编译时就已经固定
内建类型
Number
int:整数值不大于64位
double:64位浮点数
String
'beason'、“Beason",'beason \'s,',"beason \'s"
支持内嵌${expression}表达式
使用”+“运算符,把多个字符串连接成一个
==用来检查两个对象是否相等
定义多行可以使用'''三个点定义字符串
使用r前缀,可以定义raw原始字符串(没有任何转义,\n照样输出)
Boolean
bool类型,只有字面量true/false表示
List(常被称为Array)
定义:var list = [1,2,3] ,推导类型为list<int>
元素访问:list[1],list[-1]
Map
定义:var map = {"key":"value"}
元素访问:map["key"]
添加元素:map["addKey":"addValue"}
Set
定义:元素唯一的无序集合:var set = {1,2,3,4,5,7},类型推导为:Set<int>
Rune
Symbol
函数
类型:Function
函数体只有一行表达式可以用 =>缩写
函数是一等对象
可以将函数作为另一个函数的参数
可以将函数赋值给任意变量
参数
命名可选参数
定义:{param1,param2,param3}
调用:paramName:value
@required 定义参数性质
位置可选参数
定义:[]
默认参数值
使用=号来定义可选参数默认值,如果没有提供默认值,那么默认值为null
匿名函数
定义:也称之为:lambda或者closure
如果匿名函数只有一条语句同样可以使用 =>简写
子主题
词法闭包
闭包:既一个函数对象,即使函数对象的调用在它的原始作用域之外,依然能够访问在它次法作用域内的变量
返回值
所有函数都有一个返回值(显示声明void除外),如果没有明确返回值,函数体会隐式的添加return null
运算符
算术运算符
+,-,*,/,%,~/,++var,var++,--var,var--
关系运算符
==,!=,>,<,>=,<=
两个独享是否相等使用 "=="
类型判定运算符
as,is,is!
赋值运算符
=:为变量赋值
??=:如果变量为空时赋值,否则变量保持不变
符合赋值运算符:-=,+=,*=,/=,>>=,^=,......
逻辑运算符
!expr,||,&&
按位和位移运算符
&,|,^,~expr,<<,>>
条件表达式
condition?expr1:expr2
expr1??expr2 如果expr1为Null,返回expr2否则返回expr1
级联运算符
..:可以实现同一个对象的一系列操作
其他运算符
[],(),.,?.
流程控制
if and else
else是可选
条件判断必须是bool类型
for循环
标准用法:for(var i -0;i<10;i++)
闭包,在for循环中会捕获循环的index值
支持for-in进行迭代操作(常用语list,set中 )
while和do-while
switch-case
Dart中使用==比较数值,字符串
枚举类型也可以用于switch-case
assert
assert只在开发环境中有效,在生产环境中是无效的
TypeDefs
typedef 为函数起别名
可调用类
实现类的call()方法,可以让类像函数一样被调用
异步
Future
async和await
await会阻塞代码的执行,直到需要的对象返回为止
使用futureAPI
Stream
使用async和异步循环
使用StreamAPI
库和可见性
import和library指令可以用来创建一个模块化的,可共享的代码库
以下换线(_)开头的标识符,仅在库内可见
每一个Dart程序都是一个库
使用库
通过import导入库,import参数只需要一个指向库的URI,dart:或者package:
指定库前缀,两个库存在标识符冲突时
导入库的一部分
import * show food
import * hide food
延迟加载库
deferred as来导入,当需要使用时候使用loadLibrary()来加载
loadLibrary()可以调用多次,但是只载入一次
延迟加载库的常量在导入的时候是不可用的,只有当库加载完成的时候,库中常量才可以使用
泛型
使用集合字面量
List,Set,Map字面量也是可以进行参数化的
List,Set:声明语句前面加<type>
Map:声明语句前面加:<type, type>
泛型类型的构造函数
在类名字后面使用尖括号:Set<string>.rom(names)
运行时中的泛型集合
Dart中泛型类型是固化的,也就是说它在运行时携带者类型信息,想法Java中的类型会被擦除
限制泛型类型
extends实现泛型类型的限制
泛型函数
Dart允许在方法和函数上使用泛型
类
所有的类都继承自Object
基于Mixin继承,意味着每一个类都只有一个超类(除Object)以外
使用(.)号来引用实例变量的变量和方法
使用?.来替代,避免由于左边参数为Null导致的异常
构造函数
定义:构造函数可以是:ClassName或者ClassName.indentifier
常量构造函数:在构造函数前面加上:const
构造两个编译时常量,会产生一个唯一的,标准的实例
通常模式下,会将构造函数传入的值, 赋值给对应的实例变量
class Point { num x, y; // 在构造函数体执行前, // 语法糖已经设置了变量 x 和 y。 Point(this.x, this.y); }
父类的构造函数参数在构造函数之前执行
支持在构造函数体执行之前初始化实例变量,可以很方便初始化final字段
初始化程序无法访问this
重定向构造函数
常量构造函数,如果该类生成的对象是固定不变的,就可以把这些帝乡定义为编译时常量
工厂构造函数
factory关键字
工厂构造函数无法访问this
获取对象的类型:this.runtimeType
所有的实例变量都隐式的生成get方法,非final变量还会生成set方法
方法
为对象提供行为的函数
对象的实例方法可以访问this和实例变量
Getter 和 Setter 是用于对象属性读和写的特殊方法。
使用 get 和 set 关键字实现 Getter 和 Setter ,能够为实例创建额外的属性
抽象方法
abstract class Doer { // 定义实例变量和方法 ... void doSomething(); // 定义一个抽象方法。 }
只定义方法,不进行实现
抽象方法只存在于抽象类中
extends继承抽象类
抽象类
定义:通过abstract修饰
抽象类不能被实例化
隐式接口
每个类都隐式定义了一个接口,包含了该类所有的实例成员及其实现的接口
可以通过implements实现一个或者多个接口
扩展类
使用extends扩展类
使用super来引用父类
重写类成员
子类可以重写实例方法,getter和setter
使用@override支出想要重写的成员
重写运算符
noSuchMethod()
当代码尝试调用不存在的方法或者实例变量时候,触发此方法
枚举类型
通过enum关键字定义
枚举类中每一个值都有一个index getter方法,返回对应的索引
枚举类型不能被子类化,混合或者实现
枚举类型不能被显示实例化
Mixin
Mixin是复用代码的一种途径,复用的类可以在不同层级,之间可以不存在继承关系
通过with后面跟一个或者多个混入的名称,来使用Mixin
类变量和方法
使用static实现类范围的变量和方法
静态变量直到他们被使用时才会被初始化
静态函数可以当做编译时常量使用
异常
Dart提供了Exception和Error类型,已经一些子类
抛出异常:throw
也可以throw 'beason is null'抛出任意对象
捕获异常:catch
try{}on Exception catch(e){}
使用On来制定类型,catch捕获
catch函数可以制定1-2个参数,第一个为异常对象,第二个为堆栈信息
可以使用rethrow重新抛出异常
finally
不论是否有异常,都会执行