Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Manejo de excepciones
Conceptos avanzados de clase
Clases invocables y aislamientos
Genéricos
Tipos de letra y metadatos
Bibliotecas
Programación asincrónica
Generadores
Entonces comencemos.
Introducción
En el curso anterior, Dart - Guía para principiantes, aprendió acerca de Dart, utilizando tipos
incorporados, declarando variables, definiendo funciones, creando funciones usando
parámetros con nombre y posicionados opcionales, creando una clase usando un
constructor con nombre.
En este curso, aprenderá más sobre conceptos de clase, herencia, operadores
reemplazables, uso de genéricos, manejo de excepciones, mixins y programación
asincrónica.
Manejo de excepciones
Las excepciones se utilizan para indicar errores que ocurren durante el tiempo de ejecución.
Todas las excepciones en dart son excepciones no verificadas (verificaciones durante el
tiempo de ejecución). Excepción y Error
son tipos predefinidos que se utilizan
para generar excepciones. Dart también
admite la creación de excepciones
definidas por el usuario.
El programa finaliza cuando no se
detectan las excepciones.
Try, - Throw - Catch
try, throw y catch se utilizan para manejar la excepción. Try se usa para lanzar la excepción
al bloque catch. Throw se usa para lanzar una excepción explícitamente. Puede usar catch y
on para capturar la excepción que se produce mediante el bloque try. Catch se usa cuando
se necesita el objeto de excepción para el manejo, y puede manejar todo tipo de excepción.
On se usa cuando necesita especificar el tipo de excepción.
void main() {
String a = "welcome to dart";
try {
int v = int.parse(a);
print("$v");
} on IntegerDivisionByZeroException {
print("divide by zero");
} catch (e) {
print(e);
}
}
Finally
Se puede lanzar una excepción o no, pero se ejecuta el bloque finally.
Sintaxis:
try{
//statements
}
on specific_exception{
}
catch e{
}
finally{
//finally block
}
void main() {
double a = 6, b = 0;
try {
if (b == 0) {
throw IntegerDivisionByZeroException();
}
print("${a / b}");
} on IntegerDivisionByZeroException {
print("divide by zero");
} catch (e) {
print(e);
} finally {
print("Code executed");
}
}
Clase Abstracta
class SampleCode {
display(String c) {
print("Class SampleCode:$c");
}
}
class SampImplement implements SampleCode {
display(String c) {
print("Class SampImplement:$c");
}
}
void main() {
SampleCode obj1 = SampleCode();
obj1.display("welcomes");
SampImplement obj2 = SampImplement();
obj2.display("Dart 2.1");
}
Herencia
Dart solo admite herencia única.Para heredar una clase, usa la palabra clave extend.
Synt:
Miembros primordiales
Una clase puede anular sus miembros de clase base.Para indicar que está anulando un
miembro, use la anotación @override.
Operadores anulables
Los operadores pueden ser anulados.
Los operadores reemplazables son <, +, |, [],>, /, ^, [] =, <=, ~ /, &, ~,> =, *, <<, ==, -,%, >>
class DerivedCode {
int a;
DerivedCode(this.a);
operator +(DerivedCode obj) {
return this.a + obj.a;
}
}
void main() {
DerivedCode obj1 = DerivedCode(6);
DerivedCode obj2 = DerivedCode(7);
// + operator overrided
int sum = obj1 + obj2;
print("Sum:$sum");
}
Enums
Los tipos enumerados son un tipo especial de clase. Se utiliza para representar valores
constantes. Use la palabra clave enum para declarar enumeraciones.
Sintaxis :
enum enum_name {const_values, const_values ...}
P.ej. enum Cars {hatchback, sedán, suv}
Mixins
Mixin se usa para reutilizar el código de clase en varias clases.Use la palabra clave with
seguido de nombres mixin.
Sintaxis:
class ClassName with mixin_name {}
La clase mixin debería extender la clase Object y los constructores no deberían
declararse.También puede usar la palabra clave mixin para la clase mixin en lugar de la
palabra clave class.
class SampA {
dynamic disp;
void display() {
print("Result:$disp");
}
}
class SampB with SampA {
add(int a, int b) {
disp = a + b;
}
}
main() {
SampB obj = SampB();
obj.add(5, 8);
obj.display();
}
Las clases se pueden llamar como una función implementando el método call () dentro de la
clase.El método call () se usa para emular una función.
Considere que se evalúa samp (int a, int b). Si es una función normal, se llama de lo
contrario, intenta invocar el método call (). Si se implementa samp con el método call (), se
invoca.
class SampCallable {
call(String val) {
print(val);
}
}
void main() {
SampCallable obj = SampCallable();
//Callable class
obj("welcome to dart 2");
}
El código anterior usa la clase callable mediante la implementación del método call (). El
método de llamada toma una cadena e imprime.
Aislamientos
Colección Literales
En Dart, la lista y el mapa se pueden parametrizar.Los literales parametrizados son como
literales.
add_t<T>(List lst) {
dynamic v = (T == int) ? 0 : "";
lst.forEach((val) {
v += val;
});
return v;
}
void main() {
List list1 = [1, 2, 3, 4, 5];
List list2 = ["welcome", "to", "dart"];
int res1 = add_t<int>(list1);
String res2 = add_t<String>(list2);
print("Sum:$res1");
print("$res2");
}
Typedefs
Las funciones son objetos en Dart.Un typedef le da un nombre al tipo de función.Se utiliza
para declarar campos y tipos de retorno.
class SampTypedef {
Function addition;
SampTypedef(int func(int a, int b)) {
addition = func;
}
}
int add(int a, int b) => a + b;
main() {
SampTypedef obj = SampTypedef(add);
print("${obj.addition(5, 7)}");
}
Metadatos
class Arithmetic {
/// _Deprecated: Use [add] instead._
@deprecated
sum(int a, int b) {
return add(a, b);
}
library sample_lib;
class SampleCode{
final String name;
const SampleCode(this.name);
}
import 'sample_lib.dart';
@SampleCode("userdefined_annotation")
display()
{
print("welcome to dart");
}
Librerías
Las directivas de importación y biblioteca ayudan a crear una base de código modular y
compartible. Los identificadores que comienzan con un guion bajo “_” solo son visibles
dentro de la biblioteca que proporciona una unidad de privacidad. Cada aplicación Dart es
una biblioteca y las bibliotecas se pueden distribuir mediante paquetes. Para usar la
biblioteca dentro del programa, use importar para especificar paquetes o biblioteca. Por
ejemplo: importar 'dart: html'; importar 'dart: async' ;, etc.
Especificar un prefijo de biblioteca
Al importar dos bibliotecas puede haber identificadores en conflicto, en ese caso, puede
especificar un prefijo para una o ambas bibliotecas.
import 'package:lib/samp1.dart';
import 'package:lib/samp2.dart' as samp2;
Paquetes de biblioteca
Para crear código modular, use bibliotecas que se puedan compartir fácilmente. En Dart, las
bibliotecas se crean y distribuyen como paquetes. Dart tiene dos tipos de paquetes:
paquetes de aplicación (incluye biblioteca local) paquetes de biblioteca
library sample_lib;
class SampleCode {
display() {
print("welcome to dart");
}
}
import 'sample_lib.dart';
main() {
SampleCode obj = SampleCode();
obj.display();
}
Programación asincrónica
La programación asincrónica se utiliza para ejecutar la operación de forma asincrónica sin
hacer que la otra operación espere.
La programación asincrónica se caracteriza por las clases Future y Stream. El programa
asincrónico se utiliza para operaciones que requieren mucho tiempo, como E / S.
Las palabras clave asíncrona y en espera se utilizan para la programación asincrónica que
ayuda a escribir código asincrónico.
Future and Stream
En dart, todas las funciones de la biblioteca devuelven objetos futuros o continuos.Una
función Future calcula el código que no se completa de inmediato.La función Future
devuelve un objeto futuro que contiene el mismo resultado que una función normal.Una
secuencia de eventos asincrónicos es una secuencia.
Future
En Dart, la ejecución del código es de un solo subproceso que hace que el programa se
congele cuando el código bloquea el subproceso.
Future representa los resultados de las operaciones asincrónicas. Una función asíncrona
debe marcarse con un modificador asíncrono y también hace que la función devuelva un
futuro. Use wait en una función asíncrona para suspender la ejecución hasta que termine el
futuro.
void main() {
display().then(print);
print("welcome to dart");
}
En el código anterior, la función display () usa el tipo futuro que hace asíncrono.
Usando await
Await espera a que se complete la función asincrónica.Await solo se puede usar dentro de
una función asíncrona.
Future display() async {
var sum = 0;
for (int i = 1; i < 10; i++) {
sum += i;
}
return sum;
}
main() async {
await display().then(print);
print("welcome to dart");
}
Stream
Streams proporcionan una secuencia asíncrona de datos, como eventos generados por el
usuario, que leen un archivo. Await of o listen() se puede usar para procesar una secuencia.
Hay dos tipos de transmisiones: suscripción única y transmitir (single subscription –
broadcast )
import 'dart:async';
Future<int> sumStream(Stream<int> stream) async {
var sum = 0;
await for (var value in stream) {
sum += value;
}
return sum;
}
//tests by generating a simple stream of integers
Stream<int> countStream(int to) async* {
for (int i = 1; i <= to; i++) {
yield i;
}
}
main() async {
var stream = countStream(5);
var sum = await sumStream(stream);
print(sum); // 15
}
Broadcast Streams
Las transmisiones se utilizan para manejar mensajes individuales uno a la vez. Puede
comenzar a escuchar en cualquier momento y uno o más oyentes pueden usarse para
escuchar al mismo tiempo.Se puede usar para eventos como eventos del mouse.
Generadores
Los generadores se utilizan para producir perezosamente (lentamente) una secuencia de
valores.Hay dos tipos de funciones generadoras. Synchronous generator: devuelve un
objeto Iterable. Asynchronous generator: devuelve un objeto Stream.
Generador síncrono
Un generador síncrono produce valores bajo demanda y los consumidores extraen los
valores del generador.Para implementar una función de generador síncrono, el cuerpo de la
función debe marcarse con sync * y usar el rendimiento para entregar valores.