La librería dart:core es la biblioteca estándar principal de Dart, se importa implícita y automáticamente. Proporciona las capacidades fundamentales esenciales del lenguaje. A continuación se detallan sus funcionalidades principales y ejemplos de código organizados por módulos.
El desarrollador no necesita escribir ninguna sentencia de importación; esta librería se carga por defecto de forma automática.
I. Salida por consola
Función de nivel superior print(): llama automáticamente al método toString() del objeto para imprimir contenido de texto.
void main() {
var tea = "milk tea";
print(tea);
print('I drink $tea.');
}Lenguaje del código: Dart (dart)
II. Tipos numéricos: num / int / double
- Relación de herencia:
intydoubleheredan denum - Conversión cadena a número:
parse(); int admite el parámetro radix para especificar la base numérica - Conversión número a cadena:
toString(): conversión básicatoStringAsFixed(n): conserva n dígitos decimalestoStringAsPrecision(n): n dígitos significativos
void main() {
// Convertir cadena a número
assert(int.parse('42') == 42);
assert(int.parse('42', radix:16) == 66);
assert(double.parse('0.5') == 0.5);
// Convertir número a cadena
assert(123.456.toStringAsFixed(2) == '123.46');
assert(123.456.toStringAsPrecision(2) == '1.2e+2');
}Lenguaje del código: Dart (dart)
III. Cadenas String & Expresiones regulares RegExp
- Los objetos String son inmutables (todos los métodos de modificación devuelven cadenas nuevas); almacenan unidades de código UTF-16
- Métodos habituales: búsqueda, subcadena, división, cambio de mayúsculas/minúsculas, eliminación de espacios
void main() {
var str = 'Never odd or even';
// Consultas
assert(str.contains('odd'));
assert(str.startsWith('Never'));
assert(str.endsWith('even'));
assert(str.indexOf('odd') == 6);
// Subcadena y división
assert(str.substring(6,9) == 'odd');
var parts = 'a b c'.split(' ');
// Eliminar espacios y comprobar vacío
assert(' abc '.trim() == 'abc');
assert(''.isEmpty);
assert(' '.isNotEmpty);
// Cambio de mayúsculas
assert('dart'.toUpperCase() == 'DART');
// Usar preferentemente StringBuffer para concatenación (mejor rendimiento)
var sb = StringBuffer();
sb.write('Hello ');
sb.writeAll(['A','B','C'], ',');
print(sb.toString());
}Lenguaje del código: Dart (dart)
Expresiones regulares RegExp
void main() {
var reg = RegExp(r'\d+'); // Coincide con dígitos consecutivos
var text = 'llamas live 15 to 20 years';
assert(reg.hasMatch(text));
// Recorrer todas las coincidencias globales
for(var m in reg.allMatches(text)){
print(m.group(0));
}
// Reemplazar contenido coincidente
var res = text.replaceAll(reg, 'XX');
print(res);
}Lenguaje del código: Dart (dart)
Nota: Una unidad de código no siempre equivale a un carácter visible para el usuario. Para caracteres Unicode complejos (combinaciones de emojis), usa el paquete externo
characters.
IV. Colecciones (List / Set / Map)
1. List: ordenada, permite duplicados, acceso mediante índice
void main() {
var fruits = ['apple','orange'];
fruits.add('kiwi');
fruits.addAll(['grape']);
fruits.removeAt(0);
fruits.sort((a,b)=>a.compareTo(b)); // Ordenar elementos
// Restricción genérica
var strList = <String>[];
}Lenguaje del código: Dart (dart)
2. Set: desordenada, elementos únicos, sin acceso por índice
void main() {
var set = <String>{};
set.addAll(['gold','xenon']);
set.add('gold'); // La inserción duplicada no tiene efecto
assert(set.contains('xenon'));
// Operación de intersección
var set2 = Set.from(['xenon','argon']);
var inter = set.intersection(set2);
}Lenguaje del código: Dart (dart)
3. Map: colección de pares clave-valor; las claves son únicas
void main() {
var map = {54: 'xenon'};
print(map[54]);
assert(map.containsKey(54));
map.remove(54);
// Asignar valor solo si la clave no existe
map.putIfAbsent('name', () => 'Dart');
// Iterar entradas
map.forEach((k,v)=>print('$k:$v'));
}Lenguaje del código: Dart (dart)
4. Operaciones genéricas Iterable (List y Set implementan Iterable)
Métodos de orden superior habituales: forEach, map, where, any, every
void main() {
var list = ['green','black','chamomile'];
list.forEach(print);
// map se evalúa de forma diferida; toList ejecuta inmediatamente
var upperList = list.map((e)=>e.toUpperCase()).toList();
// Filtrar elementos
var filter = list.where((e)=>e == 'chamomile');
assert(list.any((e)=>e == 'chamomile'));
assert(!list.every((e)=>e.contains('tea')));
}Lenguaje del código: Dart (dart)
V. Gestión de URI (Uri)
Se usa para codificación, decodificación, análisis y construcción de URLs
encodeFull: solo codifica espacios y caracteres similares, mantiene símbolos de URL/ : ? &encodeComponent: escapa todos los caracteres especiales (ideal para codificar valores de parámetros)
void main() {
// Analizar url
var uri = Uri.parse('https://example.org:8080/foo?lang=dart#frag');
print(uri.scheme);
print(uri.host);
print(uri.queryParameters);
// Construir url
var newUri = Uri.https('example.org','/foo', {'lang':'dart'});
}Lenguaje del código: Dart (dart)
VI. Fecha y hora DateTime & Duration
DateTime: instante temporal, admite hora local y UTCDuration: intervalo de tiempo, para sumar/restar instantes y calcular diferencias
void main() {
var now = DateTime.now();
var y2k = DateTime.utc(2000);
// Suma y resta temporal
var nextYear = y2k.add(const Duration(days:366));
var diff = nextYear.difference(y2k);
print(diff.inDays);
// Marca de tiempo (milisegundos desde época Unix 1970-01-01 UTC)
print(y2k.millisecondsSinceEpoch);
}Lenguaje del código: Dart (dart)
Aviso: Los desplazamientos temporales por días pueden causar errores con el cambio de horario de verano. Se recomienda usar hora UTC.
VII. Interfaces y clases base útiles
1. Comparable: permite la comparación de objetos para ordenarlos
class Line implements Comparable<Line> {
final int length;
const Line(this.length);
@override
int compareTo(Line other) => length - other.length;
}Lenguaje del código: Dart (dart)
2. Claves personalizadas para Map: sobrescribir == y hashCode
Regla: Objetos iguales deben compartir el mismo hashCode
class Person {
final String first, last;
Person(this.first,this.last);
@override
int get hashCode => Object.hash(first, last);
@override
bool operator ==(Object other) =>
other is Person && other.first == first && other.last == other.last;
}Lenguaje del código: Dart (dart)
- 3. Iterable + Iterator
Implementar Iterable permite usar bucles for-in con lógica de recorrido personalizada.
VIII. Gestión de excepciones
- Error: fallo grave, normalmente no capturable (ej: NoSuchMethodError)
- Exception: anomalía previsible que se puede capturar; se pueden definir excepciones personalizadas
class FooException implements Exception {
final String? msg;
const FooException([this.msg]);
@override
String toString() => msg ?? 'FooException';
}Lenguaje del código: Dart (dart)
IX. Referencias débiles y Finalizadores
WeakReference: referencia débil, no impide que el recolector de basura libere el objeto destinoFinalizer / NativeFinalizer: ejecuta una devolución de llamada cuando el objeto es recolectado, para liberar recursos nativosFinalizable: evita la recolección prematura del objeto por el GC
Biblioteca estándar principal dart:core