![Flutter从0基础到App上线](https://wfqqreader-1252317822.image.myqcloud.com/cover/259/33831259/b_33831259.jpg)
3.2 变量与常量
在程序中,经常用大量的数据来代表程序的状态,其中有些数据的值在程序运行过程中会发生改变,有些数据的值不能发生改变,这些数据在程序中分别叫作变量和常量。
3.2.1 变量
所谓变量,就是用来储存值的对象,它可能是一个整数,也可能是一段话,其值通过变量名来访问。在Dart编程语言中,声明一个变量的方法非常简单。比如,要保存一个值为David的名字,操作如下:
![img](https://epubservercos.yuewen.com/9CF474/18096059801207706/epubprivate/OEBPS/Images/txt003_7.jpg?sign=1739283229-gq0zdzhiedVG0TEygQ2omHPJB3Qn890Y-0-fa2b635433fd35dd132f94ab21f834db)
在读取它时,仅仅按照name这个变量名去获取值即可。
现在,使用Dart内置的Print()方法向控制台输出名为name的变量值,代码片段如下:
![img](https://epubservercos.yuewen.com/9CF474/18096059801207706/epubprivate/OEBPS/Images/txt003_8.jpg?sign=1739283229-qCxHU3LChKqPnKuyXCNRaxJQEsvIb4OX-0-6334db3e69f22be5ccf53672173ce461)
运行结果如下:
![img](https://epubservercos.yuewen.com/9CF474/18096059801207706/epubprivate/OEBPS/Images/txt003_9.jpg?sign=1739283229-Nfnm7C954cTstZqi23NoeHHFPXHYW7Q0-0-db5a04fc7e083f2ec9a48e0296cf8bc5)
在这个例子中,name储存了一个字符串数据对象的引用,值为David。当然,也可以直接使用String(字符串)类型或dynamic(动态)类型,而不是用var来对name进行声明。具体做法如下:
![img](https://epubservercos.yuewen.com/9CF474/18096059801207706/epubprivate/OEBPS/Images/txt003_10.jpg?sign=1739283229-V7UVh81prHl7lR1hEhFZvril2YX31HDW-0-9a34d6393c5aa020ff98f17b22e47b02)
或者:
![img](https://epubservercos.yuewen.com/9CF474/18096059801207706/epubprivate/OEBPS/Images/txt003_11.jpg?sign=1739283229-d6c0j1vRXTA4TTHRUn6H7pXKdXcAmdom-0-f32d92089349da5d15bb569da8928bd2)
对于局部变量(指仅拥有局部作用域的变量,如一个方法内部)而言,根据代码建议的风格,建议使用var来声明变量。
在前文中提到,在Dart中一切皆对象。因此,未经初始化的变量的默认值为null。使用如下代码测试:
![img](https://epubservercos.yuewen.com/9CF474/18096059801207706/epubprivate/OEBPS/Images/txt003_12.jpg?sign=1739283229-5QvefF1Gr5OAvbxvbzL9MZs0oOxjqk7c-0-bcef1f0a8398be9941b388cd829b0c0d)
运行结果如下:
![img](https://epubservercos.yuewen.com/9CF474/18096059801207706/epubprivate/OEBPS/Images/txt003_13.jpg?sign=1739283229-mRyxv1TY9cgV3mJ4YGqO8ot0uErY6tG6-0-ff57f05fee919e2028f05757cca3a1de)
3.2.2 常量
常量,也称为最终变量。简单地说,一旦一个对象成了常量,其引用的对象就不再可变。在Dart语言中,可使用final或const关键字来声明一个常量。如下所示:
![img](https://epubservercos.yuewen.com/9CF474/18096059801207706/epubprivate/OEBPS/Images/txt003_14.jpg?sign=1739283229-8TDA20GC6qy2wYbM5m5EuKLcmvR6RfGc-0-f726d5179c6a2839e4e0670150a3efc7)
或者
![img](https://epubservercos.yuewen.com/9CF474/18096059801207706/epubprivate/OEBPS/Images/txt003_15.jpg?sign=1739283229-8G36Ui3gAcOaWu17dvcicHxSBcTOGhGE-0-f8feaa637e77f30df36d0a5c3024136a)
或许有人会产生疑问:final和const都可用来声明一个常量,有什么区别呢?const声明的常量是一种编译时常量,如下:
![img](https://epubservercos.yuewen.com/9CF474/18096059801207706/epubprivate/OEBPS/Images/txt003_16.jpg?sign=1739283229-oVGviitvnf1q3M8Ij0eD9KpNm8bHU2kU-0-202cfd5f396a3d370977dc73ea24003d)
从上面代码中可以发现,IDE会自动检查出在buyTwo值中的错误,因为const是一种编译时常量(即在运行前),所以同样需要用const来声明singlePrice。
const关键字也可以用来创建不变的值,甚至定义构造函数为const类型,即不可变对象,且任意变量都可以有一个不变的值。代码片段如下:
![img](https://epubservercos.yuewen.com/9CF474/18096059801207706/epubprivate/OEBPS/Images/txt003_17.jpg?sign=1739283229-sXNlaAcuAbeLYLsVsRibh84puvNYSYX6-0-f19f22834c23387fcbf0fd326def034e)
创建的intList变量的值为一个常量值(中括号表示一个数组)。虽然intList的值为常量不可变,但由于其本身声明使用了var,因此它仍然可以改变其引用。上述代码相当于:
![img](https://epubservercos.yuewen.com/9CF474/18096059801207706/epubprivate/OEBPS/Images/txt003_18.jpg?sign=1739283229-ffZtVBP0W6oXtFp8sgyQE63CM5mvT66W-0-45611cf5496d8a16d07adb1a75eb07ed)