var
赋值的时候确定类型 后面不能更改类型
Dynamic
可以接受任何类型 前面赋值一种类型 后面还可以修改类型
Object
基类 dart中都是类 可以接受任何变量
可选的位置参数 用[]
标记为可选的位置参数,并放在参数列表的最后面
//定义
String say(String from, String msg, [String device]) {
}
//调用
say('Bob', 'Howdy');
say('Bob', 'Howdy', 'smoke signal');
可选的命名参数 定义函数时,使用{param1, param2, …}
,放在参数列表的最后面,用于指定命名参数
//定义
void enableFlags({bool bold, bool hidden}) {
// ...
}
//调用
enableFlags(bold: true, hidden: false);
Dart 是不支持多继承的,但是它支持 mixin,简单来讲 mixin 可以 “组合” 多个类
定义了几个 mixin,然后通过 with 关键字将它们组合成不同的类 多个mixin 中有同名方法,with 时,会默认使用最后面的 mixin 的,mixin 方法中可以通过 super 关键字调用之前 mixin 或类中的方法
mixin 多继承demo
class Person {
say() {
print('say');
}
}
mixin Eat {
eat() {
print('eat');
}
}
mixin Walk {
walk() {
print('walk');
}
}
mixin Code {
code() {
print('key');
}
}
class Dog with Eat, Walk{}
class Man extends Person with Eat, Walk, Code{}
一个异步操作的最终完成(或失败)及其结果值的表示
wait 数组内请求结束后在执行then whenComplete
Future.wait([
//delayed 模拟网络请求
Future.delayed(Duration(seconds: 1), () {
print("1111");
return "111";
}),
Future.delayed(Duration(seconds: 1), () {
print("2222");
return "222";
})
]).then((value) {
print("value====$value");
}).catchError((error) {
print("error===$error");
}).whenComplete(() {
print('await finish');
});
Future.delayed(Duration(seconds: 2), () {
return 'hello $_counter';
// throw AssertionError("Error");
}).then((value) {
print("value===$value");
}, onError: (error) {
print(error);
}).catchError((e) {
print("e==$e");
}).whenComplete(() {
print('finish');
});
解决嵌套地狱
//先分别定义各个异步任务
Future<String> login(String userName, String pwd){
//用户登录
};
Future<String> getUserInfo(String id){
//获取用户信息
};
Future saveUserInfo(String userInfo){
// 保存用户信息
};
解决嵌套地狱的两种方式
方式一
login("alice","******").then((id){
return getUserInfo(id);
}).then((userInfo){
return saveUserInfo(userInfo);
}).then((e){
//执行接下来的操作
}).catchError((e){
//错误处理
print(e);
});
方式二任务依赖(可以实现类似同步代码的方式实现异步)
task() async {
try{
String id = await login("alice","******");
String userInfo = await getUserInfo(id);
await saveUserInfo(userInfo);
//执行接下来的操作
} catch(e){
//错误处理
print(e);
}
}
*用来表示函数是异步的,定义的函数会返回一个Future对象,可以使用 then 方法添加回调函数。
- 后面是一个Future,表示等待该异步任务完成,异步完成后才会往下走;await必须出现在 async 函数内部
不同的是,它可以接收多个异步操作的结果,常用于会多次读取数据的异步任务场景,如网络内容下载、文件读写
Stream.fromFutures([
// 1秒后返回结果
Future.delayed(Duration(seconds: 1), () {
return "hello 1";
}),
// 抛出一个异常
Future.delayed(Duration(seconds: 2),(){
throw AssertionError("Error");
}),
// 3秒后返回结果
Future.delayed(Duration(seconds: 3), () {
return "hello 3";
})
]).listen((data){
print(data);
}, onError: (e){
print(e.message);
},onDone: (){
});