参考:https://zhuanlan.zhihu.com/p/83387088
https://zhuanlan.zhihu.com/p/83781258
一.库--------------library
和python类似,可以有as
import 'lib/student/student.dart' as Stu;
1.导入-------------import
import '库所在的uri';//Uniform Resource Identifier统一资源标识符,注意有引号
URI分为三种
dart标准版 | dart:io、dart:html、dart:math、dart:core |
相对路径 | 自定义的library,如 |
Pub库 | 前缀package, 如 |
2.显示和隐藏-----------show&hide
import 'lib/student/student.dart' show Student, Person;//只显示student和Person
import 'lib/student/student.dart' hide Person;//隐藏Person
3.定义
library math;
4.库的打包
sum库
int sum(int num1, int num2) {
return num1 + num2;
}
dateFormat库
String dateFormat(DateTime date) {
return "2020-12-12";
}
这里的export有点像c++里的extern
library utils;
export "mathUtils.dart";
export "dateUtils.dart";
之后我们只要导入utils就能调用sum和dateFormat了
import "lib/utils.dart";
main(List<String> args) {
print(sum(10, 20));
print(dateFormat(DateTime.now()));
}
二.异步
dart是单线程的,实现异步靠的是事件循环
事件循环会执行微任务列表和事件列表中的事件,其中微任务优先级高于事件列表任务
1.future
future是一个实现异步的API,执行future内部的操作是不占用线程时间,等到完成操作后会返回一个值或者抛出异常。
.then()是成功回调函数
.catchError是错误回调函数
Future<String> getNetworkData() {
return Future<String>(() {
sleep(Duration(seconds: 3));//这里的等待不会造成阻塞
// 不再返回结果,而是出现异常
// return "network data";
throw Exception("网络请求出现错误");
});
}
执行完后如果正确就执行then里的内容否则执行catchError
import "dart:io";
main(List<String> args) {
print("main function start");
var future = getNetworkData();
future.then((value) {
print(value);
}).catchError((error) { // 捕获出现异常时的情况
print(error);
});
print(future);
print("main function end");
}
2.future补充
Future.value(value)
直接获取一个完成的future,会直接调用then回调函数
main(List<String> args) {
print("main function start");
Future.value("哈哈哈").then((value) {//加到事件队列里
print(value);
});
print("main function end");
}
执行结果
main function start
main function end
哈哈哈
Future.error(object)
Future.delayed(时间, 回调函数)
main(List<String> args) {
print("main function start");
Future.delayed(Duration(seconds: 3), () {
return "3秒后的信息";
}).then((value) {//3秒后再执行
print(value);
});
print("main function end");
}
3.await和async
之前的方法是构造一个对象,然后再执行回调函数。但是有时候我们希望用同步的形式去实现异步,也就是直接返回一个我们想要的值并且不占用线程
//函数必须用async(异步)修饰,返回是一个future对象
Future<String> getNetworkData() async {
//在这个构造函数前面加上await(等一下,等运行的结果的意思),将返回值给result
var result = await Future.delayed(Duration(seconds: 3), () {
return "network data";
});
return "请求到的数据:" + result;
}
main(List<String> args) {
print("main function start");
print(getNetworkData());//直接打印结果,而之前是打印对象
print("main function end");
}
4.创建微任务
import "dart:async";
main(List<String> args) {
scheduleMicrotask(() {
print("Hello Microtask");
});
}
5.Isolate
我们已经知道dart是单线程的,这个线程有自己可以访问的内存空间以及事件循环,我们就可以将这个空间系统称之为一个Isolate
Iso之间不共享任何资源,只能依靠信息机制通信
创建:
import "dart:isolate";
main(List<String> args) {
Isolate.spawn(foo, "Hello Isolate");//spawn---产卵
}
void foo(info) {
print("新的isolate:$info");
}
单向通信:
先创建一个管道再将管道传给创建的Isolate,再用管道的监听功能监听创建的Isolate返回的信息
监听到了就关掉管道。此为单项通信(创建的Isolate--->主Isolate)
import "dart:isolate";
main(List<String> args) async {
// 1.创建管道
ReceivePort receivePort= ReceivePort();
// 2.创建新的Isolate
Isolate isolate = await Isolate.spawn<SendPort>(foo, receivePort.sendPort);
// 3.监听管道消息
receivePort.listen((data) {
print('Data:$data');
// 不再使用时,我们会关闭管道
receivePort.close();
// 需要将isolate杀死
isolate?.kill(priority: Isolate.immediate);
});
}
void foo(SendPort sendPort) {
sendPort.send("Hello World");
}
双向通信:
flutter提供了支持并发计算的compute函数,内部封装了双向通信和Isolate的创建
main(List<String> args) async {
int result = await compute(powerNum, 5);
print(result);
}
int powerNum(int num) {
return num * num;
}