const 修飾內(nèi)置數(shù)據(jù)類型
const 修飾內(nèi)置數(shù)據(jù)類型,那么之后就不允許修改了,否則編譯階段會報錯。
void main() {
const int a = 1;
// a = 2;
const double d = 1.0;
// d = 2.0;
const String str = "hello";
// str = "world";
const List list = [1, 2, 3];
// list = [4, 5, 6];
}
const 修飾自定義數(shù)據(jù)類型
如果要用 const 修飾自定義數(shù)據(jù)類型,那么它的構(gòu)造方法也必須加 const,否則編譯階段會報錯。
void main() {
// 此處編譯報錯:Const variables must be initialized with a constant value.
const Person p = Person("Jack", 11);
}
class Person {
String name;
int age;
Person(this.name, this.age);
}
構(gòu)造方法加上 const 之后,編譯器提示成員變量必須是 final 的。
void main() {
const Person p = Person("Jack", 11);
}
class Person {
String name;
int age;
// 此處編譯報錯:Can't define a const constructor for a class with non-final fields.
const Person(this.name, this.age);
}
繼續(xù)給成員變量加 final 關(guān)鍵字,發(fā)現(xiàn)沒有編譯錯誤了。
void main() {
const Person p = Person("Jack", 11);
// p = Person("Rose", 12) // 不可以修改
}
class Person {
final String name;
final int age;
const Person(this.name, this.age);
}
注意:const 要加到前面才可以將變量的值設(shè)置為不可以被修改,如果 const 加到后面,變量的值還是可以被修改的。(那么,const 加到后面有什么意義呢?可以節(jié)省內(nèi)存空間,下文有具體介紹,這里就不解釋了)
void main() {
const Person p = Person("Jack", 11);
// p = Person("Rose", 12) // 不可以修改
Person p2 = const Person("Jack", 11);
p2 = const Person("Rose", 12); // 仍然可以修改
}
class Person {
final String name;
final int age;
const Person(this.name, this.age);
}
類中定義 const 的成員
類中定義 const 的成員,必須要加 static 關(guān)鍵字,這是固定的定義常量的寫法。
class Person {
// static const 定義常量
static const String TAG = "MyTag";
final String name;
final int age;
const Person(this.name, this.age);
}
const 節(jié)省內(nèi)存空間
來看看下面這個例子:
void main() {
for (var i = 0; i < 10; i++) {
Person p = const Person("Jack", 11);
print(p.hashCode);
}
}
class Person {
static const String TAG = "MyTag";
final String name;
final int age;
const Person(this.name, this.age);
}
for 循環(huán)中創(chuàng)建了 10 個 Person 對象,打印出來的 hash code 卻是一模一樣,這就說明了 10 次用的同一個對象,這樣的好處就是節(jié)省內(nèi)存空間。
這個在 flutter 中也很常用,對于一些不需要修改的控件,定義成 const,不管調(diào)用多少次,都是同一份內(nèi)存空間:
const Text("Hello World!")
const 是編譯期常量
const 是編譯器常量,不能在其中使用只能在運行期間才能確定的變量。以下代碼編譯出錯:
int count = 0;
const Text("次數(shù):$count");
const 層級
如果上層是 const 的,下面的層級必須都是 const 的
const Padding(
padding: const EdgeInsets.all(10),
child: const Text("Hello World"),
);
子層級的 const 可以省略
const Padding(
padding: EdgeInsets.all(10),
child: Text("Hello World"),
);
如果外層加了 const,但是子層級中有不能修飾為 const 的控件,編譯會報錯
const 和 final 的區(qū)別
final 修飾的變量在第一次使用時被初始化,之后不允許修改。
const 修飾的變量是一個編譯時常量,編譯后會發(fā)現(xiàn)在用到常量的地方,直接用常量值替換了。