![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=1738809493-jZJFmNKODV88iIeyTTwv7dG1fOzvxRhi-0-122f090d9413d6ecc8db783429b07bd0)
在读取它时,仅仅按照name这个变量名去获取值即可。
现在,使用Dart内置的Print()方法向控制台输出名为name的变量值,代码片段如下:
![img](https://epubservercos.yuewen.com/9CF474/18096059801207706/epubprivate/OEBPS/Images/txt003_8.jpg?sign=1738809493-CKyeYOomY1Mo7p2zxKpN9qNjrplpOltE-0-040a8b7abd2f797a8726687290b30e8a)
运行结果如下:
![img](https://epubservercos.yuewen.com/9CF474/18096059801207706/epubprivate/OEBPS/Images/txt003_9.jpg?sign=1738809493-E06G6ASZd62ilbZmnNKzc3A0neTV4cAG-0-ee3b94c05b85a0a04f9508b9e16bb889)
在这个例子中,name储存了一个字符串数据对象的引用,值为David。当然,也可以直接使用String(字符串)类型或dynamic(动态)类型,而不是用var来对name进行声明。具体做法如下:
![img](https://epubservercos.yuewen.com/9CF474/18096059801207706/epubprivate/OEBPS/Images/txt003_10.jpg?sign=1738809493-i7dLidZo0VuLRtSuGxO7UJo8M2jwQRwL-0-8f8437f57ef1df42ef15366542ddcfed)
或者:
![img](https://epubservercos.yuewen.com/9CF474/18096059801207706/epubprivate/OEBPS/Images/txt003_11.jpg?sign=1738809493-c0lSi4C7AFnj3sIgPVHjbFb9HPOAQtIy-0-b3555953fb91fffc08963695a78bb10e)
对于局部变量(指仅拥有局部作用域的变量,如一个方法内部)而言,根据代码建议的风格,建议使用var来声明变量。
在前文中提到,在Dart中一切皆对象。因此,未经初始化的变量的默认值为null。使用如下代码测试:
![img](https://epubservercos.yuewen.com/9CF474/18096059801207706/epubprivate/OEBPS/Images/txt003_12.jpg?sign=1738809493-M0XqL9VMdf2jlfTXqAhCdS8ARXw8EKEc-0-96be109f1d2fb304de79b8761aa0e9bf)
运行结果如下:
![img](https://epubservercos.yuewen.com/9CF474/18096059801207706/epubprivate/OEBPS/Images/txt003_13.jpg?sign=1738809493-td9e3GNxr2fmAg8IQ5I9ohF7Xv6cfSMC-0-c8f7d242cf88032f12af603d17899840)
3.2.2 常量
常量,也称为最终变量。简单地说,一旦一个对象成了常量,其引用的对象就不再可变。在Dart语言中,可使用final或const关键字来声明一个常量。如下所示:
![img](https://epubservercos.yuewen.com/9CF474/18096059801207706/epubprivate/OEBPS/Images/txt003_14.jpg?sign=1738809493-X82VBNCZ0osWJA8qSaOtzroEhCw4u4Is-0-539393769a33244c5cf84efd204cc494)
或者
![img](https://epubservercos.yuewen.com/9CF474/18096059801207706/epubprivate/OEBPS/Images/txt003_15.jpg?sign=1738809493-UXsyynaIy5r4bnTE57Vwdki21hnn6ZqH-0-2d9d6b8076891b8d13a041cac5e37335)
或许有人会产生疑问:final和const都可用来声明一个常量,有什么区别呢?const声明的常量是一种编译时常量,如下:
![img](https://epubservercos.yuewen.com/9CF474/18096059801207706/epubprivate/OEBPS/Images/txt003_16.jpg?sign=1738809493-iukC4Sl2JpC85gGssl70HXh8qz3HmsCq-0-499647cfe02e05957d68bb84c5a1d015)
从上面代码中可以发现,IDE会自动检查出在buyTwo值中的错误,因为const是一种编译时常量(即在运行前),所以同样需要用const来声明singlePrice。
const关键字也可以用来创建不变的值,甚至定义构造函数为const类型,即不可变对象,且任意变量都可以有一个不变的值。代码片段如下:
![img](https://epubservercos.yuewen.com/9CF474/18096059801207706/epubprivate/OEBPS/Images/txt003_17.jpg?sign=1738809493-IjjwRGTpdqW5pnW5BGEXq0zRhA4B5JCg-0-92f199749b6527f593a909b46129d8e1)
创建的intList变量的值为一个常量值(中括号表示一个数组)。虽然intList的值为常量不可变,但由于其本身声明使用了var,因此它仍然可以改变其引用。上述代码相当于:
![img](https://epubservercos.yuewen.com/9CF474/18096059801207706/epubprivate/OEBPS/Images/txt003_18.jpg?sign=1738809493-B0yD6bgSfGKnfIZ4udVUzuW25SmNNkT3-0-d8af03803059b8a0c7ff546c6b320a5e)