变量声明
变量 描述 例子 var 可以接受任何类型,但是变量一旦赋值,将无法改变其类型 var i=7 dynamic
可以接受任何类型,变量赋值后还能够改变类型,dynamic
声明的对象编译器会提供所有可能的组合
dynamic a;
Object b;
main() {
a = "";
b = "";
printLengths();
}
printLengths() {
// no warning
print(a.length);
// warning:
// The getter 'length' is not defined for the class 'Object'
print(b.length);
}
Object 可以接受任何类型,变量赋值后还能够改变类型,Object
声明的对象只能使用 Object 的属性与方法, 否则编译器会报错 final final
变量只能被设置一次,被final
修饰的变量,变量类型可以省略,final
变量在第一次使用时被初始化 //可以省略String这个类型声明
final str = "hi world";
const const变量只能被设置一次,被const
修饰的变量,变量类型可以省略,const
变量是一个编译时常量 const str1 = "hi world";
函数
函数声明
bool isNoble(int atomicNumber) {
return _nobleGases[atomicNumber] != null;
}
Dart 函数声明如果没有显式声明返回值类型时会默认当做dynamic
处理,注意,函数返回值没有类型推断:
typedef bool CALLBACK();
//不指定返回类型,此时默认为dynamic,不是bool
isNoble(int atomicNumber) {
return _nobleGases[atomicNumber] != null;
}
void test(CALLBACK cb){
print(cb());
}
//报错,isNoble不是bool类型
test(isNoble);
函数入参
可选的位置参数
包装一组函数参数,用[]标记为可选的位置参数,并放在参数列表的最后面
String say(String from, String msg, [String device]) {
var result = '$from says $msg';
if (device != null) {
result = '$result with a $device';
}
return result;
}
//不带可选参数调用这个函数的例子
say('Bob', 'Howdy'); //结果是: Bob says Howdy
//带可选参数
say('Bob', 'Howdy', 'smoke signal'); //结果是:Bob says Howdy with a smoke signal
可选的命名参数
定义函数时,使用{param1, param2, …},放在参数列表的最后面,用于指定命名参数。例如:
//设置[bold]和[hidden]标志
void enableFlags({bool bold, bool hidden}) {
// ...
}
调用函数时,可以使用指定命名参数。例如:paramName: value
enableFlags(bold: true, hidden: false);
异步操作
Future
与 JavaScript 中的Promise
非常相似,表示一个异步操作的最终完成(或失败)及其结果值的表示。Future
相当于Promise
API 描述 例子 备注 Future.then 异步成功进入的函数
Future.delayed(new Duration(seconds: 2),(){
return "hi world!";
}).then((data){
print(data);
});
Future.catchError 异步失败进入的函数
并不是只有 catchError
回调才能捕获错误,then
方法还有一个可选参数onError
,我们也可以它来捕获异常:
Future.delayed(new Duration(seconds: 2),(){
//return "hi world!";
throw AssertionError("Error");
}).then((data){
//执行成功会走到这里
print("success");
}).catchError((e){
//执行失败会走到这里
print(e);
});
Future.delayed(new Duration(seconds: 2), () {
//return "hi world!";
throw AssertionError("Error");
}).then((data) {
print("success");
}, onError: (e) {
print(e);
});
Future.whenComplete 不论成功与否都会进入这个函数(可以用来关机加载框)
Future.delayed(new Duration(seconds: 2),(){
//return "hi world!";
throw AssertionError("Error");
}).then((data){
//执行成功会走到这里
print(data);
}).catchError((e){
//执行失败会走到这里
print(e);
}).whenComplete((){
//无论成功或失败都会走到这里
});
Future.wait 接受一个Future
数组参数,只有数组中所有Future
都执行成功后,才会触发then
的成功回调,只要有一个Future
执行失败,就会触发错误回调
Future.wait([
// 2秒后返回结果
Future.delayed(new Duration(seconds: 2), () {
return "hello";
}),
// 4秒后返回结果
Future.delayed(new Duration(seconds: 4), () {
return " world";
})
]).then((results){
print(results[0]+results[1]);
}).catchError((e){
print(e);
});
//执行上面代码,4秒后你会在控制台中看到“hello world”。
Async/await
Dart 中的async/await
和JavaScript中的async/await
功能和用法是一模一样的
Stream
Stream
也是用于接收异步事件数据,和Future
不同的是,它可以接收多个异步操作的结果(成功或失败)。 也就是说,在执行异步任务时,可以通过多次触发成功或失败事件来传递结果数据或错误异常。 Stream
常用于会多次读取数据的异步任务场景,如网络内容下载、文件读写等。举个例子
Stream.fromFutures([
// 1秒后返回结果
Future.delayed(new Duration(seconds: 1), () {
return "hello 1";
}),
// 抛出一个异常
Future.delayed(new Duration(seconds: 2),(){
throw AssertionError("Error");
}),
// 3秒后返回结果
Future.delayed(new Duration(seconds: 3), () {
return "hello 3";
})
]).listen((data){
print(data);
}, onError: (e){
print(e.message);
},onDone: (){
});
// 结果如下
I/flutter (17666): hello 1
I/flutter (17666): Error
I/flutter (17666): hello 3