Dart和JavaScript的很相似,但是Dart是强类型语言,JavaScript是弱类型语言。
一:变量声明
1:var
var
:可以接收任何类型的变量,但var的变量一旦赋值,类型便会确定,则不能再改变其类型
var i = 100;
i = "stt"; //在js中,这样没有问题,但是在Dart中,直接报错
console.log(i);
2:dynamic和Object
Object
是Dart
所有对象的根基类,像OC
中的NSObject
。
dynamic
是声明变量的关键词,该变量可以赋值任意对象,像OC
中的id
。
dynamic
与Object
他们声明的变量可以在后期改变赋值类型
//下面的这两种写法是完全没有问题
dynamic i = 100;
i = "str";
Object o = 100;
o = "str";
dynamic
与Object
的区别
dynamic声明的对象编译器会提供所有可能的组合,
Object声明的对象只能使用Object的属性与方法, 否则编译器会报错。
i.length; //没有问题
i.lengthODtestsggg; //随便写一个不存在的方法,编译器不会报错,运行时报错,dynamic特性,它认为你实现了这个方法,等到运行时调用发现没有,才会crash
o.length; //编译器会报错,因为Object没有方法length。
3:final和const
final和const修饰的变量不能再更改,两者区别在于:const 变量是一个编译时常量,final变量在第一次使用时被初始化。
被final或者const修饰的变量,变量类型可以省略
final String name = "ob";
//可以省略String这个类型声明
final str = "ss";
const str2 = "ss";
二:函数
Dart是一种真正的面向对象的语言,所以即使是函数也是对象,并且有一个类型Function。这意味着函数可以赋值给变量或作为参数传递给其他函数,这是函数式编程的典型特征。
void main() {
print("sssss");
}
返回值 如果没有显示声明返回值,那么默认返回值是dynamic
test(i){
i = 10;
print(i);
return 10;
}
对于只包含一个表达式的函数,可以使用简写语法
void main() => print("ssf");
函数作为变量:因为函数是Function类型,继承Object,所以函数可以作为变量。
var name = (name) {
print(name);
}
name("ob");
同样的,函数也就可以作为参数了
void ob_test(){
print("ob");
}
void ob_func(dynamic obj){
obj(); //如果是函数,那么调用改函数
}
ob_func(ob_test);
可选的参数:可以传可以不传
void ob_test(String name, int age, [String key]){
print(name);
print(age);
if (key != null){
print(key);
}
}
ob_test("ob",22,"北京的"); //"北京的"可以写可以不写
三:异步支持
Future.delayed(new Duration(seconds: 2),(){
//return "hi world!";
throw AssertionError("Error");
}).then((data){
//执行成功会走到这里
print(data);
}).catchError((e){
//执行失败会走到这里
print(e);
}).whenComplete((){
//无论成功或失败都会走到这里
});
有些时候,我们需要等待多个异步任务都执行结束后才进行一些操作,比如我们有一个界面,需要先分别从两个网络接口获取数据,获取成功后,我们需要将两个接口数据进行特定的处理后再显示到UI界面上,应该怎么做?答案是Future.wait,它接受一个Future数组参数,只有数组中所有Future都执行成功后,才会触发then的成功回调,只要有一个Future执行失败,就会触发错误回调。下面,我们通过模拟Future.delayed 来模拟两个数据获取的异步任务,等两个异步任务都执行成功时,将两个异步任务的结果拼接打印出来,代码如下:
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);
});