Tegyük tisztába a dolgot, hogy mikor melyiket is használjuk a var, final és const kulcsszavak közül, amikor létrehozunk egy változót.
final
Adott egy final kulcsszóval létrehozott lista:
final numbers = [1, 2, 3];
Ha hozzá akarok adni egy elemet, akkor a
numbers.add(4);
utasítással tudom megtenni és nem kapok hibát. Pedig a változót a final kulcsszóval hoztam létre. Hogyan lehetséges ez?
A final egyszerűen azt jelenti, hogy a változó, amit létrehoztunk végleges, vagyis nem tudunk új értéket hozzárendelni. A numbers változó beállítása a létrehozáskor már megtörtént. Ami azt jelenti a final miatt, hogy azt viszont már nem tudnánk megtenni, hogy egy új értékadással másik listát töltök bele. Tehát a következő hibás lesz:
numbers = [4, 5, 6];
Más irányból megközelítve, a változó létrehozásán kívül más esetben nem használhatjuk a változón a hozzárendelés operátort, vagyis az egyenlőség jelet.
A numbers.add(4) azért működik, mert ebben az esetben egy már a memóriában létező változóhoz adtunk hozzá egy értéket. A number tehát ugyanaz az objektum (lista) a memóriában. Az egyenlőség jellel viszont egy vadi új objektum születne a memóriában. És a final ezt nem engedi meg.
var
A var kulcsó esetében más a helyzet, mert a var megengedi, hogy egy új értéket (új memória területet) rendeljünk egy változóhoz.
var numbers = [1, 2, 3];
numbers = [4, 5, 6]; // ok
number.add(4); // ez is ok
Tehát, amikor a var-ral létrehozunk egy változót, akkor ehhez a változóhoz tartozni fog a memóriában egy terület, egy memória cím.
Amikor új értéket rendelünk ehhez a változóhoz, akkor egy teljesen új memóriaterület fog a változóhoz tartozni. Ráaádásul ez az új memória terület felülírja / törli a régi területet és egyúttal a változót is tehát. Attól nem kell félni, hogy a régi memóriaterület feleslegesen ott marad a memóriában, mert a Dart elvégzi a nagytakarítást és felszabadítja a memória területet.
const
Ha const kulcsszóval hozunk létre egy változót, akkor a final-hoz hasonlóan nem tudunk új értéket a változóhoz rendelni.
Viszont ebben az esetben a number.add(4) sem működik.
Ugyanis a const-tal azt mondjuk a Dart-nak, hogy ez a változó / lista nem csak, hogy végleges (final), de a listában levő elemek nem változtathatók meg. A lista nem bővíthető és nem is szűkíthető. Teljesen szent és sérthetetlen.
Amikor egy widget neve elé írjuk a kódban a const kulcsszót, mert a VSCode erre figyelmeztet is, akkor az azt jelenti, hogy a Flutter újra tudja használni ezeket az objektumokat / widgeteket a memóriában.
Egyébként az is érvényes lenne, ha úgy írnánk a kódban, hogy
final numbers = const [1, 2, 3];
Ennek az ún. shortcut-ja a
const numbers = [1, 2, 3];