参考资料:中文网
- 申明变量
var:默认为null
final:只能初始化一次;
const:常量,编译时就赋值了,不能修改;
- 内置类型
1. 数值型
a,int
b,double
运算符号:
1. + 加
2. - 减
3. * 乘
4. / 除
5. ~/ 取整
6. % 取余
2,字符串
运算符:+,*,==,[]
插值表达式:${expression}
常用属性:length(包括里面的空格),isEmpty,isNotEmpty
常用方法:
1. contains();
2. subString();
3. startsWith();
4. endsWith();
5. indexOf();
6, lastIndexOf();
3, 布尔类型
bool:true、false
4,list
常用方法:
1. add();
2. insert();
3. remove();
4. clear();
5. sort();
6. sublist();
7. shuffle();
8. asMap();
9. forEach();
函数/方法 Function
方法都有返回值:没有指定的时候默认返回null;
箭头语法:=>
如:(){return expression}
替换为:=> rexpression;
可选参数
- 可选命名参数:{param1,param2,…};
- 可选位置参数:[param1,param2,…];
具体代码示例
void main(){
printPerson1("孙悟空",address: "花果山");
printPerson1("孙悟空",age: 10000);
printPerson1("孙悟空",age: 10000,address: "花果山");
printPerson2("猪八戒",1000,"高老庄");
}
printPerson1(String name,{int age,String address}){
print("name is $name,age is $age, and address is $address");
}
printPerson2(String name,[int age,String address]){
print("name is $name,age is $age, and address is $address");
}
结果:
name is 孙悟空,age is null, and address is 花果山
name is 孙悟空,age is 10000, and address is null
name is 孙悟空,age is 10000, and address is 花果山
name is 猪八戒,age is 1000, and address is 高老庄
可选命名参数更加灵活,{} 内的参数可以写部分,也可以写全部;
注意:
dart中判断内容相等 ==
java中判断内容相等 equals
赋值运算符
??= 含义:如果左边的为空null,没有赋值,则把右边的值赋给他;
eg: var a = 5;
a ??=10;
print(a);// result: 5
-------------
var a;
a ??10;
print(a);//result:10
3. 匿名内部类
规则 (){}
可做为参数,也可赋值给变量
void main(){
var list = ["a","b","c"];
print(changeValues(list, (a){
return a*3;
}));
}
List changeValues(List list,String func(s)){
for(int i=0;i<list.length;i++){
list[i] = func(list[i]);
}
return list;
}
特点-注意点
变量的声明
var变量一旦赋值,类型就会确定,后面不可改变类型
如:var a = "hello world";
a = 10;// 不可再赋值整数类型,因为前面是String
但是通过Object 与 dynamic 关键字声明的变量可以改变
一切皆对象
函数,null,都是Object的子类
异步
有两个:Future Stream
Future
代码示例如下: 一个延时两秒打印 操作
Future.delayed(new Duration(seconds: 2),(){
//return "hi world!";
throw AssertionError("Error");
}).then((data){
//执行成功会走到这里
print("success");
}).catchError((e){
//执行失败会走到这里
print(e);
});
无论是否执行catch,类似于java里面的final
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都执行完才执行后面的操作
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);
});
消除链式回调
登录-> 获取id->根据id获取用户信息->保存用户信息
//先分别定义各个异步任务
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);
});
使用 async 、await消除链式调用带来的回调
task() async {
try{
String id = await login("alice","******");
String userInfo = await getUserInfo(id);
await saveUserInfo(userInfo);
//执行接下来的操作
} catch(e){
//错误处理
print(e);
}
}
stream
- 用于接收异步事件数据;
- 与Future区别:可以多个异步操作的结果(是否有异常,成功失败都行);
- 常用于多次读写数据的异步任务场景:网络下载文件,文件读写等;
示例代码如下
void main(){
Stream.fromFutures([
Future.delayed(new Duration(seconds: 1),(){
return "-a-";
}),
Future.delayed(new Duration(seconds: 2),(){
throw AssertionError("this is a exception");
}),
Future.delayed(new Duration(seconds:3 ),(){
return "-c-";
})])
.listen((data){
print("listen data:"+data);
},onError: (e){
print("this is error:"+e.toString());
},onDone: (){
print("stream is done!");
});
}
结果:
listen data:-a-
this is error:Assertion failed
listen data:-c-
stream is done!
|
请发表评论