一、mixins
mixins是一个前端很火的概念,是一个重复使用类中代码的方式。
class A {
a() {
print("A's a()");
}
}
class B {
b() {
print("B's b()");
}
}
class C = A with B; // 使用with关键字,表示类C是由类A和类B混合而构成
void main() {
C c = new C();
c.a(); // A's a()
c.b(); // B's b()
}
二、异步
Dart提供了类似ES7中的async await等异步操作,这种异步操作在Flutter开发中会经常遇到,比如网络或其他IO操作,文件选择等都需要用到异步的知识。 async和await往往是成对出现的,如果一个方法中有耗时的操作,你需要将这个方法设置成async,并给其中的耗时操作加上await关键字,如果这个方法有返回值,你需要将返回值塞到Future中并返回,如下代码所示:
Future<String> getNetData() async {
http.Response res = await http.get("http://www.baidu.com");
return res.body;
}
main() {
getNetData().then((str) {
print(str);
});
}
三、变量
1、var
var 声明变量并自动推断类型
Dart 中,有一个变量可以指定类型声明,如下
String s = 's1';
int i = 2;
double f = 2.2;
这些,也完全可以使用 var 来处理,让编译器自动推断;
var s = 's1'; // type String
var i = 2; // type int
var f = 2.2; // type double
2、dynamic
无论是 var 还是 int 等类型声明的变量,再次赋值其他类型会报错,如下:
var s = 's1';
s = 1;
如果使用 dynamic 申明的变量,则可以进行此操作
dynamic s = 's1';
print(s); // 值为 s1
s = 1;
print(s); // 值为 1
3、const 与 final
共同点:
void main(){
const f = 'hello'; // 将 const 改为 final,同样的结果
print(f);
f = 'world'; // const 与 final 都会报错,原因是对象内部的 setter 不存在
}
不同点:
1、const 隐式的 final,不单单可以约束变量,也可以约束变量的值。
void main(){
final f = <int>[1];
f.add(2);
print(f);
}
使用 final ,打印正常,结果为 [1, 2]
若把 final 改为 const ,则会报错
因此,若定义固定的 List(或 map 或其他类型等),明确后续不再改变它,那么 const 就有用了
可以看出,final 与 const,类似于 python 的 浅复制 与 深复制
2、const 为编译时常量,final 为运行时常量
const dt = const DateTime.now(); //错误,因为时间是在运行时候确定的
final dt = DateTime.now(); //正确,运行时有确定的值
3、内存中重复创建
const a1 = [11 , 22];
const a2 = [11 , 22];
print(identical(a1, a2));//true
final a1 = [11 , 22];
final a2 = [11 , 22];
print(identical(a1, a2));//false