参考《Flutter实战》
独特语法:
1、可选命名参数
2、..(级联操作符)
3、?.(条件成员访问运算符)
4、??(判空赋值运算符)
一些比较特别的语法
var 可接收任何类型变量,一旦赋值,类型就确定
如:
var t ;
t = "hello world";
t = 100;(此时报错)
dynamic/Object
dynamic和object声明的变量可以赋值任何对象,而且可以随时改变
如:
dynamic a;
Object b;
a = "hello world";
b = "hi world";
// 下面的代码可以通过编译
a = 100;
b = 100;
dynamic和Object不同的地方在于,dynamic声明的对象编译器可以提供所有可能
变量的方法使用,而Object则不提供
如:接上面代码
a = "hello world";
b = "hi world";
print(a.length);
// 下面会报错
print(b.length);
final、const
被两者修饰的变量,都是常量,值只能被设置一次;不同在于final是第一次使用时被初始化
const是编译时常量
且使用者两个,变量类型可忽略
如:
final a = "hello world";
const b = "hi world";
函数:
Dart函数声明如果没有显式声明返回值类型时会默认当dynamic处理
如:
typedef bool CALLBACK();
// 返回类型为dynamic
isNoble(int number) {
return _nobleGases[number] != null;
}
// 需要传入bool函数
void test(CALLBACK cb) {
print(cb());
}
// 报错 isNoble不是bool类型
test(isNoble);
函数里面只有一个表达式,可以使用简写语法
如:
bool isNoble(int number) => _nobleGases[number] != null;
函数作为一个变量
var say = (str) {
print(str);
}
say("hello world");
函数作为参数传递
void dothing(var callback) {
callback();
}
dothing(() => print("xxx"));
可选的位置参数 []标记的参数为可选参数
如:
String say(String from,String msg,[String to]) {
var result = '$from says $msg';
if (to != null) {
result = '$result with a $to';
}
return result;
}
可选命名参数 使用{params1, params2,...}
如:
// 设置[flag]和[msg]标志
void sendMsg({bool flag,String msg}){
//...
}
//调用
sendMsg(flag:true,msg:"hello world");
异步支持:
Future(有点类似Rxjava):表示一个异步操作的最终结果,异步成功,就执行成功后的操作;失败就捕获错误或停止后续操作。
一个Future只会对应一个结果;Future所有API返回的还是Future对象,因此可用于链式调用
Future.then 接收异步结果 (对应Rxjava中的onNext())
Future.catchError 异步发生错误,可以捕获 (对应Rxjava中的onError())
Future.whenComplete 异步完成 (对应Rxjava中的onComplete(),不过在Rxjava中onError和onComplete只执行一个,此处whenComplete无论如何都会执行)
如:
Future.delayed(new Duration(seconds:2),()) {
return "hello world";
}).then((data){
// 正常执行结束会执行下面代码
print(data);
}).catchError((e){
// 执行过程发生异常会执行下面代码
print(e);
}).whenComplete((){
// 成功失败都会执行下面代码
print("done");
});
Future.wait 等待多个异步任务完成才进行操作(类似Rxjava中的flatMap,)
Future.wait([
// 2秒后返回结果
Future.delayed(new Duration(second:2),(){
return "hello";
}),
// 4秒后返回结果
Future.delayed(new Duration(second:4),(){
return "world";
})
]).then((results){
print(results[0] + reults[1]);
}).catchError((e){
print(e);
})
Async/await
async 用来表示函数异步,会返回一个Future对象,可以使用then方法添加回调函数
await后面是一个Future,表示等待该异步任务完成,异步完成后才往下走(阻塞)
如:传统的Future链式调用(模拟登陆)
// 定义异步任务
// 登陆
Future login(String username,String pwd) {}
// 获取用户信息
Future getUserInfo(int userId){}
// 保存用户信息
Future saveUserInfo(String userInfo){}
// 链式调用
Future("baiaj","123456").then((id){
return getUserInfo(id);
}).then((userInfo){
return saveUserInfo(userInfo);
}).then((e){
// 执行接下来操作
}).catchError((e){
// 错误处理
print(e);
})
使用async/await消除callback hell(回调地狱)
task() async {
int id = await login("baiaj","123456");
String userInfo = await getUserInfo(id);
await saveUserInfo(userInfo);
// 执行接下来操作
}
Stream
可用于接收异步事件数据,在执行异步任务时,可以通过多次触发成功或失败事件来传递结果数据和错误
常用于网络任务下载 ,文件读写等。
Stream.fromFutures([
// 1秒后返回结果
Future.delayed(new Duration(second:1),(){
return "hello 1";
}),
// 2秒后抛出一个异常
Future.delayed(new Duration(second:2),(){
return AssetitonError("Error");
}),
// 3秒后返回结果
Future.delayed(new Duration(second:3),(){
return "hello 3";
})
]).listen((data){
print(data);
},onError:(e){
print(e.message);
},onDone:(){
// 完成
});
操作符
.. 级联操作符(允许对同一对象执行一系列操作)
如:
// 普通调用
var button = getButton();
button.text = 'hello world';
button.classes.add('imp');
button.onClick.listen((e)=>window.alert('confirmed'));
// 级联操作
getButton()
..text = 'hello world'
..classes.add('imp')
..onClick.listen((e)=>windown.alert('confirmed'));
?.(条件成员访问运算符)
获取成员,但是左边的对象可以为null
如
UserInfo userInfo = new UserInfo();
String name = userInfo.name;
UserInfo userInfo2;
// 此时userInfo2为null,获取的name为null
name = userInfo?.name;
??(判空赋值运算符)
var a = null;
String b = "hello world";
// 如果a为null,则返回b,否则返回b
// 此处返回b
var result = a ?? b;
print(result);