Ce face const
const înseamnă că valoarea este cunoscută încă de la compilare: literali (3, 'Iași'), alte constante și operații simple între ele. Nu poți folosi rezultatul unei funcții obișnuite sau DateTime.now().
Spre deosebire de final, const face și obiectul imuabil: o listă const nu acceptă add. Două expresii const cu aceeași valoare sunt chiar același obiect în memorie, ceea ce economisește memorie (în Flutter se folosește des la widget-uri).
Clasele pot avea constructori const dacă toate câmpurile sunt final. În clase, constantele se declară static const.
Exemple
Exemplul 1: Constante simple
Constantele pot fi calculate din alte constante.
const tva = 0.19;
const pretFaraTva = 100;
const pretCuTva = pretFaraTva * (1 + tva);
void main() {
print('Preț cu TVA: $pretCuTva lei');
}
Rezultat
Preț cu TVA: 119.0 lei
Exemplul 2: Listă const: nu se poate modifica
Adăugarea într-o listă const aruncă UnsupportedError la rulare.
void main() {
const zile = ['luni', 'marți', 'miercuri'];
print(zile);
try {
zile.add('joi');
} on UnsupportedError catch (e) {
print('Nu merge: ${e.message}');
}
}
Rezultat
[luni, marți, miercuri]
Nu merge: Cannot add to an unmodifiable list
Exemplul 3: Obiecte const identice
Două obiecte const cu aceleași valori sunt același obiect: identical dă true. Cu new obișnuit ar fi două obiecte diferite.
class Punct {
final int x, y;
const Punct(this.x, this.y);
}
void main() {
const a = Punct(1, 2);
const b = Punct(1, 2);
final c = Punct(1, 2);
print(identical(a, b));
print(identical(a, c));
}
Rezultat
true
false
Greșeli frecvente
const acum = DateTime.now();:Const variables must be initialized with a constant value. Foloseștefinal.- Constructor
constîntr-o clasă cu un câmp care nu estefinal:Can't define a const constructor for a class with non-final fields. - Confuzia între
final(o singură atribuire, valoare la rulare) șiconst(valoare la compilare, obiect imuabil).
Comenzi înrudite
final: Declară o variabilă care primește valoarea o singură dată și nu mai poate fi reatribuită.var: Declară o variabilă care se poate modifica; tipul este dedus automat din valoarea inițială.constructori: Funcțiile speciale care creează și inițializează obiectele unei clase.static: Membri care aparțin clasei, nu fiecărui obiect: se folosesc prin numele clasei, ca Nume.camp.