Dart es un lenguaje de programación optimizado para aplicaciones frontend como interfaces web y móviles, con un enfoque en el desarrollo rápido y el rendimiento en tiempo de ejecución.
Se usa ampliamente con Flutter para crear aplicaciones móviles multiplataforma.
Instalación y Configuración
Instalación en Windows
Descarga el instalador desde dart.dev
Instalación en Linux
sudo apt update -y
sudo apt install dartInstalación en macOS
brew tap dart-lang/dart
brew install dartVerificar Instalación
Para comprobar que Dart está correctamente instalado
dart --versionCompilar y ejecutar un archivo Dart
Para compilar y ejecutar un archivo .dart:
dart run archivo.dartEstructura básica
Programa simple
El siguiente código muestra un programa básico en Dart con la función main como punto de entrada.
void main() {
print('Hola, Mundo!');
}Comentario de línea
// Este es un comentario de una líneaComentario de bloque
/*
Este es un comentario
de múltiples líneas
*/Tipos de datos
Tipos primitivos en Dart
Dart tiene varios tipos de datos primitivos: int, double, bool, String y var.
| Tipo | Descripción | Ejemplo |
|---|---|---|
int | Entero | var a = 10; |
double | Número decimal | var b = 10.5; |
String | Cadena de caracteres | var c = 'Hola'; |
bool | Booleano (true o false) | var d = true; |
dynamic | Puede contener cualquier tipo | var e; |
int entero = 42;
double decimal = 3.14;
bool esVerdad = true;
String texto = 'Hola';
var indefinido = 'puede ser cualquier tipo';Constantes
En Dart, se pueden definir constantes con const o final.
const: Valor de la constante en tiempo de compilación.final: Valor fijo en tiempo de ejecución, pero no se puede cambiar después de inicializarlo.
const double pi = 3.1416;
final DateTime ahora = DateTime.now();Null Safety
Dart tiene null safety para evitar errores de referencia nula:
int? edad; // Puede ser null
edad = 20;
print(edad);Operadores
Dart incluye varios tipos de operadores para realizar operaciones con variables y constantes.
Operadores Aritméticos
+Suma-Resta*Multiplicación/División (devuelve undouble)~/División entera (devuelve unint)%Módulo (resto de la división)
int a = 10;
int b = 3;
print(a + b); // 13
print(a ~/ b); // 3
print(a % b); // 1Operadores de Asignación
=Asignación+=,-=,*=,/=,~/=,%=
int c = 5;
c += 2; // c = 7Operadores Relacionales
==Igual a!=No igual a>Mayor que<Menor que>=Mayor o igual que<=Menor o igual que
print(5 > 3); // trueOperadores Lógicos
&&Y lógico (AND)||O lógico (OR)!Negación lógica (NOT)
bool esMayor = (5 > 3) && (2 < 4); // trueOperador de incremento/decremento
++Incremento en 1--Decremento en 1
int d = 5;
d++; // d = 6Operador de nulidad
??Devuelve el valor de la izquierda si no esnull, de lo contrario devuelve el de la derecha.
String? nombre;
print(nombre ?? 'Sin nombre'); // 'Sin nombre'Control de flujo
Condicionales
if (condicion) {
// código si la condición es verdadera
} else if (otraCondicion) {
// código si la otra condición es verdadera
} else {
// código si ninguna condición es verdadera
}Operador ternario
var resultado = (condicion) ? valor1 : valor2;Switch-case
switch (variable) {
case valor1:
// código para valor1
break;
case valor2:
// código para valor2
break;
default:
// código si no hay coincidencias
}Bucles
Bucle for
for (int i = 0; i < 10; i++) {
print(i);
}Bucle while
int i = 0;
while (i < 10) {
print(i);
i++;
}Bucle do-while
int i = 0;
do {
print(i);
i++;
} while (i < 10);Funciones
Definición básica de una función
void imprimirMensaje(String mensaje) {
print(mensaje);
}Función con valor de retorno
int sumar(int a, int b) {
return a + b;
}Funciones anónimas
var funcionAnonima = () {
print('Esto es una función anónima');
};Parámetros opcionales
En Dart, los parámetros pueden ser opcionales o tener valores predeterminados:
- Parámetros nombrados:
void saludo({String nombre = 'amigo'}) {
print('Hola, $nombre');
}- Parámetros posicionales:
void mostrarDatos(String nombre, [int edad = 0]) {
print('Nombre: $nombre, Edad: $edad');
}Funciones de flecha (Arrow functions)
Las funciones cortas pueden expresarse con flechas:
int multiplicar(int a, int b) => a * b;Funciones como parámetros
void ejecutarFuncion(void Function() funcion) {
funcion();
}
void main() {
ejecutarFuncion(() => print('Función ejecutada'));
}Closures
Function sumar(int a) {
return (int b) => a + b;
}
void main() {
var sumaCon5 = sumar(5);
print(sumaCon5(3)); // 8
}Colecciones
Listas
Declaración de listas
List<int> numeros = [1, 2, 3, 4, 5];Acceso a elementos
print(lista[0]); // Imprime 1Operaciones comunes con listas
numeros.add(6);
numeros.remove(3);
print(numeros.length);Sets
Declaración de sets
Set<String> nombres = {'Ana', 'Luis', 'Carlos'};Operaciones con sets
nombres.add('Pedro');
nombres.remove('Ana');Mapas
Declaración de mapas
Map<String, int> edades = {'Luis': 25, 'Ana': 30};Acceso a valores
print(edades['Luis']); // 25Clases y objetos
Definición de clase
class Persona {
String nombre;
int edad;
Persona(this.nombre, this.edad);
void mostrarDatos() {
print('Nombre: $nombre, Edad: $edad');
}
}Crear una instancia de clase
void main() {
var persona = Persona('Luis', 25);
persona.mostrarDatos();
}Uso de getters y setters
class Circulo {
double radio;
Circulo(this.radio);
double get area => 3.1416 * radio * radio;
set cambiarRadio(double nuevoRadio) => radio = nuevoRadio;
}Constructores nombrados
class Persona {
String nombre;
int edad;
Persona(this.nombre, this.edad);
Persona.sinEdad(this.nombre) {
edad = 0;
}
}Herencia
class Animal {
void sonido() {
print('El animal hace un sonido');
}
}
class Perro extends Animal {
@override
void sonido() {
print('El perro ladra');
}
}Métodos estáticos
class Matematica {
static int sumar(int a, int b) {
return a + b;
}
}
void main() {
print(Matematica.sumar(5, 3));
}Asincronía
Funciones asincrónicas
Dart permite ejecutar código de forma asíncrona usando Future y async/await.
Future<String> obtenerDatos() async {
return 'Datos obtenidos';
}
void main() async {
String resultado = await obtenerDatos();
print(resultado);
}Simulación de retrasos
Future<void> simularRetraso() async {
await Future.delayed(Duration(seconds: 2));
print('Retraso completado');
}Streams
Uso de Streams para manejar flujos de datos
Stream<int> contar() async* {
for (int i = 1; i <= 5; i++) {
yield i;
await Future.delayed(Duration(seconds: 1));
}
}
void main() async {
await for (var valor in contar()) {
print(valor);
}
}Manejo de errores
Try-catch-finally
void main() {
try {
int resultado = 100 ~/ 0; // División por cero
} catch (e) {
print('Error: $e');
} finally {
print('Operación completada');
}
}Lanzar excepciones
void validarEdad(int edad) {
if (edad < 18) {
throw Exception('Edad no válida');
}
}Paquetes y gestión de dependencias
Importar una biblioteca
import 'dart:math';Creación de un nuevo proyecto
dart create mi_proyectoGestión de dependencias con pubspec.yaml
En este archivo, se gestionan las dependencias de tu proyecto:
dependencies:
http: ^0.13.3Para instalar las dependencias:
dart pub getUso de un paquete
import 'package:http/http.dart' as http;
void main() async {
var respuesta = await http.get(Uri.parse('https://ejemplo.com'));
print(respuesta.body);
}