Funciones en Dart - Flutter

Las funciones en Dart son bloques de código reutilizables que realizan tareas específicas. Son fundamentales para organizar y estructurar tu código en Flutter.

¿Qué es una función?

Una función es un conjunto de instrucciones que se ejecutan cuando la llamas. Puede recibir datos (parámetros) y devolver un resultado.

Sintaxis básica

dart
// Estructura básica de una función
TipoRetorno nombreFuncion(parametros) {
// Código a ejecutar
return valor; // Si devuelve algo
}

1Función simple sin retorno

Las funciones sin retorno no devuelven ningún valor. Se utilizan para realizar acciones, como imprimir mensajes o modificar variables.

dart
void saludar() {
  print('¡Hola mundo!');
}

void main() {
  saludar(); // Llama la función
  // Salida: ¡Hola mundo!
}

2Función con parámetros

Las funciones con parámetros permiten pasar datos a la función para su uso dentro del bloque de código.

dart
void saludarPersona(String nombre) {
  print('Hola, $nombre');
}

void main() {
  saludarPersona('Ana');
  saludarPersona('Carlos');
  // Salida: 
  // Hola, Ana
  // Hola, Carlos
}

3Función que devuelve un valor

Las funciones con retorno permiten devolver un valor al llamador. Esto es útil para obtener resultados de cálculos o operaciones.

dart
int sumar(int a, int b) {
  return a + b;
}

void main() {
  int resultado = sumar(5, 3);
  print('La suma es: $resultado');
  // Salida: La suma es: 8
}

4Función que devuelve texto

Las funciones con retorno de texto permiten devolver una cadena de caracteres. Esto es útil para generar mensajes, nombres o cualquier otro tipo de texto dinámico.

dart
String crearSaludo(String nombre) {
  return 'Bienvenido, $nombre!';
}

void main() {
  String mensaje = crearSaludo('María');
  print(mensaje);
  // Salida: Bienvenido, María!
}

5Función con múltiples parámetros

Las funciones con múltiples parámetros permiten pasar más de un valor a la función. Esto es útil para realizar cálculos o operaciones que dependen de varios factores.

dart
double calcularArea(double largo, double ancho) {
  return largo * ancho;
}

void main() {
  double area = calcularArea(5.0, 3.0);
  print('El área es: $area m²');
  // Salida: El área es: 15.0 m²
}

6Función con parámetros opcionales

Las funciones con parámetros opcionales permiten pasar valores opcionales a la función. Esto es útil cuando no siempre se necesitan todos los parámetros.

dart
String presentarse(String nombre, [int? edad]) {
  if (edad != null) {
      return 'Soy $nombre y tengo $edad años';
  }
  return 'Soy $nombre';
}

void main() {
  print(presentarse('Juan'));
  print(presentarse('Ana', 25));
  // Salida:
  // Soy Juan
  // Soy Ana y tengo 25 años
}

7Función con parámetros con nombre

Las funciones con parámetros con nombre permiten pasar valores a los parámetros por su nombre, lo que hace el código más legible y flexible.

dart
String crearPerfil({required String nombre, String? ciudad}) {
  if (ciudad != null) {
    return '$nombre vive en $ciudad';
  }
  return '$nombre no especificó ciudad';
}

void main() {
  print(crearPerfil(nombre: 'Luis'));
  print(crearPerfil(nombre: 'Sara', ciudad: 'Madrid'));
  // Salida:
  // Luis no especificó ciudad
  // Sara vive en Madrid
}

8Función que devuelve booleano

Las funciones con retorno booleano permiten devolver un valor verdadero o falso. Esto es útil para realizar comprobaciones o validaciones.

dart
bool esMayorDeEdad(int edad) {
  return edad >= 18;
}

void main() {
  bool resultado1 = esMayorDeEdad(20);
  bool resultado2 = esMayorDeEdad(15);
  
  print('20 años: ${resultado1 ? 'Mayor' : 'Menor'}');
  print('15 años: ${resultado2 ? 'Mayor' : 'Menor'}');
  // Salida:
  // 20 años: Mayor
  // 15 años: Menor
}

9Función arrow (función flecha)

Las funciones arrow (función flecha) permiten escribir funciones más concisas, especialmente para funciones simples de una línea.

dart
// Función tradicional
int multiplicar(int a, int b) {
  return a * b;
}

// Función arrow (más corta)
int multiplicarArrow(int a, int b) => a * b;

void main() {
  // Llamadas a las funciones
  print(multiplicar(4, 5));      // 20
  print(multiplicarArrow(4, 5)); // 20
}

10Ejemplo práctico en Flutter

Las funciones pueden ser utilizadas para crear componentes reutilizables y mejorar la organización del código.

dart
import 'package:flutter/material.dart';

class MiApp extends StatelessWidget {
// Función que crea un botón personalizado
Widget crearBoton(String texto, VoidCallback accion) {
  return ElevatedButton(
    onPressed: accion,
    child: Text(texto),
  );
}

// Función que muestra un mensaje
void mostrarMensaje(BuildContext context, String mensaje) {
  ScaffoldMessenger.of(context).showSnackBar(
    SnackBar(content: Text(mensaje)),
  );
}


Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(title: Text('Funciones en Flutter')),
    body: Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          crearBoton('Saludar', () {
            mostrarMensaje(context, '¡Hola desde una función!');
          }),
          SizedBox(height: 20),
          crearBoton('Despedirse', () {
            mostrarMensaje(context, '¡Hasta luego!');
          }),
        ],
      ),
    ),
  );
}
}

Consejos importantes


  Buenas prácticas

  • Usa nombres descriptivos para tus funciones
  • Mantén las funciones pequeñas y enfocadas
  • Usa void cuando no devuelvas nada
  • Especifica el tipo de retorno siempre

  Errores comunes

  • Olvidar el return en funciones que devuelven valores
  • No especificar tipos de parámetros
  • Crear funciones muy largas y complejas

  Cuándo usar cada tipo

  • void: Para acciones que no devuelven nada
  • String: Para generar texto
  • int/double: Para cálculos numéricos
  • bool: Para validaciones
  • Widget: Para crear componentes de UI en Flutter

Las funciones son la base de la programación en Dart. Dominarlas te permitirá escribir código más limpio, reutilizable y fácil de mantener en tus apps de Flutter.