1. ?.和??和??=
A?.B表示A如果为null则返回null,A不为null返回A.B
A??B表示A如果为null则返回B,否则返回A,和java或者c中的 A!=null? A : B 同义
A??=B表示A如果为null则将B赋值给A
2.mixin关键字
mixin和abstract class 代表的意思差不多,但是区别是mixin的类可以有默认的方法实现
mixin A on B,表示A只能在B类或者B的子类上被实现
class B with A,C,D,表示B实现了A、C、D三个类的接口,假如A、C、D中存在相同的方法,则在B中调用时会调用D中的该方法。
3.Timer.run((){})和Timer.run(Duration(), (){})
4.异步、多线程
普通轻量任务用
Future<String>( () async {
await Future.delayed(Duration(seconds: 5)); //故意等待5秒(只模拟未知时间,并没有多大计算量)
return "一个假设的计算结果";
}).then((value) {
print("${DateTime.now()} 返回 :$value");
});
print("${DateTime.now()} 这里没有等待");
或者
SchedulerBinding.instance.scheduleTask<String>( () {
return "一个假设的计算结果";
}, Priority.idle)
.then( (value) {
print("返回 :$value");
});
特别耗时的任务用Isolate(类似java Thread)
void main() {
ReceivePort port = ReceivePort();//dart线程间不共享内存,需要用port传递数据
Isolate.spawn(test, port.sendPort).then( (isolate) {
port.listen((data) {
print("$data"); //接收子线程的数据
port.close();
isolate.kill();
});
});
}
void test(SendPort port){
port.send('改一下');
}
或者简化版compute(flutter SDK内置的Isolate封装方法)
void main() {
compute(test,'www.baidu.com');
}
void test(String url){
print(url);
}
5.dart适合rx的语法,异步请求可使用then来依次完成多个请求
HttpService.getInstance()
.getAppService()
.getUser()//异步
.then((result){
//todo异步再处理
})
.then((){
//todo最终结果
});...