Tabla de Contenido
- Tabla de Contenido
- Introducción
- Palabras clave contextuales
- Palabras clave — indicadores incorporados
- Palabras reservadas en programación asincrónica Dart.
- Conclusión
- Fuentes
Introducción
Ya vimos anteriormente algunas de las palabras reservadas que no se pueden usar como identificadores en Dart, veremos ahora otras palabras clave del lenguaje.
Palabras clave contextuales
Son palabras que solo tienen significado en lugares particulares del lenguaje pero pueden usarse como identificadores en otras partes.
show
Palabra clave que sirve para importar una parte de un paquete.
// Importa sólo color
import 'package:lib/lib.dart' show color;
hide
Palabra clave que sirve para exceptuar cierta parte del paquete al importarlo.
// Importa todo excepto color
import 'package:lib/lib.dart' hide color;
async
Palabra clave que se usa para la programación asíncrona dentro de Dart al igual que await. Hay también otro uso async* para funciones generadoras asíncronas. Una función generadora es una función especial que puede generar una secuencia de valores a medida que se solicitan, en lugar de producir todos los valores de una vez.
// cuando hay un Future nos pide agregar async obligatoriamente.
Future<void> checkVersion() async {
var version = await lookUpVersion();
// otras sentencias
}
Stream<int> asynchronousNaturalsTo(int n) async* {
int k = 0;
while (k < n) yield k++;
}
sync
Palabra clave que se usa para implementar una función se generadora síncrona.
Iterable<int> naturalsNumber(int limit) sync* {
for (int i = 0; i < limit; i++) {
yield i;
}
}
on
Palabra clave que se puede utilizar cuando necesite especificar el tipo de excepción. Cuando se necesite el objeto de la excepción se puede catch.
try {
// sentencias que pueden generar excepción
} on FormatException catch (e) {
// manejo solo de la excepción FormatException
} on NumberException catch (e) {
// manejo solo de la excepción NumberException
} catch (e) {
// Manejo genérico para otras excepciones
}
Palabras clave — indicadores incorporados
Son identificadores válidos en la mayoría de ocasiones, no pueden utilizarse como nombre de clases o tipos, ni como prefijos de importación.
abstract
Palabra clave que se utiliza para declarar las clases abstractas, que son clases que no requiera una implementación completa y concreta de toda su interfaz y por lo general tienen métodos abstractos.
abstract class Shape {
// función abstracta sin implementación
double area();
// función concreto con implementación
void draw() {
print('Dibujando la figura');
}
}
as
Palabra clave que ya conocimos en los operadores, es un operador para asignar un objeto a un tipo determinado sólo si está seguro de que el objeto es de ese tipo.
(employee as Person).firstName = 'Bob';
base
Palabra clave que se utiliza para imponer la herencia de la implementación de una clase o mixin. Una clase base no permite la implementación fuera de su propia biblioteca.
base class Vehicle {
void moveForward(int meters) {
// sentencias
}
}
covariant
Palabra clave que se utiliza en algunos patrones de codificación (que no son muy utilizados) se basan en ajustar un tipo anulando el tipo de un parámetro con un subtipo, que no es válido. Covariant se refiere a la capacidad de usar un tipo más específico en lugar de un tipo más general en situaciones donde se espera el tipo más general.
class Animal {
void chase(Animal x) { ... }
}
class Dog extends Animal { ... }
class Cat extends Animal {
@override
void chase(covariant Mouse x) { ... }
}
deferred
Palabra clave que se utiliza en la carga diferida(lazy loading). La carga diferida permite retrasar la carga de ciertas partes del código hasta que sea necesario, lo que puede mejorar el rendimiento de una aplicación al evitar la carga de código que no se utiliza inmediatamente.
import 'dart:mirrors' deferred as my_lib;
void main() async {
// Se carga de manera diferida la biblioteca 'my_lib'
await my_lib.loadLibrary();
// Se utiliza una función de la biblioteca
my_lib.someFunction();
}
dynamic
Palabra clave que se utiliza para los tipos de datos dinámicos, puede contener cualquier tipo de dato.
dynamic dynamicValue;
dynamicValue = 42;
print("Entero: $dynamicValue");
dynamicValue = "Hola, Mundo!";
print("Cadena: $dynamicValue");
dynamicValue = [1, 2, 3, 4, 5];
print("Lista: $dynamicValue");
export
Palabra reservada que se utiliza en los archivos de tipo barril, para exponer las clases en otros lugares del proyecto y se puedan importar en grupo y no todos por separado.
export 'src/cascade.dart' show Cascade;
extension
Palabra clave que se utiliza para extensiones de tipos. Las extensiones en Dart proporcionan una forma de extender tipos sin heredar de ellos.
extension StringExtension on String {
int countVocals() {
return this.replaceAll(RegExp(r'[^aeiouAEIOU]'), '').length;
}
}
String myText = "Hola, Mundo!";
int counter = myText.countVocals();
print("El texto tiene $counter vocales.");
extension NumberParsing on String {
int parseInt() {
return int.parse(this);
}
// setencias
}
external
Palabra reservada que se utiliza para indicar que una función es externa.
external returnType functionName(parameters);
factory
Palabra clave que se utiliza para crear fábricas de objetos dentro de una clase. Según la documentación oficial nos indica utilizar la palabra clave factory cuando implementemos un constructor que no siempre cree una nueva instancia de su clase. Por ejemplo, un constructor de fábrica puede devolver una instancia de una caché, o puede devolver una instancia de un subtipo.
class MyClass {
factory MyClass.fromSome(dynamic some) {
// lógica personalizada
return Myclass();
}
}
class Logger {
final String name;
bool mute = false;
static final Map<String, Logger> _cache = <String, Logger>{};
factory Logger(String name) {
return _cache.putIfAbsent(name, () => Logger._internal(name));
}
factory Logger.fromJson(Map<String, Object> json) {
return Logger(json['name'].toString());
}
Logger._internal(this.name);
void log(String msg) {
if (!mute) print(msg);
}
}
final(class)
Palabra clave aplicada a una clase significa que la clase no puede ser heredada por otras clases.
final class Animal {
final String name;
Animal(this.name);
}
class Dog extends Animal {
Dog(String name) : super(name);
}
Function
La palabra clave no se utiliza para declarar funciones, sino que representa el tipo de datos de las funciones. Function es un tipo que puede referenciar cualquier función, independientemente de su firma.
int add(int a, int b) {
return a + b;
}
Function functionAdd = add;
int result = functionAdd(3, 5);
get — set
Palabras clave que permiten crear variables de acceso de lectura(get) y escritura(set) sobre las propiedades de un objeto.
class Rectangle {
double left, top, width, height;
Rectangle(this.left, this.top, this.width, this.height);
double get right => left + width;
set right(double value) => left = value - width;
double get bottom => top + height;
set bottom(double value) => top = value - height;
}
implements
Palabra clave que se utiliza para implementar las interfaces en Dart.
class Shape {
double area();
}
class Rectangle implements Shape {}
import
Palabra clave que utiliza para importar clases o librerías.
import 'dart:html';
interface
Palabra clave que sirve para definir una interfaz, el extends no sirve para utilizarlas.
interface class Vehicle {
void moveForward(int meters) {
// setencias
}
}
late
Palabra clave que se utiliza para declarar una variable que se inicializa después antes de usarse.
late String name;
void main() {
name = 'Pep!';
print(description);
}
library
Palabra clave se utiliza para declarar un archivo como librería.
library my_library;
void greet() {
print('¡Hola desde la librería!');
}
class MyClass {
// Implementación de la clase
}
void main() {
greet();
var instance = MyClass();
}
mixin
Palabra clave que se utiliza para definir mixins, que son unidades de código reutilizable que pueden ser combinadas con clases para agregar funcionalidades específicas.
mixin MiMixin {
// Código del mixin
}
class MyClass with MiMixin {
// Implementación de la clase
}
operator
Palabra clave que se utiliza para sobrecargar operadores y definir cómo se comportan en instancias de una clase personalizada.
class Add {
int value;
Add(this.value);
Add operator +(Add otherValue) {
return Add(value + otherValue.value);
}
}
void main() {
Add sum1 = Add(5);
Add sum2 = Add(10);
Add result = sum1 + sum2;
print(result.value); // 15
}
part
Palabra clave que se utiliza en el contexto de las bibliotecas y archivos divididos para indicar que un archivo Dart es una parte de una biblioteca dividida. Es para dividir en partes el contenido de archivos.
library my_library;
part 'part_1.dart';
part 'part_2.dart';
void main() {
print('Función principal');
}
required
Palabra clave que se utiliza en los parámetros para indicar que es obligatorio.
// child es obligatorio.
const Scrollbar({super.key, required Widget child});
sealed
Palabra clave que se utiliza para impedir que una clase sea extendida o implementada fuera de su propia biblioteca. Las clases selladas son implícitamente abstractas.
sealed class Vehicle {}
class Car extends Vehicle {}
class Truck implements Vehicle {}
class Bicycle extends Vehicle {}
// ERROR: no se puede instanciar Vehicle
Vehicle myVehicle = Vehicle();
// Car es un subtipo de vehicle y no está marcado con sealed
// por eso es posible instanciarla
Vehicle myCar = Car();
static
Palabra clave que se utiliza para declarar variables y funciones estáticos dentro de una clase. Para las variables, son útiles cuando necesitamos que sean datos constantes, ya que no se inicializan hasta que no se utilizan. Para las funciones, se pueden llamar directamente sin necesidad de crear una instancia de la clase.
class Queue {
static const initialCapacity = 16;
// ···
}
void main() {
assert(Queue.initialCapacity == 16);
}
class Shape {
static void draw() {
print('Dibujar figura ...');
}
}
void main() {
Shape.draw();
}
typedef
Palabra clave que se utiliza para hacer referencia a un tipo de dato.
typedef IntList = List<int>;
IntList il = [1, 2, 3];
Palabras reservadas en programación asincrónica Dart.
Son palabras clave que solo se utilizan en la programación asíncrona en Dart.
await — yield
No puede usar wait o yield como identificador en ningún cuerpo de función marcado con async, async*, o sync*.
Conclusión
Pudimos terminar de ver todas las palabras clave usadas por Dart en sus diferentes procesos, podemos con lo anterior, saber a rasgos generales en que ocasiones se pueden usar algunas de ellas.
¡Gracias por leer!
