1. 级联操作符
//常规操作
var paint = new Paint();
paint.strokeCap = StrokeCap.butt;
paint.strokeWidth = 1;
paint.style = PaintingStyle.fill;
//级联操作符
var paint1 = new Paint();
paint1..strokeCap = StrokeCap.butt
..strokeWidth = 1
..style = PaintingStyle.fill;
2.引用库冲突
2.1 as 关键字
同一个函数处于两个包中,同时我们都引用了这两个包,类似下面这样:
---->[utils/color_utils.dart]----
sin(double d){
}
---->[main.dart:5]----
import 'package:toly/utils/color_utils.dart';
import 'dart:math';
void main() {
sin(5);
}
---->[解决方案]----
import 'package:toly/utils/color_utils.dart' as myMath;
import 'dart:math';
void main() {
myMath.sin(5);
}
我们可以使用as关键字为我们自定义的重命名...
2.2 控制显隐部分导入
dart中支持引入的包中被隐藏的对象无法被外界访问
import 'package:toly/utils/color_utils.dart' show sin;//只显示sin函数
import 'package:toly/utils/color_utils.dart' hide sin;//只隐藏sin函数
2.3 权限访问控制
dart中没有private、protect、public等修饰符。默认的都是可以被访问的。那么是怎样控制权限访问的呢?
Dart中规定,名称前加下划线‘_’可以限制外部的访问,方法名、文件名、变量等均可
3. 异步
Dart 是一个单线程的语言,遇到有延迟的操作(IO/网络请求)时,线程中按照顺序执行的运算就会阻塞,UI卡顿甚至AAR,在Dart中我们可以将它放到延迟运算的队列中
3.1 async和await
//HTTP的get请求返回值为Future<String>类型,即其返回值未来是一个String类型的值
getData() async { //async关键字声明该函数内部有代码需要延迟执行
return await http.get(Uri.encodeFull(url), headers: {"Accept": "application/json"}); //await关键字声明运算为延迟执行,然后return运算结果
}
⚠️注意:这里retrun的并不是我们想要的数据结构类型,他的返回类型时一个await延迟执行的结果。在Dart中,有await标记的运算,其返回结构都是一个Future对象,所以我们可以这样写:
String data;
getData() async {
data = await http.get(Uri.encodeFull(url), headers: {"Accept": "application/json"}); //延迟执行后赋值给data
}
⚠️:
- await关键字必须在async函数内部使用
- 调用async函数必须使用await关键字
3.2 Future
上面我们提到了Future,那么什么是Future?
Dart是基于单线程模型的语言。在Dart中也有自己的进程机制 -- isolate。APP的启动入口main函数就是一个 ioslate,Dart中的ioslate之间无法直接共享内存,不同ioslate之间只能通过ioslate api进行通信。
Dart线程中有一个消息循环机制(event loop)和两个队列(event queue和microtask queue)
- event queue 事件队列 包含所有外来的事件:IO操作,按钮点击,绘图等消息。任意ioslate中新增的event都会放入消息队列中排队等待
- microtask queue 微任务队列 值在当前ioslate的任务队列中排队,优先级高于event queue
Dart代码的运行是从main函数开始的,main函数执行完后,Event looper
开始工作,Event looper
优先全部执行完Microtask queue
中的event
直到Microtask queue
为空时,才会执行Event queue
中的event,后者为空时才==可以==退出循环,这里强调“可以”而不是“一定”要退出,视场景而定。
Future就是一个event,我们在写下拉刷新时用到的RefreshIndicator的onRefresh函数也是一个event。每一个被await标记的句柄都是一个event
3.3 Stream
Stream
是Dart语言中的所谓异步数据序列的东西,简单理解,其实就是一个异步数据队列而已。我们知道队列的特点是先进先出的,Stream
也正是如此
后续会详细介绍
4. 异常
指定异常或多个异常捕获
使用 on关键字,可以指定捕获某一类异常
num str2Num(String str){
var result= 0;
try {
result= num.parse(str);
} on FormatException catch (e) {
print('发生Format异常:$e');
} on IOException catch(e){
print('发生IO异常:$e');
} finally {
print('最终会被执行的代码块');
}
return result;
}
网友评论