Introducción
¡Bienvenido al fascinante mundo de Dart! Si estás interesado en desarrollar aplicaciones móviles con Flutter, has llegado al lugar indicado. Dart es el lenguaje de programación que impulsa a Flutter, y comprender sus fundamentos es esencial para crear aplicaciones increíbles.
En esta guía, exploraremos los conceptos básicos de Dart de una manera clara y concisa, con ejemplos sencillos y un enfoque en su aplicación en Flutter. ¡Prepárate para un viaje emocionante!
¿Qué es Dart?
Dart es un lenguaje de programación moderno, de código abierto, desarrollado por Google. Se caracteriza por ser:
- Rápido: Dart se compila a código nativo, lo que resulta en un rendimiento excelente en dispositivos móviles.
- Portable: Puedes usar Dart para crear aplicaciones que se ejecutan en diferentes plataformas, como Android, iOS, web y escritorio.
- Fácil de aprender: Su sintaxis es clara y concisa, similar a la de otros lenguajes populares como Java o JavaScript, lo que facilita su aprendizaje.
Dart es un lenguaje orientado a objetos y con tipado estático, lo que significa que el tipo de las variables se verifica en tiempo de compilación. Esto ayuda a prevenir errores y a mejorar la calidad del código.
Aunque Dart se utiliza principalmente para el desarrollo móvil con Flutter, también se puede usar para crear aplicaciones web, de escritorio y de servidor.
Historia de Dart
Dart nació en Google en 2011, con el objetivo de ofrecer una alternativa moderna a JavaScript para el desarrollo web. En sus inicios, Dart se enfocaba en la creación de aplicaciones web complejas, pero con la llegada de Flutter en 2017, su popularidad se disparó.
Flutter, un framework de interfaz de usuario de Google, adoptó a Dart como su lenguaje de programación, lo que impulsó su crecimiento y lo convirtió en una opción popular para el desarrollo móvil multiplataforma.
¿Por qué Dart es ideal para Flutter?
Dart tiene varias características que lo hacen ideal para el desarrollo con Flutter:
- Compilación a código nativo: Dart se compila directamente a código nativo de ARM o x86, lo que proporciona un rendimiento excepcional en dispositivos móviles.
- Facilidad de aprendizaje: Su sintaxis clara y concisa facilita su aprendizaje, incluso para aquellos que son nuevos en la programación.
- Flexibilidad: Dart es un lenguaje multiparadigma que soporta programación orientada a objetos, imperativa y funcional.
- Hot reload: Una de las características más apreciadas por los desarrolladores de Flutter es el “hot reload” de Dart. Esta funcionalidad permite ver los cambios en el código reflejados instantáneamente en la aplicación, lo que acelera el proceso de desarrollo y facilita la experimentación.
En resumen, Dart es un lenguaje poderoso y versátil que se complementa perfectamente con Flutter para crear aplicaciones móviles de alto rendimiento. ¡En la siguiente sección, veremos cómo empezar a usar Dart!
Empezando con Dart
¡Manos a la obra! En esta sección, exploraremos las herramientas que necesitas para empezar a escribir código en Dart y experimentar con este lenguaje. Afortunadamente, no necesitas instalar nada en tu computadora para comenzar, ya que utilizaremos una herramienta online muy práctica.
Herramientas para desarrollo en Dart
- DartPad (editor online): DartPad es un editor online desarrollado por Google que te permite escribir y ejecutar código Dart directamente en tu navegador web. Es una excelente opción para principiantes, ya que no requiere instalación ni configuración. Simplemente visita la página de DartPad y empieza a codificar. DartPad ofrece un entorno sencillo e intuitivo, con resaltado de sintaxis, autocompletado y una consola para ver los resultados de tu código. Es ideal para aprender los fundamentos de Dart y experimentar con ejemplos sencillos.
- IDEs populares (Visual Studio Code, IntelliJ IDEA, Android Studio): Si bien DartPad es perfecto para empezar, a medida que tus proyectos crezcan en complejidad, es recomendable utilizar un IDE (Entorno de Desarrollo Integrado) más completo. Algunos de los IDEs más populares para Dart y Flutter son:
- Visual Studio Code: Un editor de código ligero y versátil con una gran cantidad de extensiones para Dart y Flutter.
- IntelliJ IDEA: Un IDE robusto y completo con soporte avanzado para Dart y Flutter.
- Android Studio: El IDE oficial para el desarrollo de aplicaciones Android, que también ofrece un excelente soporte para Flutter.
En esta guía, utilizaremos DartPad para los ejemplos de código, ya que es la forma más sencilla de empezar. Sin embargo, te animamos a explorar los diferentes IDEs y elegir el que mejor se adapte a tus necesidades.
¡En la siguiente sección, nos adentraremos en los fundamentos del lenguaje Dart!
Fundamentos del lenguaje
¡Es hora de sumergirnos en el código! En esta sección, aprenderemos la estructura básica de un programa en Dart y cómo trabajar con variables, los bloques de construcción fundamentales de cualquier programa.
Estructura básica de un programa Dart
Todo programa en Dart comienza con una función especial llamada main()
. Esta función es el punto de entrada de la aplicación, es decir, el lugar donde el código comienza a ejecutarse. Veamos un ejemplo sencillo:
Dart
void main() {
print('¡Hola, mundo!');
}
En este código:
void
indica que la funciónmain()
no devuelve ningún valor.main()
es el nombre de la función principal.- Las llaves
{}
encierran el código que se ejecutará dentro de la función. print('¡Hola, mundo!');
es una instrucción que imprime el texto “¡Hola, mundo!” en la consola.
Puedes ejecutar este código en DartPad y ver el resultado en la consola. ¡Inténtalo!
Variables
Las variables son contenedores que almacenan datos en la memoria. En Dart, puedes declarar una variable usando la palabra clave var
, seguida del nombre de la variable. Por ejemplo:
Dart
var nombre = 'Ana';
var edad = 30;
En este código, hemos declarado dos variables:
nombre
: almacena el texto “Ana”.edad
: almacena el número 30.
Dart infiere automáticamente el tipo de dato de la variable a partir del valor que le asignamos. En este caso, nombre
es de tipo String
(cadena de texto) y edad
es de tipo int
(número entero).
También puedes declarar variables con un tipo de dato específico:
Dart
String ciudad = 'Madrid';
int temperatura = 25;
Esto es útil para asegurar la consistencia del código y evitar errores.
Tipos de datos básicos:
Dart ofrece varios tipos de datos básicos:
int
: números enteros (ej. 10, -5, 0).double
: números con decimales (ej. 3.14, -2.5).String
: cadenas de texto (ej. “Hola”, ‘Dart’).bool
: valores booleanos (verdadero o falso,true
ofalse
).
Ejemplo en Flutter:
Veamos un ejemplo sencillo de cómo usar variables en Flutter para mostrar información en un widget Text
:
Dart
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
String mensaje = '¡Hola desde Dart!';
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Ejemplo de variables'),
),
body: Center(
child: Text(mensaje),
),
),
);
}
}
En este código, la variable mensaje
almacena el texto “¡Hola desde Dart!”, que luego se muestra en el widget Text
.
Tipos de datos
Ya conocimos algunos tipos de datos básicos en Dart, como int
, double
, String
y bool
. Ahora, vamos a profundizar en ellos y a explorar otros tipos de datos importantes:
1. Números:
int
: Representa números enteros, como 10, -5, 0.double
: Representa números con decimales, como 3.14, -2.5.
Puedes realizar operaciones aritméticas con ambos tipos de datos, como suma, resta, multiplicación y división.
Ejemplo:
Dart
int a = 10;
double b = 5.5;
double resultado = a + b; // resultado será 15.5
2. Cadenas de texto (String
):
Las cadenas de texto se definen entre comillas simples o dobles.
Ejemplo:
Dart
String nombre = 'Juan';
String saludo = "Hola, $nombre"; // "Hola, Juan"
Dart permite interpolar variables dentro de una cadena usando el símbolo $
.
3. Booleanos (bool
):
Representan valores de verdad: true
(verdadero) o false
(falso). Se utilizan en expresiones condicionales y bucles.
Ejemplo:
Dart
bool esMayorDeEdad = true;
4. Listas (List
):
Las listas son colecciones ordenadas de elementos. Se definen entre corchetes []
.
Ejemplo:
Dart
List<String> nombres = ['Ana', 'Luis', 'María'];
Puedes acceder a los elementos de una lista por su índice (empezando desde 0):
Dart
String primerNombre = nombres[0]; // "Ana"
5. Mapas (Map
):
Los mapas almacenan pares clave-valor. Se definen entre llaves {}
.
Ejemplo:
Dart
Map<String, int> edades = {
'Ana': 30,
'Luis': 25,
};
Puedes acceder a un valor por su clave:
Dart
int edadDeAna = edades['Ana']; // 30
Operadores
Los operadores son símbolos que se utilizan para realizar operaciones con datos. Dart ofrece una variedad de operadores:
1. Operadores aritméticos:
+
: Suma-
: Resta*
: Multiplicación/
: División%
: Módulo (resto de la división)
Ejemplo:
Dart
int a = 10;
int b = 5;
int suma = a + b; // 15
2. Operadores de comparación:
==
: Igual a!=
: Diferente de>
: Mayor que<
: Menor que>=
: Mayor o igual que<=
: Menor o igual que
Ejemplo:
Dart
int a = 10;
int b = 5;
bool sonIguales = a == b; // false
3. Operadores lógicos:
&&
: AND lógico (y)||
: OR lógico (o)!
: NOT lógico (no)
Ejemplo:
Dart
bool esMayor = edad >= 18;
bool tieneLicencia = true;
bool puedeConducir = esMayor && tieneLicencia;
4. Operadores de asignación:
=
: Asignación simple+=
: Suma y asignación-=
: Resta y asignación*=
: Multiplicación y asignación/=
: División y asignación
Ejemplo:
Dart
int a = 10;
a += 5; // a ahora vale 15
Ejemplo en Flutter:
Dart
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
int contador = 0;
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Ejemplo de Operadores'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
contador++;
print('Contador: $contador');
},
child: Text('Presioname'),
),
),
),
);
}
}
En este ejemplo, se utiliza el operador de asignación +=
para incrementar el valor de la variable contador
cada vez que se presiona el botón. El operador $
se utiliza para mostrar el valor actualizado del contador en la consola.
Control de flujo
El control de flujo se refiere al orden en que se ejecutan las instrucciones en un programa. Dart ofrece varias estructuras para controlar este flujo:
1. Condicionales (if
, else if
, else
)
Permiten ejecutar un bloque de código solo si se cumple una condición.
Ejemplo:
Dart
int edad = 20;
if (edad >= 18) {
print('Eres mayor de edad');
} else {
print('Eres menor de edad');
}
2. Bucles (for
, while
, do-while
)
Permiten repetir un bloque de código varias veces.
for
: Se utiliza cuando se conoce el número de iteraciones.
Ejemplo:
Dart
for (int i = 0; i < 5; i++) {
print(i); // Imprime 0, 1, 2, 3, 4
}
while
: Se utiliza cuando no se conoce el número de iteraciones y la condición se evalúa al principio del bucle.
Ejemplo:
Dart
int contador = 0;
while (contador < 5) {
print(contador);
contador++;
}
do-while
: Similar awhile
, pero la condición se evalúa al final del bucle, por lo que el bloque de código se ejecuta al menos una vez.
Ejemplo:
Dart
int contador = 0;
do {
print(contador);
contador++;
} while (contador < 5);
3. Sentencias de control (break
, continue
)
break
: Termina la ejecución de un bucle.continue
: Salta a la siguiente iteración del bucle.
Ejemplo:
Dart
for (int i = 0; i < 10; i++) {
if (i == 5) {
break; // Sale del bucle cuando i es 5
}
print(i); // Imprime 0, 1, 2, 3, 4
}
Funciones
Las funciones son bloques de código reutilizables que realizan una tarea específica.
Definición de una función:
Dart
int sumar(int a, int b) {
return a + b;
}
En este ejemplo:
int
es el tipo de dato que devuelve la función.sumar
es el nombre de la función.(int a, int b)
son los parámetros de la función.return a + b;
devuelve la suma dea
yb
.
Llamada a una función:
Dart
int resultado = sumar(5, 3); // resultado será 8
Funciones anónimas (funciones flecha):
Son funciones sin nombre que se pueden definir en línea.
Ejemplo:
Dart
var multiplicar = (int a, int b) => a * b;
int resultado = multiplicar(5, 3); // resultado será 15
Ejemplo en Flutter:
Dart
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Ejemplo de Funciones'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
mostrarMensaje('¡Hola desde una función!');
},
child: Text('Presioname'),
),
),
),
);
}
void mostrarMensaje(String mensaje) {
print(mensaje);
}
}
En este ejemplo, la función mostrarMensaje
se define para imprimir un mensaje en la consola. Se llama a esta función cuando se presiona el botón.
Con esto, hemos cubierto los fundamentos del control de flujo y las funciones en Dart. ¡En la siguiente sección, exploraremos conceptos clave como final
, const
, clases y null safety!
Conceptos clave
En esta sección, exploraremos algunos conceptos clave en Dart que son fundamentales para escribir código eficiente y robusto. Aprenderemos sobre las palabras clave final
y const
, y daremos una introducción a las clases y objetos, los pilares de la programación orientada a objetos.
Palabras clave final
y const
En Dart, las variables pueden ser modificadas después de ser declaradas. Sin embargo, hay situaciones en las que queremos que una variable mantenga su valor inicial durante toda la ejecución del programa. Para esto, utilizamos las palabras clave final
y const
.
final
:
- Se utiliza para declarar una variable cuyo valor se asignará una sola vez y no podrá ser modificado posteriormente.
- El valor de una variable
final
puede ser conocido en tiempo de ejecución.
Ejemplo:
Dart
final nombre = 'Ana';
nombre = 'Luis'; // Error: no se puede modificar una variable final
const
:
- Similar a
final
, pero el valor de una variableconst
debe ser conocido en tiempo de compilación. - Se utiliza para declarar constantes que no cambiarán durante la ejecución del programa.
Ejemplo:
Dart
const pi = 3.14159;
Diferencias entre final
y const
:
final
se utiliza cuando el valor se conoce en tiempo de ejecución, mientras queconst
se utiliza cuando el valor se conoce en tiempo de compilación.- Las variables
const
son implícitamentefinal
, pero no todas las variablesfinal
sonconst
.
Ejemplos en el contexto de Flutter:
En Flutter, las variables final
se utilizan a menudo para almacenar propiedades de widgets que no cambiarán después de la creación del widget.
Dart
class MiWidget extends StatelessWidget {
final String titulo;
MiWidget({required this.titulo});
@override
Widget build(BuildContext context) {
return Text(titulo);
}
}
En este ejemplo, titulo
es una variable final
que se inicializa en el constructor del widget.
Clases y objetos (introducción)
La programación orientada a objetos (POO) es un paradigma de programación que se basa en el concepto de “objetos”. Un objeto es una entidad que tiene propiedades (atributos) y comportamiento (métodos).
Las clases son plantillas o planos para crear objetos. Definen las propiedades y métodos que tendrán los objetos de esa clase.
Ejemplo:
Dart
class Perro {
String nombre;
int edad;
Perro(this.nombre, this.edad);
void ladrar() {
print('Guau!');
}
}
En este ejemplo, Perro
es una clase que tiene dos propiedades (nombre
y edad
) y un método (ladrar
).
Para crear un objeto a partir de una clase, se utiliza el constructor:
Dart
var miPerro = Perro('Fido', 3);
Ahora, miPerro
es un objeto de la clase Perro
con nombre “Fido” y edad 3. Puedes acceder a sus propiedades y métodos:
Dart
print(miPerro.nombre); // Imprime "Fido"
miPerro.ladrar(); // Imprime "Guau!"
Conceptos básicos de la POO:
- Abstracción: Representar las características esenciales de un objeto sin incluir detalles innecesarios.
- Encapsulamiento: Ocultar la complejidad interna de un objeto y exponer solo la información necesaria.
- Herencia: Crear nuevas clases a partir de clases existentes, heredando sus propiedades y métodos.
- Polimorfismo: La capacidad de un objeto de tomar diferentes formas.
Las clases y objetos son fundamentales en el desarrollo con Flutter, ya que los widgets son instancias de clases.
Null safety
Null safety es una característica importante de Dart que ayuda a prevenir errores causados por valores nulos. En muchos lenguajes de programación, una variable puede contener un valor o puede ser null
, lo que indica la ausencia de valor. Acceder a un miembro de una variable null
puede provocar errores en tiempo de ejecución.
Dart introduce null safety para evitar estos errores. Por defecto, las variables en Dart no pueden ser null
. Si intentas asignar null
a una variable que no lo permite, el compilador generará un error.
Ejemplo:
Dart
String nombre = null; // Error: la variable nombre no puede ser null
Para permitir que una variable sea null
, debes agregar el operador ?
al tipo de dato:
Dart
String? nombre = null; // Correcto: la variable nombre puede ser null
Operador de acceso condicional a miembros (?.
)
Este operador permite acceder a un miembro de una variable solo si no es null
.
Ejemplo:
Dart
String? nombre = 'Ana';
int? longitud = nombre?.length; // longitud será 3
Si nombre
fuera null
, longitud
también sería null
.
Operador de coalescencia nula (??
)
Este operador proporciona un valor por defecto si una variable es null
.
Ejemplo:
Dart
String? nombre = null;
String nombreAMostrar = nombre ?? 'Desconocido'; // nombreAMostrar será "Desconocido"
Null safety ayuda a escribir código más seguro y robusto, ya que previene errores comunes relacionados con valores nulos.
Colecciones
Las colecciones son estructuras de datos que permiten almacenar un grupo de elementos. Dart ofrece varias colecciones:
1. Listas (List
)
- Colecciones ordenadas de elementos.
- Se definen entre corchetes
[]
. - Puedes acceder a los elementos por su índice (empezando desde 0).
Ejemplo:
Dart
List<int> numeros = [1, 2, 3, 4, 5];
int primerNumero = numeros[0]; // 1
2. Sets (Set
)
- Colecciones no ordenadas de elementos únicos.
- Se definen entre llaves
{}
precedidas de la palabra claveSet
.
Ejemplo:
Dart
Set<String> colores = {'rojo', 'verde', 'azul'};
3. Mapas (Map
)
- Colecciones de pares clave-valor.
- Se definen entre llaves
{}
. - Puedes acceder a un valor por su clave.
Ejemplo:
Dart
Map<String, int> edades = {
'Ana': 30,
'Luis': 25,
};
Iterar sobre colecciones:
Puedes usar un bucle for
para iterar sobre los elementos de una colección.
Ejemplo:
Dart
List<String> nombres = ['Ana', 'Luis', 'María'];
for (String nombre in nombres) {
print(nombre);
}
Ejemplo en Flutter:
Las colecciones se utilizan en Flutter para mostrar datos en widgets como ListView
y GridView
.
Dart
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
final List<String> elementos = ['Elemento 1', 'Elemento 2', 'Elemento 3'];
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Ejemplo de Listas'),
),
body: ListView.builder(
itemCount: elementos.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(elementos[index]),
);
},
),
),
);
}
}
En este ejemplo, se utiliza una lista elementos
para mostrar una lista de elementos en un ListView
.
Con esto, hemos cubierto los conceptos clave de null safety y colecciones en Dart. ¡En la siguiente sección, veremos algunos ejemplos de cómo integrar Dart con Flutter!
Dart y Flutter: Ejemplos de integración
¡Llegó el momento de conectar la teoría con la práctica! Veamos cómo los conceptos de Dart que hemos aprendido se materializan en el desarrollo de aplicaciones Flutter con ejemplos más elaborados.
1. Mostrar variables en un widget Text
Más allá de mostrar simples variables, podemos usar Dart para manipular la información antes de presentarla en un widget Text
. Imagina que tienes una aplicación que saluda al usuario según la hora del día.
Dart
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
DateTime now = DateTime.now();
String saludo;
if (now.hour < 12) {
saludo = 'Buenos días';
} else if (now.hour < 18) {
saludo = 'Buenas tardes';
} else {
saludo = 'Buenas noches';
}
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Saludo dinámico'),
),
body: Center(
child: Text(
'$saludo, usuario!',
style: TextStyle(fontSize: 24),
),
),
),
);
}
}
En este ejemplo, usamos DateTime.now()
para obtener la hora actual. Luego, con una estructura condicional if-else if-else
, definimos el saludo apropiado. Finalmente, mostramos el saludo en un Text
con un estilo personalizado.
2. Crear una lista con ListView
y datos dinámicos
En lugar de una lista estática, podemos crear una lista con datos dinámicos, por ejemplo, una lista de tareas.
Dart
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
List<String> tareas = ['Comprar pan', 'Pasear al perro', 'Llamar a mamá'];
void _agregarTarea(String nuevaTarea) {
setState(() {
tareas.add(nuevaTarea);
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Lista de tareas'),
),
body: ListView.builder(
itemCount: tareas.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(tareas[index]),
);
},
),
floatingActionButton: FloatingActionButton(
onPressed: () {
showDialog(
context: context,
builder: (context) {
String nuevaTarea = '';
return AlertDialog(
title: Text('Nueva tarea'),
content: TextField(
onChanged: (value) {
nuevaTarea = value;
},
),
actions: [
TextButton(
onPressed: () {
Navigator.of(context).pop();
},
child: Text('Cancelar'),
),
TextButton(
onPressed: () {
_agregarTarea(nuevaTarea);
Navigator.of(context).pop();
},
child: Text('Agregar'),
),
],
);
},
);
},
child: Icon(Icons.add),
),
),
);
}
}
Aquí, la lista tareas
se actualiza dinámicamente al agregar nuevas tareas a través de un AlertDialog
y un TextField
. Este ejemplo, aunque sencillo, muestra cómo interactuar con el usuario y modificar la UI usando Dart y Flutter.
3. Usar funciones para la lógica de la aplicación
Las funciones son esenciales para organizar y reutilizar el código. Podemos crear funciones para realizar cálculos, validar datos, o incluso para construir widgets complejos.
Dart
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Calculadora de IMC'),
),
body: Center(
child: CalculadoraIMC(),
),
),
);
}
}
class CalculadoraIMC extends StatefulWidget {
@override
_CalculadoraIMCState createState() => _CalculadoraIMCState();
}
class _CalculadoraIMCState extends State<CalculadoraIMC> {
final _formKey = GlobalKey<FormState>();
final _pesoController = TextEditingController();
final _alturaController = TextEditingController();
double _calcularIMC(double peso, double altura) {
return peso / (altura * altura);
}
String _interpretarIMC(double imc) {
if (imc < 18.5) {
return 'Bajo peso';
} else if (imc < 25) {
return 'Peso normal';
} else if (imc < 30) {
return 'Sobrepeso';
} else {
return 'Obesidad';
}
}
@override
Widget build(BuildContext context) {
return Form(
key: _formKey,
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
TextFormField(
controller: _pesoController,
keyboardType: TextInputType.number,
decoration: InputDecoration(labelText: 'Peso (kg)'),
validator: (value) {
if (value == null || value.isEmpty) {
return 'Por favor ingresa tu peso';
}
return null;
},
),
TextFormField(
controller: _alturaController,
keyboardType: TextInputType.number,
decoration: InputDecoration(labelText: 'Altura (m)'),
validator: (value) {
if (value == null || value.isEmpty) {
return 'Por favor ingresa tu altura';
}
return null;
},
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
if (_formKey.currentState!.validate()) {
double peso = double.parse(_pesoController.text);
double altura = double.parse(_alturaController.text);
double imc = _calcularIMC(peso, altura);
String interpretacion = _interpretarIMC(imc);
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text('Tu IMC'),
content: Text('Tu IMC es: $imc\n$interpretacion'),
actions: [
TextButton(
onPressed: () {
Navigator.of(context).pop();
},
child: Text('Aceptar'),
),
],
);
},
);
}
},
child: Text('Calcular'),
),
],
),
),
);
}
}
En este ejemplo más completo, se crea una calculadora de IMC (Índice de Masa Corporal). Se utilizan funciones para calcular el IMC (_calcularIMC
) e interpretar el resultado (_interpretarIMC
). Además, se muestra cómo usar un Form
y TextFormField
para obtener la entrada del usuario y validar los datos.
Estos ejemplos ilustran cómo Dart se integra con Flutter para crear interfaces de usuario interactivas y dinámicas. La combinación de la potencia y flexibilidad de Dart con la facilidad de uso de Flutter abre un mundo de posibilidades para el desarrollo de aplicaciones móviles.
Preguntas y respuestas
A continuación, responderemos algunas preguntas frecuentes que pueden surgir al aprender Dart, especialmente para aquellos que se inician en el lenguaje:
1. ¿Cuál es la diferencia entre var
, final
y const
?
var
: Se utiliza para declarar una variable cuyo valor puede cambiar durante la ejecución del programa. Dart infiere el tipo de dato automáticamente.final
: Se utiliza para declarar una variable cuyo valor se asignará una sola vez y no podrá ser modificado posteriormente. El valor puede ser conocido en tiempo de ejecución.const
: Similar afinal
, pero el valor debe ser conocido en tiempo de compilación. Se utiliza para declarar constantes.
2. ¿Qué es null safety y por qué es importante?
Null safety es una característica de Dart que ayuda a prevenir errores causados por valores nulos. Al garantizar que las variables no sean null
a menos que se especifique lo contrario, se evitan errores en tiempo de ejecución y se mejora la robustez del código.
3. ¿Cómo puedo acceder a los elementos de una lista en Dart?
Puedes acceder a los elementos de una lista por su índice, utilizando la sintaxis lista[indice]
. Los índices comienzan desde 0.
Ejemplo:
Dart
List<String> nombres = ['Ana', 'Luis', 'María'];
String primerNombre = nombres[0]; // "Ana"
4. ¿Qué tipos de bucles existen en Dart?
Dart ofrece tres tipos de bucles:
for
: Se utiliza cuando se conoce el número de iteraciones.while
: Se utiliza cuando no se conoce el número de iteraciones y la condición se evalúa al principio del bucle.do-while
: Similar awhile
, pero la condición se evalúa al final del bucle.
5. ¿Cómo puedo definir una función en Dart?
Para definir una función en Dart, se utiliza la siguiente sintaxis:
Dart
tipoDeRetorno nombreDeLaFuncion(parametros) {
// Código de la función
return valor; // Opcional, si la función devuelve un valor
}
Ejemplo:
Dart
int sumar(int a, int b) {
return a + b;
}
Puntos relevantes
- Dart es un lenguaje de programación moderno, rápido y fácil de aprender, ideal para el desarrollo de aplicaciones móviles con Flutter.
- Las variables en Dart pueden ser declaradas con
var
,final
oconst
, según si su valor puede cambiar o no. - Dart ofrece varios tipos de datos, como
int
,double
,String
,bool
,List
yMap
. - El control de flujo se maneja con estructuras condicionales (
if-else
) y bucles (for
,while
,do-while
). - Las funciones son bloques de código reutilizables que realizan una tarea específica.
- Null safety ayuda a prevenir errores causados por valores nulos.
- Las clases y objetos son la base de la programación orientada a objetos en Dart.
Conclusión
¡Felicidades por llegar al final de esta guía de Dart para principiantes! Has dado un paso importante en tu camino para convertirte en un desarrollador Flutter.
Recuerda que la práctica es clave para dominar cualquier lenguaje de programación. Te animamos a que explores DartPad, experimentes con los ejemplos de código, y construyas tus propias aplicaciones sencillas.
El mundo del desarrollo móvil está en constante evolución, y Dart junto con Flutter son herramientas poderosas para crear aplicaciones innovadoras. ¡Sigue aprendiendo y explorando las infinitas posibilidades que te ofrece este lenguaje!
Recursos adicionales:
- Documentación oficial de Dart
- DartPad
- Tutoriales de Dart en YouTube [se quitó una URL no válida]
Sugerencias de siguientes pasos
Ahora que ya tienes una base sólida en Dart, puedes continuar tu aprendizaje con estos temas:
- Widgets básicos de Flutter: Explora los widgets fundamentales para construir interfaces de usuario, como
Text
,Image
,Container
,Row
,Column
, etc. - Layout en Flutter: Aprende a diseñar la estructura de tu aplicación con diferentes layouts, como
LinearLayout
,Flex
,Grid
, yStack
. - Gestión de estados en Flutter: Descubre cómo manejar el estado de tu aplicación con enfoques como
setState
,Provider
,BLoC
, etc.
Invitación a la acción
¡No te quedes solo con la teoría! Te invitamos a poner en práctica tus conocimientos de Dart y Flutter. Intenta crear una aplicación sencilla, como una calculadora, una lista de tareas, o un juego simple.
Experimenta, explora, y diviértete mientras aprendes. ¡El límite es tu imaginación!