Diferencia entre revisiones de «Flutter DART Clases»

De MediaWiki
Ir a la navegación Ir a la búsqueda
Línea 190: Línea 190:
 
<br />
 
<br />
  
−
==Empleando Mapas. Instanciadores==
+
==Empleando Mapas==
  
 
* En esta sección voy a explicar como, teniendo como fuente de datos un mapa, crear múltiples objetos.
 
* En esta sección voy a explicar como, teniendo como fuente de datos un mapa, crear múltiples objetos.

Revisión del 15:26 9 jul 2021

Introducción

  • Como comenté anteriormente este curso está pensado para alumnos que ya tienen conocimientos previos en algún lenguaje de programación orientado a objetos.
En esta sección se va a explicar las diferencias y características con respecto a otros lenguajes orientados a objetos en lo que se refiere al uso de clases y objetos,


  • En Dart no es necesario realizar el new cuando instanciamos una clase.
Esto se emplea mucho en Flutter ya que todo en él se base en crear widgets (Clases) y por tanto aparecería de forma continua new´s por todos lados.
Sin embargo, si vamos a emplear clases creadas por nosotros, se recomienda hacer uso de new para diferenciarlo de la llamada a una función.


Veamos un ejemplo, con conceptos de otros lenguajes de programación orientado a objetos como el empleo del método toString:
class Vehiculo{
  
  int? anoCompra; // Necesitamos indicar que admite valores nulos, ya que al instanciar no le damos un valor por defecto
  String? matricula;
  String? marca;
  
  @override
  String toString() => 'El vehículo de la marca $marca con matrícula $matricula se compró en el año $anoCompra'; 
}
void main() {

  final veh1 = new Vehiculo();
  veh1.marca='Opel';
  veh1.matricula='1234GHZ';
  veh1.anoCompra = 2018;
  
  print(veh1);
  
  final veh2 = Vehiculo(); // No necesitamos new, pero se recomienda si son clases nuestras
  veh2.marca='Peugot';
  veh2.matricula='6543HZZ';
  veh2.anoCompra = 2020;
  
  print(veh2);
  
}



Constructores

  • Funcionan igual que en el lenguaje Java.
Veamos un ejemplo de uso:


class Vehiculo{
  
  int? anoCompra; // Necesitamos indicar que admite valores nulos, ya que al instanciar no le damos un valor por defecto
  String? matricula;
  String? marca;
  
  Vehiculo(int anoCompra, String matricula, String marca){
    this.anoCompra = anoCompra;
    this.marca = marca;
    this.matricula = matricula;
  }
  
  @override
  String toString() => 'El vehículo de la marca $marca con matrícula $matricula se compró en el año $anoCompra'; 
}
void main() {

  final veh1 = new Vehiculo(2018,'Opel','1234GHZ');  
  print(veh1);
  
  final veh2 = Vehiculo(2020,'Peugot','6543HZZ'); 
  print(veh2);
  
}
Fijarse que un constructor no es más que un método y por tanto podemos emplear todo lo aprendido con los parámetros (opciones, posicionales,...)
Ejercicio propuesto: Modifica el ejercicio anterior y haz con los parámetros puedan ser enviados en cualquier orden especificando el nombre del parámetro en la llamada. Haz que todos ellos sean obligatorios.



  • En el ejemplo anterior vimos que al definir las propiedades de la clase, éstas deberían admitir valores nulos, ya que cuando instanciamos no les damos unos valores iniciales.
Para solucionarlo.
class Vehiculo{
  
  int anoCompra; 
  String matricula;
  String marca;
  
  Vehiculo(this.anoCompra,this.marca, this.matricula); // Esto hace que automaticamente asigne los valores enviados a las propiedades y obliga a instanciar con los 3 parámetros.
  
  @override
  String toString() => 'El vehículo de la marca $marca con matrícula $matricula se compró en el año $anoCompra'; 
  
}
void main() {

  final veh1 = new Vehiculo(2018,'Opel','1234GHZ');  
  print(veh1);
  
  final veh2 = Vehiculo(2020,'Peugot','6543HZZ'); 
  print(veh2);
  
  
}


  • Si quisiéramos emplear el paso de parámetros empleando sus nombres, debemos de hacer uso de las { }, pero haciendo obligatorios el paso de datos con la palabra reservada required como ya vimos anteriormente.
class Vehiculo{
  
  int anoCompra; 
  String matricula;
  String marca;
  
  Vehiculo({
      required this.anoCompra,
      required this.marca, 
      required this.matricula
    }); 
  
  @override
  String toString() => 'El vehículo de la marca $marca con matrícula $matricula se compró en el año $anoCompra'; 
  
}
void main() {

  final veh1 = new Vehiculo(anoCompra: 2018 ,marca: 'Opel',matricula: '1234GHZ');  
  print(veh1);
  
  final veh2 = Vehiculo(anoCompra: 2020,marca: 'Peugot',matricula: '6543HZZ'); 
  print(veh2);
  
  
}



Mútliples constructores. Constructores con nombre

  • En DART no existe la sobrecarga de constructores y por tanto no podemos definir múltiples constructores en base a diferente tipo o número de parámetros.
Para solucionarlo, DART permite crear múltiples constructores con diferentes nombres de la forma: nombre_clase.nombre_constructor(parámetros).
class Vehiculo{
  
  int anoCompra; 
  String matricula;
  String marca;
  
  Vehiculo({required this.anoCompra,required this.marca, required this.matricula}); 
  
  Vehiculo.sinAnho({required this.marca, required this.matricula}) : anoCompra = 2000;

  Vehiculo.sinAnhoMarca({required this.matricula}) : anoCompra = 2000, marca='Opel';
  
  @override
  String toString() => 'El vehículo de la marca $marca con matrícula $matricula se compró en el año $anoCompra'; 
  
}
void main() {

  final veh1 = new Vehiculo(anoCompra: 2018,marca: 'Opel',matricula: '1234GHZ');  
  print(veh1);
  
  final veh2 = new Vehiculo.sinAnho(marca: 'Opel',matricula: '2234GHZ');  
  print(veh2);
  
  final veh3 = new Vehiculo.sinAnhoMarca(matricula: '3234GHZ');  
  print(veh3);
  
}
  • Nota importante: Fijarse que estoy haciendo uso de otro constructor en el que indico los valores que van a guardar los atributos de la clase Coche. Como no envío el año de compra ni la marca, tendría que indicar en la definición del atributo, que dichos atributos puede recibir valores nulos o que tienen un valor por defecto.
Pero he empleado otra característica de DART que consiste en poner, después de la definición de los parámetros, dos puntos seguido de las variables que queremos inicializar. Este código se ejecuta antes del constructor. Es lo que se conoce como inicalizadores.
Más información: https://dart.dev/guides/language/language-tour#constructors



Empleando Mapas

  • En esta sección voy a explicar como, teniendo como fuente de datos un mapa, crear múltiples objetos.
Partimos de un mapa que va a guardar la información de un Coche.
Normalmente los datos que tengan como fuente de datos Internet vendrán en formato JSON:





Enlace a la página principal de la UD2

Enlace a la página principal del curso




-- Ángel D. Fernández González -- (2021).