前言
好久没写Flutter了,之前接触Flutter还是为了玩一玩,看着这样一个新的、好评如潮的跨平台技术,觉得是该玩一玩了,之前的RN就没玩就要凉了,毕竟RN不是Google的亲儿子,但是Flutter是啊,而且Dart也是啊。
未来的几篇文章准备写一个Flutter的专题,最起码要把之前忽略的一些细节都给补上。好了,废话不多说,下面直接开始。
那些你不知道的Dart细节之变量
那些你不知道的Dart细节之内置类型
那些你不知道的Dart细节之函数(方法)
那些你不知道的Dart细节之操作符、流程控制语句、异常
那些你不知道的Dart细节之类的点点滴滴
那些你不知道的Dart细节之泛型和库
Hello World
学习一门语言一般都要从打印“Hello World”开始,那么就来看一下在Dart中应该怎样打印:
1
2
3
4
5 1void main(){
2 print("Hello World");
3}
4
5
和Java类似,Dart执行也需要一个main方法,打印就要比Java稍微简单点了,直接进行Print就可以了。这里需要注意的是:方法如果没有返回值的情况下可以省略void
变量的声明
真正要进入主题了。。。在Dart中变量的声明有三个关键字:var、dynamic和Object,三个关键字的使用情况各有千秋。下面来分别说一下:
var
首先说一下var关键字,了解过Kotlin的应该对这个关键字很熟悉,在Kotlin中var表示一个可变的变量(val表示不可变的,相当于final,这里不赘述),在Dart中,var如果没有初始值,可以变成任何类型,但如果var有初始值,那么类型将被锁定。这是什么意思呢?看一下下面这段代码你就明白了:
1
2
3
4
5
6
7
8
9 1main(){
2 //print("Hello World");
3 var data;
4 data = 'zhujiang';
5 data = 123;
6 print(data);
7}
8
9
var在没有初始值的时候是可以随意指定类型的,例如上面的代码,可以赋值为字符串,也可以赋值为int。这里要注意:Dart中字符串可以使用单引号也可以使用双引号。
上面代码没有赋初始值,下面赋初始值再看一下:
1
2
3
4
5
6
7
8
9 1main(){
2 //print("Hello World");
3 var data = 1;
4 data = 'zhujiang';
5 data = 123;
6 print(data);
7}
8
9
大家可以看到,如果有初始值,就不可以改变类型了,正好印证了上面我们所说的类型被锁定。
Object
这个关键字大家应该都很熟悉,Java中的所有对象的父类就是Object。在Dart中dynamic指动态类型,会在编译阶段检查类型。Object和var不同,即使赋了初始值,也同样可以指定别的类型:
1
2
3
4
5 1 Object data2 = 1234;
2 data2 = 'dongnao';
3 print(data2);
4
5
上面所说的会在编译阶段检查类型指的是如果你调用一个本身没有的方法,可以直接报红,提醒你编写错误(var也是在编译阶段检查类型)。
dynamic
我在学习Dart之前没有在别的语言见过这个关键字,对我而言比较陌生,这个关键字和Object非常相似,唯一的区别就是在编译阶段不检查类型。和Object恰恰相反,如果你调用一个本身没有的方法,不会报错,但是当你运行的时候才会抛异常。
变量的默认值
这个本来不想说的,但是发现和之前所学的不太一样,还是说一下吧。
在Dart中,没有初始化的变量自动获取一个默认值为null
一切皆对象,对象的默认值为null
只要记着上面两句话就可以了,不要被之前的Java所禁锢,比如之前的Boolean值默认会是false,但是在Dart中的bool值默认也是null,记着,一切皆对象,对象的默认值为null
变量 final和const
final大家很了解,Java中经常使用,const相对就比较陌生了,下面说一下他们的共同点:
-
声明的类型可省略
1
2
3
4
5
6 1 final fVariable1 = 'zhujiang';
2// final String fVariable1 = 'zhujiang';
3 const cVariable1 = 'zhujiang';
4// const String cVariable1 = 'zhujiang';
5
6
-
初始化后不能再赋值
1
2
3
4 1fVariable1 = 'demo';
2cVariable1 = 'demo';
3
4
上面初始化之后,这里就不可以赋值了,如果赋值即会报错
-
不能和var同时使用
1
2
3
4 1final var fVariable1 = 'zhujiang';
2const var fVariable1 = 'zhujiang';
3
4
和var同时使用的话也会报错。
下面再看一下他们的不同点:
-
类级别常量,使用static const
1
2
3 1static const int monday = 1;
2
3
这里大家可以参照一下系统中的类,例如DateTime。
-
const可使用其他const 常量的值来初始化其值
1
2
3
4
5 1const width = 100;
2const height = 100;
3const square = width * height;
4
5
-
使用const赋值声明,const可省略
1
2
3
4 1const List clist = [1, 2, 3];
2// const List clist = const [1, 2, 3];//dart 2之前,const赋值必须用const声明
3
4
-
可以更改非final、非const变量的值,即使曾经具有const值
1
2
3
4
5
6
7
8 1var varList = const [1, 2, 3];
2final finalList = const [1, 2, 3];
3const constList = [1, 2, 3];
4varList = [1];
5// constList = [1];
6// finalList = [1];
7
8
-
const导致的不可变性是可传递的
1
2
3
4
5
6
7 1final List ls = [1, 2, 3];
2 ls[1] = 4;
3 print(ls);
4 const List ls1 = [1, 2, 3];
5// ls1[1] = 4;
6
7
-
相同的const常量不会在内存中重复创建
1
2
3
4
5
6
7
8
9 1 final finalList1 = [1, 2];
2 final finalList2 = [1, 2];
3 print(identical(finalList1, finalList2)); //identical用于检查两个引用是否指向同一个对象
4
5 const constList1 = [1, 2];
6 const constList2 = [1, 2];
7 print(identical(constList1, constList2));
8
9
上面代码的运行结果是false和ture,也印证了上面所说的。
-
const需要是编译时常量
1
2
3
4 1final DateTime finalDateTime = DateTime.now();
2 // const DateTime constDateTime = DateTime.now();//DateTime.now() 是运行期计算出来的值
3
4
总结
本篇文章简单说明了在Dart中变量的一些细节问题,还有大家在编码过程中需要注意的问题。下一篇文章讲解一下Dart中的内置类型,希望大家能够喜欢,对大家如果有帮助的话,欢迎点赞关注,如果有异议,可以留言进行讨论。