!!!笔记源自b站课程
此处是课程链接
写在前面:
Dart有很多语法与其他语言比如C、Java都很像,有基础的友友们可以搭一下环境,简单看一下不同点即可。剩下的在开发实践中逐渐熟练~
文章目录
- Dart介绍 Win Mac上面分别搭建Dart环境
- Dart入口方法介绍 Dart打印 Dart注释 Dart变量 常量 命名规则
- Dart数据类型讲解
- Dart运算符
- 循环语句
- Dart List Set Map详解
- Dart中的函数 函数的定义 可选参数 默认参数 命名参数 箭头函数 匿名函数 闭包等
- Dart中的类 对象
- Dart中的类 静态成员 操作符 类的继承
- Dart中的抽象类 多态 和接口
- Dart中一个类实现多个接口 以及Dart中的Mixins
- 泛型 泛型方法 泛型类 泛型接口
- Dart中的库 自定义库、系统库、第三方库
- Dart 2.13之后的一些新特性Null safety、late关键字、空类型声明符?、非空断言!、required关键字
- Dart性能优化之常量、常量构造函数详解
Dart介绍 Win Mac上面分别搭建Dart环境
Dart介绍
Dart是由谷歌开发的计算机编程语言,它可以被用于web、服务器、移动应用和物联网等领域的开发。
Dart诞生于2011年,号称要取代JavaScript。但是过去的几年中一直不温不火。直到Flutter的出现现在被人们重新重视起来。
要学Flutter的话,我们首先得回Dart。
官网:https://flutter.cn/
Dart环境搭建:
要在我们本地开发Dart程序的话首先需要按照Dart Sdk
官方文档:https://dart.dev/get-dart
Dart开发工具:
Dart的开发工具有很多,比如IDEA、WebStorm、Atom、Vscode等。
这里我们主要讲解在Vscode中配置Dart。
1、找到vscode插件按照dart
2、找到vscode插件按照code runner Code Runner可以运行我们的文件
Dart入口方法介绍 Dart打印 Dart注释 Dart变量 常量 命名规则
入口方法的两种定义方式
Dart变量
dart是一个强大的脚本类语言,可以不预先定义变量类型,自动会类型推导
dart中定义变量可以通过var关键字来声明变量
注意:var后就不要写类型,写了类型就不要var
Dart的命名规则:
1、变量名称必须由数字、字母、下划线和美元符组成
2、注意:标识符开头不能是数字
3、标识符不能是保留字和关键字
4、变量的名字是区分大小写的
5、标识符一定要见名思意:变量名称建议用名词,方法名称建议用动词。
Dart数据类型讲解
Dart中文支持以下数据类型:
常用数据类型:
Numbers(数值):
int
double
String(字符串):
String
Booleans(布尔):
bool
List(数组):
在Dart中,数组是列表对象,所以大多数人只是称他们为列表
Maps(字典):
通常来说,Map是一个键值对相关的对象。键和值可以是任何类型的对象,每个键只出现一次
字符串类型
1、字符串定义的几种方式
!!三个单引号/双引号可以打印多行字符
2、字符串的拼接
数值类型
1、int
2、double 既可以是整型也可以是浮点型
3、运算符
±*/ 和其他语言一样
布尔类型
true
false
list集合
1、第一种定义List的方式
2、第二种定义List的方式 指定类型
3、第三种定义List的方式 增加数据
!!中括号创建可以改变长度 list.filled是固定长度 不可以改变。
Map
第一种定义Map的方式
第二种定义Map的方式
Dart判断数据类型
is关键词来判断数据类型
Dart运算符
Dart运算符
算术运算符
关系运算符
逻辑运算符
赋值运算符
条件表达式
!!a为空把10赋值给b 否则把a赋值给b
Dart类型转换
1、Number与String类型之间的转换
Number转换成String toString()
Stirng转换成Number parse()
2、其他类型转换成Booleans类型
isEmpty():判断字符串是否为空
循环语句
++ –
++自增1
–自减1
放前面先计算后赋值
放后面先赋值后计算
for基本语法
for(int i=1;i<=100;i++){
print(i);
}
while、do while 基本语法
while(表达式/循环条件){
}
do{
语句/循环体
}while(表达式/循环条件);
break和continue
break语句功能:
1、在switch语句中使流程跳出switch结构
2、在循环语句中使流程跳出当前循环,遇到break,循环终止,后面代码也不会执行
强调!!
1、如果在循环中已经执行了break语句,就不会执行循环体中位于break后的语句。
2、在多层循环中,一个break语句只能向外跳出一层
break可以用在switch case 中,也可以用在for循环和while循环中
continue语句的功能:
只能在循环语句中使用,使本次循环结束,进行下一次循环
continue可以在for循环以及while循环中使用,但是不建议在while循环中使用,容易造成死循环。
Dart List Set Map详解
List里面常用的属性和方法:
常用属性:
length 长度
reversed 翻转
isEmpty 是否为空
isNotEmpty 是否不为空
常用方法:
add 增加
addAll 拼接数组
indexOf 查找 传入具体值
remove 删除 传入具体值
removeAt 删除 传入索引值
fillRange 修改
insert(index,value) 指定位置插入
insertAll(index,list) 指定位置插入list
toList() 其他类型转换成List
join() list转换成字符串
split() 字符串转换成List
forEarch
map
where
any
every
set
用它最主要的功能就是去除数组重复内容
Set是没有顺序且不能重复的集合,所以不能通过索引取获取值
Map
映射(Maps)是无序的键值对:
常用属性:
keys 获取所有的key值
values 获取所有的value值
isEmpty 是否为空
isNotEmpty 是否不为空
常用方法:
remove(key) 删除指定key的数据
addAll({…}) 合并映射 给映射内增加属性
containsValue 查看映射内的值 返回true/false
forEach
map
where
any
every
Dart中的函数 函数的定义 可选参数 默认参数 命名参数 箭头函数 匿名函数 闭包等
内置方法/函数
print();
自定义方法:
自定义方法的基本格式:
返回类型 方法名称(参数1,参数2,...){
方法体
return 返回值;
}
可选参数
放在最后面的[]中
默认参数
如果不传参的话 就是默认参数
命名参数
放在大括号中 传参的命名必须和括号中一样
闭包
1、全局变量的特点:全局变量常驻内存、全局变量污染全局
2、局部变量的特点:不常驻内存会被垃圾机制回收、不会污染全局
想实现的功能:
1、常驻内存
2、不污染全局
产生了闭包,闭包可以解决这个问题
闭包:函数嵌套函数,内部函数会调用外部函数的变量或参数
闭包的写法:函数嵌套函数 并return里面的函数,这样就形成了闭包。
Dart中的类 对象
面向对象编程(OOP)的三个基本特征是:封装、继承、多态
封装:
封装是对象和类概念的主要特性。封装,把客观事物封装成抽象的类,并且把自己的部分属性和方法提供给其他对象使用。
继承:
面向对象编程(OOP)语言的一个主要功能就是:继承。继承是指这样一种能力,它可以使用现有类的功能
多态:
允许子类类型的指针赋值给父亲类型的指针,同一个函数调用会有不同的执行效果。
Dart中所有的东西都是对象,所有的对象都继承自Object类。
Dart是一门使用类和单继承的面向对象语言,所有的对象都是类的实例,并且所有的类都是Object的子类。
一个类通常由属性和方法组成。
Dart中的类 静态成员 操作符 类的继承
Dart中的静态成员:
1、使用static关键字来实现类级别的变量和函数
2、静态方法不能访问非静态成员,非静态方法可以访问静态成员
Dart中的对象操作符
? 条件运算符怒
as 类型转换
is 类型判断
… 级联操作(连缀)
Dart中类的继承
1、子类使用extends关键字来继承父类
2、子类会继承弗雷里面可见的属性和方法 但是不会继承构造函数
3、子类能复写父类的 方法 getter和setter
覆写父类的方法
Dart中的抽象类 多态 和接口
Dart中抽象类:
Dart抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口。
1、抽象类通过abstract关键字来定义
2、Dart中的抽象方法不能用abstract声明,Dart中没有方法体的方法我们成为抽象方法
3、如果子类继承抽象类必须得实现里面的抽象方法
4、如果把抽象类当作接口实现的话必须得实现抽象类里面定义的所有属性和方法
5、抽象类不能被实例化,只能继承它的子类可以
ectends抽象类和implements的区别:
1、如果要复用抽象类里面的方法,并且要用抽象方法约束自类的话我们就用extends继承抽象类
2、如果只是把抽象类当作标准的话我们就用implements实现抽象类
Dart中的多态:
允许将子类类型的指针赋值给父类类型的指针,同一个函数调用会有不同的执行效果。
子类的实例赋值给父类的引用。
多态就是父类定义一个方法不去实现,让继承他的子类取实现,每个子类有不同的表现。
接口:
和Java一样,dart也有接口,但是和Java还是有区别的。
首先,dart的接口没有interface关键字定义接口,而是普通类或抽象类都可以作为接口被实现。
同样使用implements关键字进行实现。
但是dart的接口有点奇怪,如果实现的类是普通类,会将普通类和抽象中的属性的方法全部需要覆写一遍。
而因为抽象类可以定义抽象方法,普通类不可以,所以一般如果要实现像Java接口那样的方式,一般会使用抽象类。
建议使用抽象类定义接口。
Dart中一个类实现多个接口 以及Dart中的Mixins
一个类实现多个接口:
mixins:
mixins的中文意思是混入,就是在类中混入其他功能。
在Dart中可以使用mixins实现类似多继承的功能。
因为mixins使用的条件,随着Dart版本一直在变,这里讲的是Dart2.x中使用mixins的条件:
1、作为mixins的类只能继承自Object,不能继承其他类
2、作为mixins的类不能有构造函数
3、一个类可以mixins多个mixins类
4、mixins绝不是继承,也不是接口,而是一种全新的特性。
泛型 泛型方法 泛型类 泛型接口
通俗理解:泛型就是解决类、接口、方法的复用性、以及对不特定数据类型的支持(类型校验)
Dart中的泛型接口
实现数据缓存的功能:有文件缓存和内存缓存,内存缓存和文件缓存按照接口约束实现。
1、定义一个泛型接口 约束实现它的子类必须有getByKey(key)和setByKey(key,value)
2、要求setByKey的时候的value的类型和实例化子类的时候指定的类型一致
Dart中的库 自定义库、系统库、第三方库
前面结束Dart基础知识的时候基本上都是在一个文件里面编写Dart代码的,但实际开发中不可能这么简单
在Dart中,库的使用是通过import关键字引入的。
library指令可以创建一个库,每个Dart文件都是一个库,即使没有使用library指令来指定。
Dart中的库主要有三种
1、我们自定义的库
import ’lib/xxx.dart’.
2、系统内置库
import ‘dart:math’;
import ‘dart:io’;
import ‘dart:convert’;
3、Pub包管理系统中的库
https://pub.dev/packages
https://pub.flutter-io.cn/packages
https://pub.dartlang.org/flutter/
1、需要在自己项目的根目录新建一个pubspec.yaml
2、在pubspec.yaml文件 然后配置名称、描述、依赖等信息
3、然后允许pub get获取包下载到本地
4、项目中引入库 import ‘package:http/http.dart’ as http; (看文档使用)
Dart中导入自己本地库
导入系统内置库 math库
导入系统内置库实现请求数据
async和await:
这两个关键字的使用只需要记住两点:
只有async方法才能使用await关键字调用方法
如果调用别的async方法必须使用await关键字
async是让方法变成异步。
await是等待异步方法执行完成。
pub包管理系统:
1、从下面网址找到要用的库
https://pub.dev/packages
https://pub.flutter-io.cn/packages
https://pub.dartlang.org/flutter/
2、创建一个pubspec.yaml文件,内容如下
3、配置dependencies
4、运行put get获取远程库
5、看文档引入库使用
部分库导入
如果只需导入库的一部分,有两种模式:
1、只导入需要的部分,使用show关键字
2、隐藏不需要的部分,使用hide关键字
延迟加载
也称为懒加载,可以在需要的时候在进行加载。
懒加载的最大好处就是可以减少APP启动时间
懒加载使用deferred as关键字来指定,如下列例子:
当需要使用的时候,需要使用loadLibrary()方法来加载
Dart 2.13之后的一些新特性Null safety、late关键字、空类型声明符?、非空断言!、required关键字
Null safety
翻译成中文的意思就是空安全。
它可以帮助开发者避免一些在日常开发中很难被发现的错误,并且额外的好处是可以改善性能。
Flutter2.2.0之后的版本都要求使用null safety
?可空类型
!类型断言
late关键字
late关键字主要用于延迟初始化
required关键字
最开始@required是注解
现在他已经作为内置修饰符
主要用于允许根据需要标记任何命名参数(函数或者类),使得他们不为空。
Dart性能优化之常量、常量构造函数详解
Dart常量:
final和const修饰
const声明的常量是在编译时确定的,永远不会改变
final声明的常量允许声明后再赋值,赋值后不可改名,final声明的变量是在运行时确定的
final不仅有const的在编译时常量的特性,最重要的是它是运行时常量,并且final是惰性初始化
identical函数
常量构造函数总结:
1、常量构造函数需以const关键字修饰
2、它的类不能有任何非final字段(我们在编译时“知道”的值不能在以后更改)
3、构建常量实例必须使用定义的常量构造函数
4、如果实例化时不加const修饰符,即使调用的是常量构造函数,实例化的对象也不是常量实例
5、const构造函数不能有主体(没有语句执行!)