Costruttori di Classe in Dart (e Flutter) — parte 1

Luigi Massa
3 min readApr 12, 2020

--

Flutter

Sto studiando Flutter e durante lo sviluppo ho sentito l’esigenza di approfondire Dart, la base di Flutter.

Dart è un misto di Java, Javascript, PHP, Python, Ruby sia nella forma che nei concetti.

Una cosa salta all’occhio: tutto è un oggetto, anche il numero; anche gli operatori aritmetici! Tutto deriva da Object.

Se tutto un oggetto allora la base di tutto sono le classi. Quindi ecco qui alcune considerazioni sul funzionamento delle class in Dart.

La documentazione ufficiale è questa https://dart.dev/guides/language/language-tour#classes

La definizione di una classe in Dart non ha nulla di particolare rispetto ad altri linguaggi:

class Veicolo {

Veicolo(){
....
}
}

Primo: il costruttore di default se dichiarato non ha keyword ma direttamente il nome della classe Veicolo .

I parametri del costruttore sono tipizzati. Dart è un linguaggio tipizzato.

class Veicolo {   String marca;
String tipo;
String cilindrata;
Veicolo(String marca, String tipo, num cilindrata){ this.marca = marca;
this.tipo = tipo;
this.cilindrata = cilindrata;
}
}

Anche in questo caso nulla di particolare.

Primo punto: se i parametri dovessero essere opzionali? Ecco che si usano le parenti quadre [..] .

...
Veicolo( [String marca, String tipo, num cilindrata] ){
...

Secondo punto: voglio inizializzare i parametri con un default, come fare? In Dart non posso assegnare un valore di default ai parametri, ma posso assegnarlo agli attributi.

Il modo classico è il seguente:

.....
Veicolo(String marca, String tipo, num cilindrata){
this.marca = marca? marca: 'val default';
this.tipo = tipo? tipo: 'val default';
this.cilindrata = cilindrata? cilindrata: 'val default';
}
....

Oppure più semplicemente con una scorciatoia, dove inserisco direttamente gli attributi come parametri e vi associo un valore di default:

Veicolo.prova([this.marca='val default', this.cilindrata=0, this.tipo='val default']);

In questo caso i parametri sono posizionali in fase di creazione di oggetto.

Oppure possono essere named parameters (con un default), è in fase di costruzione devo richiamare il nome del parametro e passare il valore con i “:”. Ad esempio:

Veicolo({this.marca='val default', this.cilindrata=0, this.tipo='val default'});
...
Veicolo esempio = new Veicolo(cilindrata: 2000);

Altro modo di costruire il costruttore (:P sempre più complesso) :

.....
Veicolo(String marca, String tipo, num cilindrata)
: this.marca = 'val default',
this.tipo = 'val default',
this.cilindrata = 'val default'
;

Possiamo unire entrambi i modi per assegnare un default nel caso in cui i parametri siano opzionali e nello stesso tempo quanto i parametri vengono valorizzati in fase di chiamata, come in questo caso.

...
Veicolo(String marca, String tipo, num cilindrata)
: this.marca = 'val default',
this.tipo = 'val default',
this.cilindrata = 'val default'
{

this.marca = marca;
this.tipo = tipo;
this.cilindrata = cilindrata
}

Aggiungo solo un @override del metodo tostring() per poi testare alla fine il funzionamento

.....
@override
String toString() {

String tipo = this.tipoVeicolo;
String marca = this.marca;
String cilindrata = this.cilindrata.toString();
return 'Il veicolo è:' + ' $tipo - $marca ($cili cc)';}

Ecco la classe finale:

class Veicolo {    String marca, tipo;
num cilindrata;
Veicolo([String m, num c, String t]):
this.marca = '',
this.cilindrata = 0,
this.tipo = '' {

this.marca = m;
this.cilindrata = c;
this.tipo = t;
}
@override
String toString() {
String tipo = this.tipo;
String marca = this.marca;
String cili = this.cilindrata.toString();
return 'Il veicolo è:' + ' $tipo - $marca ($cili cc)';
}
}

Ora le prossime domande sono:

--

--

Luigi Massa

SAP Professional Consultant, Symfony, PrestaShop, Python junior, React and EC6 entusiast developer, studying Machine Learning and mountain lover :P