Declaración de Variables en Dart

Author
Por Darío Rivera
Publicado el en Flutter

En un post anterior vimos el abanico de Tipos de Datos en Dart de los cuales disponemos. El día de hoy veremos que para declarar variables en Dart de cualquier tipo podemos utilizar la palabra reservada var o dynamic. También podemos utilizar la sintaxis típica de Java para crear variables de un tipo específico.

Reglas para el nombrado de variables

Case-Sensitivity: Todos los nombres de variables son sensibles a mayúsculas y minúsculas, lo cual indica que la variable num es distinta a la variable Num.

Label-Rule: Las variables deben comenzar con una letra o un guión al piso ( _ ), seguido de una combinación de letras, números y guiones al piso.

Not-Keyword: Las nombres de variables no puedes ser iguales a una palabra reservada del lenguaje Dart.

Inferencia de tipos

La palabra reservada var se utiliza para declarar e inicializar variables utilizando la inferencia automática. Es decir, Dart infiere el tipo de dato que tendrá la variable basado en el valor asignado.

var name = 'Bob';

También es posible declara una variable y posteriormente inicializarla con un valor. El ejemplo anterior se puede reescribir como sigue.

var name;
name = 'Bob'

Declaración explícita

También podemos declarar explícitamente una variable indicando el tipo de dato que guardará.

String name = 'Bob';

Null Safety

Esta característica del lenguaje Dart permite evitar comportamientos inesperados con variables que no han sido inicializadas con un valor. Si Null Safety está activado no podrás utilizar una variable que no ha sido inicializada con un valor, si Null Safety está desactivado podrás utilizar la variable y su valor será nulo.

Variables locales

Sin Null Safety puedes utilizar una variable local que no ha sido inicializada y su valor será Null.

String name;
print(name.runtimeType);   // Null

Este mismo ejemplo arrojaría el siguiente error con Null Safety.

Error: Non-nullable variable 'name' must be assigned before it can be used.
  print(name.runtimeType);
        ^^^^
Error: Compilation failed.

Sin embargo, si lo que deseas realmente es utilizar la variable antes de ser inicializada la manera de hacerlo con Null Safety activado sería la siguiente.

String? name;
print(name.runtimeType);   // Null

Atributos de clase

Si la declaración de la variable ocurre como propiedad de una clase puedes omitir el valor de inicialización sin Null Safety.

void main()
{
  var person = Person();
  print(person.name);  // null
}

class Person {
  String name;
}

Este mismo ejemplo arrojaría el siguiente error con Null Safety.

Error: Field 'name' should be initialized because its type 'String' doesn't allow null.
  String name;
         ^^^^
Error: Compilation failed.

Sin embargo, si lo que deseas realmente es utilizar la variable antes de ser inicializada la manera de hacerlo con Null Safety es similar a la vista con variables locales.

String? name;

NOTA: La única diferencia con las variables locales cuando Null Safety está activado es que en una variable local debes asegurarte de inicializar la variable antes de utilizarla.

Localmente con Null Safety podemos solo inicializar la variable y después inicializarla.

String name;
name = 'Bob';
print(name.runtimeType);   // Null

En una clase, no puede existir una variable sin inicializar con Null Safety de la siguiente manera porque arrojaría un error el compilador.

class Person {
  String name;
}

late

Cuando Null Safety está activado, en algunas ocasiones es necesario indicar explícitamente que inicializaremos una variable no nula posteriormente. Dart no siempre puede asumir que una variable será inicializada más adelante, como en el caso de las variables de alto nivel. El siguiente ejemplo arrojaría un error en Dart.

String description;

void main() {
  description = 'Feijoada!';
  print(description);
}

En este caso, estamos seguros que inicializaremos la varible, por lo cual podemos indicárselo a Dart con la palabra reserva late.

late String description;

Esto mismo puede ser usado también con las variables de instancia.

void main() {
  var person = Person();
  person.name = 'Bob';
  print(person.name);
}

class Person {
  late String name;
}

Si la variable no es inicializada antes de utilizarla Dart arrojará el siguiente error.

Uncaught Error: LateInitializationError: Field 'name' has not been initialized.

const y final

Si no se tiene la intención de cambiar el valor de una variable, esta debería poderse definir como constante o final. Veamos el siguiente ejemplo en el cual definimos una lista.

var foo = const [1, 2, 3];

Esta sentencia también se puede reescribir así:

const foo = [1, 2, 3];

También podemos definir el tipo de manera explícita.

const List<int> foo = [1,2,3];

Cualquiera de estos tres ejemplos puede ser reescrito utilizando final en vez de const. Sin embargo solamente las variables de instancia pueden ser final.

class Connection {
  final String type = 'mysql';
}

Dynamic

Otra característica interesante de Dart es que a pesar de ser un lenguaje de tipado estático, permite en ciertos casos utilizar tipado dinámico. Esto permite en esencia que una variable pueda cambiar su tipo en tiempo de ejecución. Veamos el siguiente ejemplo.

dynamic myVar = 'hello world';
myVar = 30;

print(myVar);

Acerca de Darío Rivera

Author

Application Architect at Elentra Corp . Quality developer and passionate learner with 10+ years of experience in web technologies. Creator of EasyHttp , an standard way to consume HTTP Clients.

LinkedIn Twitter Instagram

Sólo aquellos que han alcanzado el éxito saben que siempre estuvo a un paso del momento en que pensaron renunciar.