← Flutter & Dart

Fundamentos de Dart

¿Cuáles son los tipos de datos básicos de Dart y qué diferencia hay entre `dynamic`, `Object` y `var`?

Ver respuesta — intenta responderla en voz alta primero

Los tipos básicos son int, double, num, String, bool, List, Set, Map y los símbolos Runes. int y double son subtipos de num. La diferencia clave: var infiere un tipo fijo al compilar, Object acepta cualquier valor pero solo expone métodos de Object, y dynamic desactiva la verificación de tipos (peligroso).

Dart es un lenguaje fuertemente tipado con inferencia. Sus tipos numéricos:

  • int: enteros (sin decimales).
  • double: números con decimales.
  • num: el "padre" de int y double. Sirve cuando puede ser cualquiera de los dos.

Otros tipos comunes: String (texto), bool (true/false), List (arreglos), Set (elementos únicos) y Map (clave-valor).

Las tres formas de "no comprometerte con un tipo":

  • var: NO es un tipo. Es inferencia: Dart deduce el tipo al compilar y a partir de ahí lo fija. var x = 5; hace x de tipo int para siempre.
  • Object (u Object?): acepta cualquier valor, pero solo puedes usar métodos que existan en Object (como toString()). El compilador te obliga a verificar el tipo antes de usarlo como algo específico.
  • dynamic: apaga la verificación de tipos. Puedes llamar cualquier método y el error, si lo hay, explota en tiempo de ejecución. Úsalo lo menos posible.
void main() {
  int entero = 42;
  double decimal = 3.14;
  num cualquiera = 10; // puede ser int o double
  String texto = "Flutter";
  bool activo = true;

  // var: el tipo queda fijo tras la inferencia
  var edad = 25; // edad es int
  // edad = "veinte"; // Error: no puedes asignar String a un int

  // Object: acepta todo, pero limita los métodos
  Object algo = "hola";
  print(algo.toString()); // OK
  // print(algo.length); // Error: Object no tiene .length

  // dynamic: sin verificación (peligroso)
  dynamic libre = "hola";
  print(libre.length); // 4, funciona en runtime
  libre = 10;
  // print(libre.length); // Explota en runtime: int no tiene .length
}

Usar dynamic "por comodidad" para no pensar en tipos. Eso tira a la basura una de las mayores ventajas de Dart: que el compilador atrapa errores antes de ejecutar. Si de verdad no sabes el tipo, casi siempre Object? con una verificación (is) es más seguro que dynamic.

"Dart tiene tipos como int, double (ambos hijos de num), String, bool, List, Set y Map. Para casos donde no fijo el tipo, var deja que Dart lo infiera y luego lo mantiene fijo; Object acepta cualquier valor pero me obliga a verificar el tipo antes de usarlo; y dynamic desactiva la verificación, lo que solo uso en casos muy puntuales porque los errores se mueven a tiempo de ejecución."

Reto rápido

¿Qué diferencia hay entre estas dos declaraciones?

var a = 5;
dynamic b = 5;
Ver respuesta

a queda con tipo int fijo: si intentas a = "hola" da error al compilar. b es dynamic: puedes reasignarle un String sin problema (b = "hola"), porque no hay verificación de tipos. var es seguro; dynamic traslada los errores a tiempo de ejecución.