Aplicacions amb Flutter, Dart i Flame

Tutorial Flutter Flame Projectes   Recursos CITCEA
Exemples Dart Dades pràctiques     Inici

Classes

Les classes són plantilles que ens permeten crear objectes. Per a cada classe es defineixen unes variables (a les quals normalment donarem uns valors per defecte) i uns mètodes, que són les funcions que es poden fer servir amb els objectes d'aquella classe.

Les classes normalment van en fitxers a part, que situarem a la carpeta lib i els posarem el nom de la classe. Per crear un d'aquests fitxers, en el manú lateral, ens posarem sobre la carpeta lib, picarem amb el botó dret i triarem New File...; llavors donarem un nom al fitxer. Després cal indicar-li que es tracta d'un fitxer de Dart. Per fer-ho, marcarem el nom del fitxer i mirarem a la part inferior dreat de la pantalla, on veurem que el fitxer és originalment, per defecte, un fitxer de text (Plain Text). Picant al damunt del tipus de fitxer ens sortiran les opcions disponibles i haurem de triar Dart. Podem comprovar que al menú de l'esquerra el fiotxer ha passar a tenir la icona de Dart al costat.

Imaginem que a la carpeta lib hem creat el fitxer Persona amb el següent contingut:

class Persona{
  String nom = "Desconegut";
  int anyNaix = 1900;
  String ident = "99999999Z";
  bool enActiu = false;
  void fitxa(){
    print("Fitxa de: $nom");
    print("Identificador: $ident");
    print("Naixement: $anyNaix");
    if(enActiu){
      print("Aquesta persona està en actiu");
    } else {
      print("Aquesta persona està jubilada");
    }
    print("");
  }
}

Els objectes de tipus Persona tenen quatre variables i cada una d'elles té un valor per defecte. També tenim un mètode, que ens escriu la fitxa de la persona. Un objecte pot tenir diversos mètodes però és habitual que n'hi hagi un que mostri les seves característiques en algun format adequat. En el nostre cas, el mètode són només unes istruccions print perquè només podem mostrar-ho a la consola o al terminal.

En aquest exemple, el fitxer principal del projecte proves (situat a la carpeta bin) podria tenir:

import 'package:proves/Persona';
void main(List<String> arguments) {
  var pere = Persona();
  pere.nom = "Pere Campabadal Manlleu";
  pere.fitxa();
}

Fixem-nos que, abans de res, hem de carregar el fitxer on hi ha la definició de la classe. En el programa principal, creem un objecte de tipus Persona i el guardem a la variable pere. A aquest objecte li donem un valor a la variable nom però no ho fem a les altres tres; per tant, tindran els valors per defecte. Després demanem que en mostri les característiques de l'objecte pere. A l'executar el programa, obtindrem:

Fitxa de: Pere Campabadal Manlleu
Identificador: 99999999Z
Naixement: 1900
Aquesta persona està jubilada

També podem declarar l'objecte directament del tipus Persona, en lloc de fer-ho com a var.

void main(List<String> arguments) {
  Persona pere = Persona();
  pere.nom = "Pere Campabadal Manlleu";
  pere.fitxa();
}

L'avantatge de les classes és que podem crear tants objectes com desitgem amb la mateixa classe, amb la mateixa plantilla. Per exemple:

import 'package:proves/Persona';
void main(List<String> arguments) {
  var pere = Persona();
  var laura = Persona();
  var sara = Persona();
  pere.nom = "Pere Campabadal Manlleu";
  laura.nom = "Laura Martí Molins";
  laura.ident = "12345678W";
  sara.nom = "Sara Torelló Montseny";
  sara.enActiu = true;
  pere.fitxa();
  laura.fitxa();
  sara.fitxa();
}

L'prdre de les línies podria ser diferent. L'única condició és que, per a cada objecte, les línies on se li modifiquen les varibles estiguin quan ja s'ha creat i les línies on s'executa el mètode mostraran els nous valors de les variables només si hi estan després. El resultat d'executar seria:

Fitxa de: Pere Campabadal Manlleu
Identificador: 99999999Z
Naixement: 1900
Aquesta persona està jubilada
Fitxa de: Laura Martí Molins
Identificador: 12345678W
Naixement: 1900
Aquesta persona està jubilada
Fitxa de: Sara Torelló Montseny
Identificador: 99999999Z
Naixement: 1900
Aquesta persona està en actiu

Necessitat d'una instància de la classe

A vegades volem fer servir un mètode d'una classe com si fos una funció, però això no és possible. Per aconseguir-ho, cal crear una instància de la classe i cridar al mètode d'aquella instància.

...
ClasseQueEnsInteressa classeQueEnsInteressa = ClasseQueEnsInteressa();
...
    var resultat = classeQueEnsInteressa.metodeDeLaClasse();
...

Herència

Una classe pot heredar característiques (variables, mètodes...) d'una altra classe ja existent, sigui una del sistema o bé creada prèviament. Per exemple, la classe MainApp que es genera automàticament quan es crea una nova aplicació buida a Flutter.

class MainApp extends StatelessWidget{
  const MainApp({super.key});
  @override
  Widget build(BuildContext context){
    return const MaterialApp(
      home: Scaffold(
        body: Center(
          child: Text('Hello World!'),
        ),
      ),
    );
  }
}

A la primera línia, la paraula extends indica que MainApp és una extensió de la classe StatelessWidget i, per tant, força que heredi les seves variables i mètodes.

La primera línia dins de la classe és el constructor d'aquesta, que ha de tenir el mateix nom. En aquest cas, l'expressió super.key indica que faci servir el constructor de la classe progenitora (StatelessWidget).

El que hi ha després del return és l'element que retornarà, que és el que haurem de personalitzar en cada cas.

 

 

 

 

 

 

 

 

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.