1、dynamic 动态
2、final 最终的 const 常量 var变量
final和const的区别:
区别一:final 要求变量只能初始化一次,并不要求赋的值一定是编译时常量,可以是常量也可以不是。而 const 要求在声明时初始化,并且赋值必需为编译时常量。
区别二:final 是惰性初始化,即在运行时第一次使用前才初始化。而 const 是在编译时就确定值了。
3、内建数据类型
Dart有如下几种内建的数据类型:
numbers
strings
booleans
list(或者是arrays)
map
runes(UTF-32字符集的字符)
symbols 下面用一段代码来演示以上各类数据类型:
类型为空
int int? 可为空
if (i != null) {
print( i! * 9); // i!因为判过空,可以将i显式为非空变量
}
调用语法时 fun?.call() fun为空就不继续调用
4、函数
1.声明函数: 当Dart函数声明如果没有显式声明返回值类型时会默认当做dynamic处理,注意,函数返回值没有类型推断;
2.对于只包含一个表达式的函数,可以使用简写语法: =>
3.函数作为变量
4.函数作为参数
5.可选的位置参数
包装一组函数参数,用[]标记为可选的位置参数,并放在参数列表的最后面
6.可选的命名参数
定义函数时,使用{param1, param2, …},放在参数列表的最后面,用于指定命名参数。
5、运算符
// is运算符用于判断一个变量是不是某个类型的数据
// is!则是判断变量不是某个类型的数据
var s = "hello";
print(s is String); // true
var num = 6;
print(num is! String); // true
// ~/才是取整运算符,如果使用/则是除法运算,不取整
int k = 1;
int j = 2;
print(k / j); // 0.5
print(k ~/ j); // 0
// as运算符类似于Java中的cast操作,将一个对象强制类型转换
(emp as Person).teach();
// ??=运算符 如果 ??= 运算符前面的变量为null,则赋值,否则不赋值
var param1 = "hello", param2 = null;
param1 ??= "world";
param2 ??= "world";
print("param1 = [图片上传失败...(image-1a395-1640058440697)]
param2"); // param2 = world
// ?.运算符
var str1 = "hello world";
var str2 = null;
print(str1?.length); // 11
print(str2?.length); // null
print(str2.length); // 报错
}
…运算符(级联操作)
main() {
// 依次打印
// I am eating...
// I am sleeping...
// I am studying...
new Person()..eat()
..sleep()
..study();
}
mixing
mixin Eat {
eat() {
print('eat');
}
}
mixin Walk {
walk() {
print('walk');
}
}
class Dog with Eat, Walk{}
class Man extends Person with Eat, Walk, Code{}
Dart 是不支持多继承的,
extends用来继承,
with用来混合mixin其他类。实现其他通用方法。
异步 Future(未来) 和 Stream(流)
使用async
和await
关键词,
延时任务2秒后返回结果字符串"hi world!",然后在then中收到返回值data,打印结果。
Future.delayed(Duration(seconds: 2),(){
return "hi world!";
}).then((data){
print(data);
});
Future.catchError
如果异步任务发生错误,我们可以在catchError中捕获错误
Future.delayed(Duration(seconds: 2),(){
//return "hi world!";
throw AssertionError("Error");
}).then((data){
//执行成功会走到这里
print("success");
}).catchError((e){
//执行失败会走到这里
print(e);
});
Future.whenComplete
Future.delayed(Duration(seconds: 2),(){
//return "hi world!";
throw AssertionError("Error");
}).then((data){
//执行成功会走到这里
print(data);
}).catchError((e){
//执行失败会走到这里
print(e);
}).whenComplete((){
//无论成功或失败都会走到这里
});
Future.wait
Future.wait([
// 2秒后返回结果
Future.delayed(Duration(seconds: 2), () {
return "hello";
}),
// 4秒后返回结果
Future.delayed(Duration(seconds: 4), () {
return " world";
})
]).then((results){
//都收到结果时
print(results[0]+results[1]);
}).catchError((e){
//只要有一个失败时
print(e);
});
Async/await
Stream(流)
Stream 也是用于接收异步事件数据,它可以接收多个异步操作的结果。
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: (){
});
依次输出结果:
I/flutter (17666): hello 1
I/flutter (17666): Error
I/flutter (17666): hello 3
网友评论