Dart es el lenguaje de programación creado por Google que Flutter usa para construir apps móviles, web y de escritorio.
Dart combina una sintaxis familiar (similar a Java o JavaScript) con herramientas modernas como tipado fuerte y compilación nativa. Aprender su sintaxis básica es el primer paso para escribir cualquier app con Flutter.
Variables y tipos de datos
En Dart, toda variable tiene un tipo de dato que define qué clase de información puede guardar.
Los tipos más comunes son:
| Tipo | Descripción | Ejemplo |
|---|---|---|
int |
Número entero | 25, 1000 |
double |
Número decimal | 18500.5, 3.14 |
String |
Texto | "Guadalajara" |
bool |
Verdadero o falso | true, false |
List |
Lista de valores | [1, 2, 3] |
Declarar una variable
Hay tres formas principales de declarar variables en Dart:
1. Con tipo explícito:
int edad = 28;
double salario = 18500;
String empresa = "FEMSA";
bool estaActivo = true;
2. Con var (Dart infiere el tipo):
var ciudad = "Monterrey";
var descuento = 0.15;
3. Con final y const (valores que no cambian):
final String rfc = "GOME850312AB3";
const double iva = 0.16;
final se asigna una sola vez en tiempo de ejecución. const es una constante que se conoce en tiempo de compilación.
Operadores aritméticos
Dart soporta los operadores matemáticos estándar.
| Operador | Significado | Ejemplo |
|---|---|---|
+ |
Suma | salario + bono |
- |
Resta | salario - descuento |
* |
Multiplicación | precio * cantidad |
/ |
División (decimal) | total / meses |
~/ |
División entera | dias ~/ semanas |
% |
Módulo (residuo) | numero % 2 |
Ejemplo práctico: cálculo de salario neto
Supón que trabajas en Bimbo y quieres calcular el salario neto de un empleado.
void main() {
double salarioBruto = 22000;
double imss = salarioBruto * 0.0225; // Cuota IMSS aprox.
double isr = salarioBruto * 0.10; // ISR simplificado
double salarioNeto = salarioBruto - imss - isr;
print("Salario bruto: \$$salarioBruto");
print("Descuento IMSS: \$$imss");
print("Descuento ISR: \$$isr");
print("Salario neto: \$$salarioNeto");
}
Salida en consola:
Salario bruto: $22,000
Descuento IMSS: $495
Descuento ISR: $2,200
Salario neto: $19,305
Nota el uso de \$ dentro de un String para imprimir el símbolo de pesos sin que Dart lo interprete como interpolación.
Interpolación de Strings
Dart permite insertar variables directamente dentro de un texto usando $variable o ${expresión}.
String empleado = "Carlos Ramírez";
double salario = 18500;
print("Empleado: $empleado");
print("Salario mensual: \$$salario");
print("Salario anual: \$${salario * 12}");
Salida:
Empleado: Carlos Ramírez
Salario mensual: $18,500
Salario anual: $222,000
Usa ${} cuando necesites incluir una expresión completa, no solo una variable.
Control de flujo: condicionales
El control de flujo determina qué código se ejecuta según ciertas condiciones.
if / else
double ventasMensuales = 85000;
if (ventasMensuales >= 100000) {
print("Bono de productividad aplicado.");
} else if (ventasMensuales >= 70000) {
print("Meta parcial alcanzada.");
} else {
print("Meta no alcanzada este mes.");
}
Salida: Meta parcial alcanzada.
switch
Usa switch cuando compares un valor contra múltiples opciones fijas.
String estado = "Jalisco";
switch (estado) {
case "CDMX":
print("Capital del país.");
break;
case "Jalisco":
print("Ciudad: Guadalajara.");
break;
case "Nuevo León":
print("Ciudad: Monterrey.");
break;
default:
print("Estado no listado.");
}
Ciclos: for y while
Los ciclos repiten un bloque de código un número determinado de veces.
Ciclo for
// Calcular comisiones de 5 vendedores de Liverpool
List<double> ventas = [45000, 62000, 38000, 71000, 55000];
double comisionRate = 0.05;
for (int i = 0; i < ventas.length; i++) {
double comision = ventas[i] * comisionRate;
print("Vendedor ${i + 1}: comisión = \$$comision");
}
Salida:
Vendedor 1: comisión = $2,250
Vendedor 2: comisión = $3,100
Vendedor 3: comisión = $1,900
Vendedor 4: comisión = $3,550
Vendedor 5: comisión = $2,750
for-in (para listas)
List<String> sucursales = ["Polanco", "Perisur", "Interlomas"];
for (String sucursal in sucursales) {
print("Sucursal Liverpool: $sucursal");
}
Ciclo while
int pedidos = 0;
int limite = 5;
while (pedidos < limite) {
pedidos++;
print("Pedido Mercado Libre #$pedidos procesado.");
}
Funciones en Dart
Una función es un bloque de código reutilizable que realiza una tarea específica.
Estructura básica
TipoRetorno nombreFuncion(TipoParametro parametro) {
// cuerpo
return valor;
}
Ejemplo 1: función simple
double calcularISR(double salario) {
return salario * 0.10;
}
void main() {
double isr = calcularISR(25000);
print("ISR a retener: \$$isr");
}
Salida: ISR a retener: $2,500
Ejemplo 2: función con múltiples parámetros
double calcularSalarioNeto(double bruto, double bonos, double deducciones) {
return bruto + bonos - deducciones;
}
void main() {
double neto = calcularSalarioNeto(20000, 3000, 2500);
print("Salario neto final: \$$neto");
}
Salida: Salario neto final: $20,500
Parámetros opcionales con nombre
Dart permite parámetros con nombre usando llaves {}.
void registrarEmpleado({String nombre = "Sin nombre", String empresa = "FEMSA"}) {
print("$nombre trabaja en $empresa.");
}
void main() {
registrarEmpleado(nombre: "Ana Torres", empresa: "Bimbo");
registrarEmpleado(nombre: "Luis Mendoza");
}
Salida:
Ana Torres trabaja en Bimbo.
Luis Mendoza trabaja en FEMSA.
Errores comunes
1. Confundir / con ~/
int dias = 30;
int semanas = dias / 7; // ❌ Error: resultado es double, no int
int semanas2 = dias ~/ 7; // ✅ Correcto: división entera
Dart no convierte automáticamente double a int. Usa ~/ cuando necesites un entero.
2. Olvidar el tipo en listas
List ventas = [1000, "error", true]; // ❌ Sin tipo, acepta cualquier cosa
List<double> ventas2 = [45000, 62000, 38000]; // ✅ Tipado correcto
Declara siempre el tipo de una lista para evitar errores difíciles de detectar.
3. Usar var para valores que deben ser constantes
var iva = 0.16;
iva = 0.20; // No da error, pero el IVA no debería cambiar
const double iva2 = 0.16; // ✅ No se puede modificar accidentalmente
Usa const o final para valores que no deben cambiar durante la ejecución.
4. Olvidar break en un switch
switch (estado) {
case "Jalisco":
print("Guadalajara");
// ❌ Sin break: cae al siguiente caso
case "Nuevo León":
print("Monterrey");
break;
}
Cada case debe terminar con break para evitar que el código continúe ejecutando casos siguientes.
Resumen de la sintaxis básica
| Concepto | Ejemplo rápido |
|---|---|
| Variable tipada | int edad = 30; |
| Constante | const double iva = 0.16; |
| Interpolación | "Hola $nombre" |
| Condicional | if (salario > 20000) { ... } |
| Ciclo | for (int i = 0; i < 5; i++) { ... } |
| Función | double calcular(double x) { return x; } |
Dart prioriza el tipado fuerte. Declarar el tipo correcto desde el inicio evita la mayoría de los errores en tiempo de ejecución.