Programación de dardos - Guía rápida
Dart es un lenguaje orientado a objetos con sintaxis de estilo C que opcionalmente puede transcompilar en JavaScript. Admite una amplia gama de ayudas de programación como interfaces, clases, colecciones, genéricos y mecanografía opcional.
Dart se puede utilizar ampliamente para crear aplicaciones de una sola página. Las aplicaciones de una sola página se aplican solo a sitios web y aplicaciones web. Las aplicaciones de una sola página permiten la navegación entre diferentes pantallas del sitio web sin cargar una página web diferente en el navegador. Un ejemplo clásico esGMail ─ cuando hace clic en un mensaje en su bandeja de entrada, el navegador permanece en la misma página web, pero el código JavaScript oculta la bandeja de entrada y muestra el cuerpo del mensaje en la pantalla.
Google ha lanzado una compilación especial de Chromium - la Dart VM. El uso de Dartium significa que no tiene que compilar su código en JavaScript hasta que esté listo para probar en otros navegadores.
La siguiente tabla compara las características de Dart y JavaScript.
Característica | Dardo | JavaScript |
---|---|---|
Tipo de sistema | Opcional, dinámico | Débil, dinámico |
Clases | Sí, herencia única | Prototípico |
Interfaces | Sí, múltiples interfaces | No |
Concurrencia | Si, con aislamientos | Sí, con trabajadores web HTML5 |
Este tutorial proporciona una comprensión de nivel básico del lenguaje de programación Dart.
Este capítulo trata sobre la configuración del entorno de ejecución para Dart en la plataforma Windows.
Ejecución de script en línea con DartPad
Puede probar sus scripts en línea utilizando el editor en línea en https://dartpad.dartlang.org/. El editor de Dart ejecuta el script y muestra tanto HTML como la salida de la consola. El editor en línea se envía con un conjunto de ejemplos de código preestablecidos.
Una captura de pantalla del Dartpad El editor se da a continuación:
Dartpad también permite codificar de una manera más restrictiva. Esto se puede lograr marcando la opción Modo fuerte en la parte inferior derecha del editor. El modo fuerte ayuda con:
- Comprobación estática y dinámica más fuerte
- Generación de código JavaScript idiomático para una mejor interoperabilidad.
Puede probar el siguiente ejemplo usando Dartpad
void main() {
print('hello world');
}
El código mostrará la siguiente salida
hello world
Configuración del entorno local
En esta sección, veamos cómo configurar el entorno local.
Usando el editor de texto
Algunos ejemplos de algunos editores incluyen Windows Notepad, Notepad ++, Emacs, vim o vi, etc. Los editores pueden variar de un sistema operativo a otro. Los archivos de origen se denominan normalmente con la extensión ".dart".
Instalación del SDK de Dart
La versión estable actual de Dart es 1.21.0. losdart sdk se puede descargar desde -
https://www.dartlang.org/install/archive
http://www.gekorm.com/dart-windows/
A continuación se muestra una captura de pantalla de la instalación de Dart SDK:
Una vez completada la instalación del SDK, configure la variable de entorno PATH en -
<dart-sdk-path>\bin
Verificación de la instalación
Para verificar si Dart se ha instalado correctamente, abra el símbolo del sistema e ingrese el siguiente comando:
Dart
Si la instalación es exitosa, mostrará el tiempo de ejecución de dart.
Soporte IDE
Una gran cantidad de IDE admiten secuencias de comandos en Dart. Ejemplos incluyenEclipse, IntelliJy WebStorm de los cerebros Jet.
A continuación se muestran los pasos para configurar el entorno de Dart utilizando WebStrom IDE.
Instalación de WebStorm
El archivo de instalación de WebStorm se puede descargar desde https://www.jetbrains.com/webstorm/download/#section=windows-version.
El archivo de instalación de WebStorm está disponible para Mac OS, Windows y Linux.
Después de descargar los archivos de instalación, siga los pasos que se indican a continuación:
Instale el SDK de Dart: consulte los pasos enumerados anteriormente
Cree un nuevo proyecto de Dart y configure el soporte de Dart
Para crear un nuevo proyecto de Dart,
Hacer clic Create New Project desde la pantalla de bienvenida
En el siguiente cuadro de diálogo, haga clic en Dart
Si no hay ningún valor especificado para el Dart SDKruta, luego proporcione la ruta del SDK. Por ejemplo, la ruta del SDK puede ser<dart installation directory>/dart/dartsdk.
Agregar un archivo Dart al proyecto
Para agregar un archivo Dart al proyecto:
- Haga clic derecho en el proyecto
- Nuevo → Archivo Dart
- Ingrese el nombre del script de Dart
A continuación se muestra una captura de pantalla del Editor WebStorm:
La herramienta dart2js
los dart2jsLa herramienta compila el código de Dart en JavaScript. Compilar el código de Dart en JS permite ejecutar el script de Dart en navegadores que no son compatibles con Dart VM.
La herramienta dart2js se envía como parte del SDK de Dart y se puede encontrar en el /dartsdk/bin folder.
Para compilar Dart en JavaScript, escriba el siguiente comando en la terminal
dart2js - - out = <output_file>.js <dart_script>.dart
Este comando produce un archivo que contiene el equivalente en JavaScript de su código de Dart. Se puede encontrar un tutorial completo sobre el uso de esta utilidad en el sitio web oficial de Dart.
La sintaxis define un conjunto de reglas para escribir programas. Cada especificación de lenguaje define su propia sintaxis. Un programa de Dart se compone de:
- Variables y operadores
- Classes
- Functions
- Expresiones y construcciones de programación
- Toma de decisiones y construcciones de bucle
- Comments
- Bibliotecas y paquetes
- Typedefs
- Estructuras de datos representadas como colecciones / genéricos
Tu primer código de dardo
Comencemos con el ejemplo tradicional de "Hola mundo":
main() {
print("Hello World!");
}
los main()La función es un método predefinido en Dart. Este método actúa como punto de entrada a la aplicación. Un script de Dart necesitamain() método de ejecución. print() es una función predefinida que imprime la cadena o valor especificado en la salida estándar, es decir, el terminal.
La salida del código anterior será:
Hello World!
Ejecutar un programa de dardos
Puede ejecutar un programa de Dart de dos formas:
- A través de la terminal
- A través de WebStorm IDE
A través de la Terminal
Para ejecutar un programa Dart a través del terminal:
- Navegar a la ruta del proyecto actual
- Escriba el siguiente comando en la ventana de Terminal
dart file_name.dart
A través de WebStorm IDE
Para ejecutar un programa Dart a través de WebStorm IDE:
Haga clic con el botón derecho en el archivo de secuencia de comandos de Dart en el IDE. (El archivo debe contener elmain() función para permitir la ejecución)
Clickea en el ‘Run <file_name>’opción. A continuación se muestra una captura de pantalla del mismo:
Alternativamente, se puede hacer clic en el
Opciones de la línea de comandos de Dart
Las opciones de la línea de comandos de Dart se utilizan para modificar la ejecución de Dart Script. Las opciones de línea de comando comunes para Dart incluyen las siguientes:
No Señor | Opción y descripción de la línea de comandos |
---|---|
1 | -c or --c Habilita tanto las afirmaciones como las comprobaciones de tipo (modo comprobado). |
2 | --version Muestra información sobre la versión de la máquina virtual. |
3 | --packages <path> Especifica la ruta al archivo de configuración de resolución del paquete. |
4 | -p <path> Especifica dónde encontrar las bibliotecas importadas. Esta opción no se puede utilizar con --packages. |
5 | -h or --help Muestra ayuda. |
Habilitación del modo marcado
Los programas de dardos se ejecutan en dos modos, a saber:
- Modo comprobado
- Modo de producción (predeterminado)
Se recomienda ejecutar Dart VM en checked modedurante el desarrollo y las pruebas, ya que agrega advertencias y errores para ayudar al proceso de desarrollo y depuración. El modo comprobado impone varias comprobaciones como la verificación de tipos, etc. Para activar el modo comprobado, agregue la opción -c o –-checked antes del nombre del archivo de script mientras se ejecuta el script.
Sin embargo, para asegurar un beneficio de rendimiento mientras se ejecuta el script, se recomienda ejecutar el script en el production mode.
Considera lo siguiente Test.dart archivo de script -
void main() {
int n = "hello";
print(n);
}
Ejecute el script ingresando -
dart Test.dart
Aunque hay una falta de coincidencia de tipos, el script se ejecuta correctamente cuando se desactiva el modo marcado. El script dará como resultado la siguiente salida:
hello
Ahora intente ejecutar el script con la opción "- - marcado" o "-c" -
dart -c Test.dart
O,
dart - - checked Test.dart
La máquina virtual Dart arrojará un error que indica que hay una falta de coincidencia de tipos.
Unhandled exception:
type 'String' is not a subtype of type 'int' of 'n' where
String is from dart:core
int is from dart:core
#0 main (file:///C:/Users/Administrator/Desktop/test.dart:3:9)
#1 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart :261)
#2 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148)
Identificadores en Dart
Los identificadores son nombres que se dan a elementos en un programa como variables, funciones, etc. Las reglas para identificadores son:
Los identificadores pueden incluir tanto caracteres como dígitos. Sin embargo, el identificador no puede comenzar con un dígito.
Los identificadores no pueden incluir símbolos especiales, excepto un guión bajo (_) o un signo de dólar ($).
Los identificadores no pueden ser palabras clave.
Deben ser únicos.
Los identificadores distinguen entre mayúsculas y minúsculas.
Los identificadores no pueden contener espacios.
Las siguientes tablas enumeran algunos ejemplos de identificadores válidos y no válidos:
Identificadores válidos | Identificadores inválidos |
---|---|
primer nombre | Var |
primer nombre | primer nombre |
num1 | primer nombre |
$ resultado | 1 número |
Palabras clave en Dart
Las palabras clave tienen un significado especial en el contexto de un idioma. La siguiente tabla enumera algunas palabras clave en Dart.
resumen 1 | Seguir | falso | nuevo | esta |
como 1 | defecto | final | nulo | lanzar |
afirmar | diferido 1 | finalmente | operador 1 | cierto |
async 2 | hacer | para | parte 1 | tratar |
asincrónico * 2 | dinámica 1 | obtener 1 | volver a lanzar | typedef 1 |
esperar 2 | más | Si | regreso | var |
romper | enumeración | implementos 1 | serie 1 | vacío |
caso | exportar 1 | importar 1 | estático 1 | mientras |
captura | externo 1 | en | súper | con |
clase | extiende | es | cambiar | rendimiento 2 |
constante | fábrica 1 | biblioteca 1 | sincronizar * 2 | rendimiento * 2 |
Espacios en blanco y saltos de línea
Dart ignora los espacios, las pestañas y las nuevas líneas que aparecen en los programas. Puede usar espacios, pestañas y nuevas líneas libremente en su programa y puede formatear y sangrar sus programas de una manera ordenada y consistente que hace que el código sea fácil de leer y comprender.
Dart distingue entre mayúsculas y minúsculas
Dart distingue entre mayúsculas y minúsculas. Esto significa que Dart diferencia entre caracteres en mayúscula y minúscula.
Las declaraciones terminan con punto y coma
Cada línea de instrucción se llama declaración. Cada declaración de dardo debe terminar con un punto y coma (;). Una sola línea puede contener varias declaraciones. Sin embargo, estas declaraciones deben estar separadas por un punto y coma.
Comentarios en Dart
Los comentarios son una forma de mejorar la legibilidad de un programa. Los comentarios se pueden utilizar para incluir información adicional sobre un programa, como el autor del código, sugerencias sobre una función / construcción, etc. El compilador ignora los comentarios.
Dart admite los siguientes tipos de comentarios:
Single-line comments ( // ) - Cualquier texto entre "//" y el final de una línea se trata como un comentario.
Multi-line comments (/* */) - Estos comentarios pueden abarcar varias líneas.
Ejemplo
// this is single line comment
/* This is a
Multi-line comment
*/
Programación orientada a objetos en Dart
Dart es un lenguaje orientado a objetos. La orientación a objetos es un paradigma de desarrollo de software que sigue el modelado del mundo real. Orientación a objetos considera un programa como una colección de objetos que se comunican entre sí a través de un mecanismo llamado métodos.
Object- Un objeto es una representación en tiempo real de cualquier entidad. Según Grady Brooch, cada objeto debe tener tres características:
State - descrito por los atributos de un objeto.
Behavior - describe cómo actuará el objeto.
Identity - un valor único que distingue un objeto de un conjunto de objetos similares.
Class- Una clase en términos de POO es un plan para crear objetos. Una clase encapsula los datos del objeto.
Method - Los métodos facilitan la comunicación entre objetos.
Ejemplo: dardos y orientación a objetos
class TestClass {
void disp() {
print("Hello World");
}
}
void main() {
TestClass c = new TestClass();
c.disp();
}
El ejemplo anterior define una clase TestClass. La clase tiene un métododisp(). El método imprime la cadena "Hello World" en la terminal. La nueva palabra clave crea un objeto de la clase. El objeto invoca el métododisp().
El código debería producir lo siguiente output -
Hello World
Una de las características más fundamentales de un lenguaje de programación es el conjunto de tipos de datos que admite. Estos son el tipo de valores que se pueden representar y manipular en un lenguaje de programación.
El lenguaje Dart admite los siguientes tipos:
- Numbers
- Strings
- Booleans
- Lists
- Maps
Números
Los números en Dart se utilizan para representar literales numéricos. El Number Dart viene en dos sabores:
Integer- Los valores enteros representan valores no fraccionarios, es decir, valores numéricos sin punto decimal. Por ejemplo, el valor "10" es un número entero. Los literales enteros se representan mediante elint palabra clave.
Double- Dart también admite valores numéricos fraccionarios, es decir, valores con puntos decimales. El tipo de datos Double en Dart representa un número de punto flotante de 64 bits (doble precisión). Por ejemplo, el valor "10,10". La palabra clavedouble se utiliza para representar literales de coma flotante.
Instrumentos de cuerda
Las cadenas representan una secuencia de caracteres. Por ejemplo, si tuviera que almacenar algunos datos como el nombre, la dirección, etc., debería usarse el tipo de datos de cadena. Una cadena de dardos es una secuencia de unidades de código UTF-16.Runes se utilizan para representar una secuencia de unidades de código UTF-32.
La palabra clave Stringse utiliza para representar cadenas literales. Los valores de cadena están incrustados entre comillas simples o dobles.
Booleano
El tipo de datos booleano representa valores booleanos verdaderos y falsos. Dart usa elbool palabra clave para representar un valor booleano.
Lista y mapa
La lista y el mapa de tipos de datos se utilizan para representar una colección de objetos. UNListes un grupo ordenado de objetos. El tipo de datos List en Dart es sinónimo del concepto de matriz en otros lenguajes de programación. losMapEl tipo de datos representa un conjunto de valores como pares clave-valor. losdart: core La biblioteca permite la creación y manipulación de estas colecciones a través de las clases List y Map predefinidas respectivamente.
El tipo dinámico
Dart es un idioma escrito opcionalmente. Si el tipo de una variable no se especifica explícitamente, el tipo de la variable esdynamic. losdynamic La palabra clave también se puede utilizar como una anotación de tipo explícitamente.
Una variable es "un espacio con nombre en la memoria" que almacena valores. En otras palabras, actúa como contenedor de valores en un programa. Los nombres de las variables se denominan identificadores. Las siguientes son las reglas de nomenclatura para un identificador:
Los identificadores no pueden ser palabras clave.
Los identificadores pueden contener alfabetos y números.
Los identificadores no pueden contener espacios y caracteres especiales, excepto el subrayado (_) y el signo de dólar ($).
Los nombres de las variables no pueden comenzar con un número.
Tipo de sintaxis
Una variable debe declararse antes de ser utilizada. Dart usa la palabra clave var para lograr lo mismo. La sintaxis para declarar una variable es la siguiente:
var name = 'Smith';
Todas las variables en dart almacenan una referencia al valor en lugar de contener el valor. La variable llamada nombre contiene una referencia a un objeto String con un valor de "Smith".
Soportes de dardos type-checkingprefijando el nombre de la variable con el tipo de datos. La verificación de tipo garantiza que una variable contenga solo datos específicos de un tipo de datos. La sintaxis para el mismo se da a continuación:
String name = 'Smith';
int num = 10;
Considere el siguiente ejemplo:
void main() {
String name = 1;
}
El fragmento anterior dará como resultado una advertencia, ya que el valor asignado a la variable no coincide con el tipo de datos de la variable.
Salida
Warning: A value of type 'String' cannot be assigned to a variable of type 'int'
Todas las variables no inicializadas tienen un valor inicial de nulo. Esto se debe a que Dart considera todos los valores como objetos. El siguiente ejemplo ilustra lo mismo:
void main() {
int num;
print(num);
}
Salida
Null
La palabra clave dinámica
Las variables declaradas sin un tipo estático se declaran implícitamente como dinámicas. Las variables también se pueden declarar utilizando la palabra clave dinámica en lugar de la palabra clave var.
El siguiente ejemplo ilustra lo mismo.
void main() {
dynamic x = "tom";
print(x);
}
Salida
tom
Final y Const
los final y constLas palabras clave se utilizan para declarar constantes. Dart evita modificar los valores de una variable declarada utilizando la palabra clave final o const. Estas palabras clave se pueden utilizar junto con el tipo de datos de la variable o en lugar delvar palabra clave.
los constLa palabra clave se utiliza para representar una constante en tiempo de compilación. Variables declaradas usando elconst las palabras clave son implícitamente finales.
Sintaxis: palabra clave final
final variable_name
O
final data_type variable_name
Sintaxis: palabra clave const
const variable_name
O
const data_type variable_name
Ejemplo: palabra clave final
void main() {
final val1 = 12;
print(val1);
}
Salida
12
Ejemplo: palabra clave const
void main() {
const pi = 3.14;
const area = pi*12*12;
print("The output is ${area}");
}
El ejemplo anterior declara dos constantes, pi y area, utilizando el constpalabra clave. losarea el valor de la variable es una constante en tiempo de compilación.
Salida
The output is 452.15999999999997
Note - solo constLas variables se pueden utilizar para calcular una constante de tiempo de compilación. Las constantes en tiempo de compilación son constantes cuyos valores se determinarán en el momento de la compilación
Ejemplo
Dart lanza una excepción si se intenta modificar las variables declaradas con el finalo palabra clave const. El ejemplo que se muestra a continuación ilustra lo mismo:
void main() {
final v1 = 12;
const v2 = 13;
v2 = 12;
}
El código dado arriba arrojará el siguiente error como output -
Unhandled exception:
cannot assign to final variable 'v2='.
NoSuchMethodError: cannot assign to final variable 'v2='
#0 NoSuchMethodError._throwNew (dart:core-patch/errors_patch.dart:178)
#1 main (file: Test.dart:5:3)
#2 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:261)
#3 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148)
Una expresión es un tipo especial de declaración que se evalúa como un valor. Cada expresión se compone de:
Operands - Representa los datos
Operator - Define cómo se procesarán los operandos para producir un valor.
Considere la siguiente expresión: "2 + 3". En esta expresión, 2 y 3 sonoperands y el símbolo "+" (más) es el operator.
En este capítulo, discutiremos los operadores que están disponibles en Dart.
- Operadores aritméticos
- Operadores de igualdad y relacionales
- Operadores de prueba de tipo
- Operadores bit a bit
- Operadores de Asignación
- Operadores logicos
Operadores aritméticos
La siguiente tabla muestra los operadores aritméticos compatibles con Dart.
Mostrar ejemplos
No Señor | Operadores y significado |
---|---|
1 | + Añadir |
2 | − Sustraer |
3 | -expr Menos unario, también conocido como negación (invierte el signo de la expresión) |
4 | * Multiplicar |
5 | / Dividir |
6 | ~/ Dividir, devolviendo un resultado entero |
7 | % Obtener el resto de una división entera (módulo) |
8 | ++ Incremento |
9 | -- Decremento |
Operadores de igualdad y relacionales
Los operadores relacionales prueban o definen el tipo de relación entre dos entidades. Los operadores relacionales devuelven un valor booleano, es decir, verdadero / falso.
Suponga que el valor de A es 10 y B es 20.
Mostrar ejemplos
Operador | Descripción | Ejemplo |
---|---|---|
> | Mas grande que | (A> B) es falso |
< | Menor que | (A <B) es verdadero |
> = | Mayor qué o igual a | (A> = B) es falso |
<= | Menor o igual a | (A <= B) es verdadero |
== | Igualdad | (A == B) es falso |
! = | No es igual | (A! = B) es verdadero |
Operadores de prueba de tipo
Estos operadores son útiles para verificar tipos en tiempo de ejecución.
Mostrar ejemplos
Operador | Sentido |
---|---|
es | Verdadero si el objeto tiene el tipo especificado |
¡es! | Falso si el objeto tiene el tipo especificado |
Operadores bit a bit
La siguiente tabla enumera los operadores bit a bit disponibles en Dart y su función:
Mostrar ejemplos
Operador | Descripción | Ejemplo |
---|---|---|
Y bit a bit | a & b | Devuelve un uno en cada posición de bit para los que los bits correspondientes de ambos operandos son unos. |
O bit a bit | a | segundo | Devuelve uno en cada posición de bit para el que los bits correspondientes de uno o ambos operandos son unos. |
XOR bit a bit | a ^ b | Devuelve un uno en cada posición de bit para el que los bits correspondientes de uno de los operandos, pero no de ambos, son unos. |
Bit a bit NO | ~ a | Invierte los bits de su operando. |
Shift izquierdo | a ≪ b | Desplaza a en representación binaria b (<32) bits a la izquierda, cambiando a ceros desde la derecha. |
Desplazamiento a la derecha de propagación de señales | a ≫ b | Desplaza a en la representación binaria b (<32) bits a la derecha, descartando los bits desplazados. |
Operadores de Asignación
La siguiente tabla enumera los operadores de asignación disponibles en Dart.
Mostrar ejemplos
No Señor | Operador y descripción |
---|---|
1 | =(Simple Assignment ) Asigna valores del operando del lado derecho al operando del lado izquierdo Ex: C = A + B asignará el valor de A + B a C |
2 | ??= Asignar el valor solo si la variable es nula |
3 | +=(Add and Assignment) Agrega el operando derecho al operando izquierdo y asigna el resultado al operando izquierdo. Ex: C + = A es equivalente a C = C + A |
4 | ─=(Subtract and Assignment) Resta el operando derecho del operando izquierdo y asigna el resultado al operando izquierdo. Ex: C - = A es equivalente a C = C - A |
5 | *=(Multiply and Assignment) Multiplica el operando derecho por el operando izquierdo y asigna el resultado al operando izquierdo. Ex: C * = A es equivalente a C = C * A |
6 | /=(Divide and Assignment) Divide el operando izquierdo con el operando derecho y asigna el resultado al operando izquierdo. |
Note - La misma lógica se aplica a los operadores bit a bit, por lo que se convertirán en ≪ =, ≫ =, ≫ =, ≫ =, | = y ^ =.
Operadores logicos
Los operadores lógicos se utilizan para combinar dos o más condiciones. Los operadores lógicos devuelven un valor booleano. Suponga que el valor de la variable A es 10 y B es 20.
Mostrar ejemplos
Operador | Descripción | Ejemplo |
---|---|---|
&& | And - El operador devuelve verdadero solo si todas las expresiones especificadas devuelven verdadero |
(A> 10 && B> 10) es falso. |
|| | OR - El operador devuelve verdadero si al menos una de las expresiones especificadas devuelve verdadero |
(A> 10 || B> 10) es verdadero. |
! | NOT- El operador devuelve el inverso del resultado de la expresión. Por ejemplo:! (7> 5) devuelve falso |
! (A> 10) es verdadero. |
Expresiones condicionales
Dart tiene dos operadores que le permiten evaluar expresiones que de otro modo podrían requerir declaraciones ifelse:
condición? expr1: expr2
Si la condición es verdadera, la expresión se evalúa expr1(y devuelve su valor); de lo contrario, evalúa y devuelve el valor deexpr2.
expr1 ?? expr2
Si expr1no es nulo, devuelve su valor; de lo contrario, evalúa y devuelve el valor deexpr2
Ejemplo
El siguiente ejemplo muestra cómo puede usar la expresión condicional en Dart:
void main() {
var a = 10;
var res = a > 12 ? "value greater than 10":"value lesser than or equal to 10";
print(res);
}
Producirá la siguiente salida:
value lesser than or equal to 10
Ejemplo
Tomemos otro ejemplo:
void main() {
var a = null;
var b = 12;
var res = a ?? b;
print(res);
}
Producirá la siguiente salida:
12
A veces, ciertas instrucciones requieren una ejecución repetida. Los bucles son una forma ideal de hacer lo mismo. Un bucle representa un conjunto de instrucciones que deben repetirse. En el contexto de un bucle, una repetición se denominaiteration.
La siguiente figura ilustra la clasificación de bucles:
Comencemos la discusión con Definite Loops. Un bucle cuyo número de iteraciones es definido / fijo se denominadefinite loop.
No Señor | Bucle y descripción |
---|---|
1 | en bucle los forloop es una implementación de un loop definido. El bucle for ejecuta el bloque de código durante un número específico de veces. Se puede usar para iterar sobre un conjunto fijo de valores, como una matriz. |
2 | para ... en bucle El bucle for ... in se utiliza para recorrer las propiedades de un objeto. |
Continuando, analicemos ahora los bucles indefinidos. Un ciclo indefinido se usa cuando el número de iteraciones en un ciclo es indeterminado o desconocido. Los bucles indefinidos se pueden implementar usando -
No Señor | Bucle y descripción |
---|---|
1 | while Loop El ciclo while ejecuta las instrucciones cada vez que la condición especificada se evalúa como verdadera. En otras palabras, el ciclo evalúa la condición antes de que se ejecute el bloque de código. |
2 | hacer ... while Loop El bucle do… while es similar al bucle while excepto que el bucle do ... while no evalúa la condición por primera vez que se ejecuta. |
Pasemos ahora y discutamos el Loop Control Statements de Dart.
No Señor | Declaración de control y descripción |
---|---|
1 | declaración de rotura los breakLa declaración se usa para quitar el control de una construcción. Utilizandobreaken un bucle hace que el programa salga del bucle. A continuación se muestra un ejemplo debreak declaración. |
2 | continuar declaración los continue declaración omite las declaraciones subsiguientes en la iteración actual y lleva el control al principio del ciclo. |
Uso de etiquetas para controlar el flujo
UN labeles simplemente un identificador seguido de dos puntos (:) que se aplica a una declaración o un bloque de código. Se puede usar una etiqueta conbreak y continue para controlar el flujo con mayor precisión.
No se permiten saltos de línea entre ‘continue’ o ‘break’declaración y su nombre de etiqueta. Además, no debería haber ninguna otra declaración entre un nombre de etiqueta y un bucle asociado.
Ejemplo: etiqueta con rotura
void main() {
outerloop: // This is the label name
for (var i = 0; i < 5; i++) {
print("Innerloop: ${i}"); innerloop: for (var j = 0; j < 5; j++) { if (j > 3 ) break ; // Quit the innermost loop if (i == 2) break innerloop; // Do the same thing if (i == 4) break outerloop; // Quit the outer loop print("Innerloop: ${j}");
}
}
}
El seguimiento output se muestra en la ejecución exitosa del código anterior.
Innerloop: 0
Innerloop: 0
Innerloop: 1
Innerloop: 2
Innerloop: 3
Innerloop: 1
Innerloop: 0
Innerloop: 1
Innerloop: 2
Innerloop: 3
Innerloop: 2
Innerloop: 3
Innerloop: 0
Innerloop: 1
Innerloop: 2
Innerloop: 3
Innerloop: 4
Ejemplo: etiqueta con continuar
void main() {
outerloop: // This is the label name
for (var i = 0; i < 3; i++) {
print("Outerloop:${i}"); for (var j = 0; j < 5; j++) { if (j == 3){ continue outerloop; } print("Innerloop:${j}");
}
}
}
La siguiente salida se muestra en la ejecución exitosa del código anterior.
Outerloop: 0
Innerloop: 0
Innerloop: 1
Innerloop: 2
Outerloop: 1
Innerloop: 0
Innerloop: 1
Innerloop: 2
Outerloop: 2
Innerloop: 0
Innerloop: 1
Innerloop: 2
Una construcción condicional / de toma de decisiones evalúa una condición antes de que se ejecuten las instrucciones.
Las construcciones condicionales en Dart se clasifican en la siguiente tabla.
No Señor | Declaración y descripción |
---|---|
1 | if declaración Un if declaración consta de una expresión booleana seguida de una o más declaraciones. |
2 | Si ... otra declaración Un if puede ir seguido de un opcional elsebloquear. loselse bloque se ejecutará si la expresión booleana probada por el if el bloque se evalúa como falso. |
3 | más ... si escalera los else…if ladderes útil para probar múltiples condiciones. A continuación se muestra la sintaxis del mismo. |
4 | cambiar ... declaración de caso La instrucción de cambio evalúa una expresión, hace coincidir el valor de la expresión con una cláusula de caso y ejecuta las declaraciones asociadas con ese caso. |
Los números de dardos se pueden clasificar como:
int- Entero de tamaño arbitrario. losint El tipo de datos se utiliza para representar números enteros.
double- Números de coma flotante de 64 bits (doble precisión), según lo especificado por el estándar IEEE 754. losdouble el tipo de datos se utiliza para representar números fraccionarios
los num el tipo es heredado por el int y doubletipos. losdart core library permite numerosas operaciones sobre valores numéricos.
La sintaxis para declarar un número es la siguiente:
int var_name; // declares an integer variable
double var_name; // declares a double variable
Ejemplo
void main() {
// declare an integer
int num1 = 10;
// declare a double value
double num2 = 10.50;
// print the values
print(num1);
print(num2);
}
Producirá la siguiente salida:
10
10.5
Note - el Dart VM arrojará una excepción si se asignan valores fraccionarios a variables enteras.
Analizando
los parse()La función estática permite analizar una cadena que contiene un literal numérico en un número. La siguiente ilustración demuestra lo mismo:
void main() {
print(num.parse('12'));
print(num.parse('10.91'));
}
El código anterior dará como resultado la siguiente salida:
12
10.91
La función de análisis arroja un FormatExceptionsi se le pasa cualquier valor que no sean números. El siguiente código muestra cómo pasar un valor alfanumérico alparse() función.
Ejemplo
void main() {
print(num.parse('12A'));
print(num.parse('AAAA'));
}
El código anterior dará como resultado la siguiente salida:
Unhandled exception:
FormatException: 12A
#0 num.parse (dart:core/num.dart:446)
#1 main (file:///D:/Demos/numbers.dart:4:13)
#2 _startIsolate.<anonymous closure> (dart:isolatepatch/isolate_patch.dart:261)
#3 _RawReceivePortImpl._handleMessage (dart:isolatepatch/isolate_patch.dart:148)
Propiedades numéricas
La siguiente tabla enumera las propiedades admitidas por los números de Dart.
No Señor | Descripción de propiedad |
---|---|
1 | código hash Devuelve un código hash para un valor numérico. |
2 | isFinite Verdadero si el número es finito; de lo contrario, falso. |
3 | es infinito Verdadero si el número es infinito positivo o infinito negativo; de lo contrario, falso. |
4 | isNan Verdadero si el número es el valor doble de Not-a-Number; de lo contrario, falso. |
5 | isNegative Verdadero si el número es negativo; de lo contrario, falso. |
6 | firmar Devuelve menos uno, cero o más uno según el signo y el valor numérico del número. |
7 | incluso Devuelve verdadero si el número es par. |
8 | es impar Devuelve verdadero si el número es impar. |
Métodos numéricos
A continuación se muestra una lista de métodos de uso común respaldados por números:
No Señor | Método y descripción |
---|---|
1 | abdominales Devuelve el valor absoluto del número. |
2 | hacer techo Devuelve el menor número entero no menor que el número. |
3 | comparar con Compara esto con otro número. |
4 | Suelo Devuelve el mayor número entero no mayor que el número actual. |
5 | recordatorio Devuelve el resto truncado después de dividir los dos números. |
6 | Redondo Devuelve el número entero más cercano a los números actuales. |
7 | para duplicar Devuelve el doble equivalente del número. |
8 | toInt Devuelve el equivalente entero del número. |
9 | Devuelve la representación equivalente en cadena del número. |
10 | truncar Devuelve un número entero después de descartar cualquier dígito fraccionario. |
El tipo de datos String representa una secuencia de caracteres. Una cadena de dardos es una secuencia de unidades de código UTF 16.
Los valores de cadena en Dart se pueden representar usando comillas simples, dobles o triples. Las cadenas de una sola línea se representan mediante comillas simples o dobles. Las comillas triples se utilizan para representar cadenas de varias líneas.
La sintaxis para representar valores de cadena en Dart es la siguiente:
Sintaxis
String variable_name = 'value'
OR
String variable_name = ''value''
OR
String variable_name = '''line1
line2'''
OR
String variable_name= ''''''line1
line2''''''
El siguiente ejemplo ilustra el uso del tipo de datos String en Dart.
void main() {
String str1 = 'this is a single line string';
String str2 = "this is a single line string";
String str3 = '''this is a multiline line string''';
String str4 = """this is a multiline line string""";
print(str1);
print(str2);
print(str3);
print(str4);
}
Producirá lo siguiente Output -
this is a single line string
this is a single line string
this is a multiline line string
this is a multiline line string
Las cuerdas son inmutables. Sin embargo, las cadenas se pueden someter a varias operaciones y la cadena resultante se puede almacenar como un nuevo valor.
Interpolación de cadenas
El proceso de crear una nueva cadena agregando un valor a una cadena estática se denomina concatenation o interpolation. En otras palabras, es el proceso de agregar una cadena a otra cadena.
El operador más (+) es un mecanismo comúnmente utilizado para concatenar / interpolar cadenas.
Ejemplo 1
void main() {
String str1 = "hello";
String str2 = "world";
String res = str1+str2;
print("The concatenated string : ${res}");
}
Producirá lo siguiente output -
The concatenated string : Helloworld
Ejemplo 2
Puede utilizar "$ {}" para interpolar el valor de una expresión de Dart dentro de cadenas. El siguiente ejemplo ilustra lo mismo.
void main() {
int n=1+1;
String str1 = "The sum of 1 and 1 is ${n}"; print(str1); String str2 = "The sum of 2 and 2 is ${2+2}";
print(str2);
}
Producirá lo siguiente output -
The sum of 1 and 1 is 2
The sum of 2 and 2 is 4
Propiedades de cadena
Las propiedades enumeradas en la siguiente tabla son todas de solo lectura.
No Señor | Descripción de propiedad |
---|---|
1 | codeUnits Devuelve una lista no modificable de las unidades de código UTF-16 de esta cadena. |
2 | esta vacio Devuelve verdadero si esta cadena está vacía. |
3 | Longitud Devuelve la longitud de la cadena, incluidos los caracteres de espacio, tabulación y nueva línea. |
Métodos para manipular cadenas
La clase String en el dart: core librarytambién proporciona métodos para manipular cadenas. Algunos de estos métodos se dan a continuación:
No Señor | Métodos y descripción |
---|---|
1 | toLowerCase () Convierte todos los caracteres de esta cadena a minúsculas. |
2 | toUpperCase () Convierte todos los caracteres de esta cadena a mayúsculas. |
3 | podar() Devuelve la cadena sin espacios en blanco iniciales y finales. |
4 | comparar con() Compara este objeto con otro. |
5 | reemplaza todo() Reemplaza todas las subcadenas que coinciden con el patrón especificado con un valor dado. |
6 | división() Divide la cadena en coincidencias con el delimitador especificado y devuelve una lista de subcadenas. |
7 | subcadena () Devuelve la subcadena de esta cadena que se extiende desde startIndex, inclusive, hasta endIndex, exclusivo. |
8 | Encadenar() Devuelve una representación de cadena de este objeto. |
9 | codeUnitAt () Devuelve la unidad de código UTF-16 de 16 bits en el índice dado. |
Dart proporciona un soporte incorporado para el tipo de datos booleanos. El tipo de datos booleano en DART solo admite dos valores: verdadero y falso. La palabra clave bool se utiliza para representar un literal booleano en DART.
La sintaxis para declarar una variable booleana en DART es la siguiente:
bool var_name = true;
OR
bool var_name = false
Ejemplo
void main() {
bool test;
test = 12 > 5;
print(test);
}
Producirá lo siguiente output -
true
Ejemplo
A diferencia de JavaScript, el tipo de datos booleano reconoce solo el literal verdadero como verdadero. Cualquier otro valor se considera falso. Considere el siguiente ejemplo:
var str = 'abc';
if(str) {
print('String is not empty');
} else {
print('Empty String');
}
El fragmento de código anterior, si se ejecuta en JavaScript, imprimirá el mensaje 'La cadena no está vacía' ya que la construcción if devolverá verdadero si la cadena no está vacía.
Sin embargo, en Dart, strse convierte en falso como str! = true . Por lo tanto, el fragmento imprimirá el mensaje 'Cadena vacía' (cuando se ejecuta en modo no seleccionado).
Ejemplo
El fragmento anterior si se ejecuta en checkedel modo lanzará una excepción. Lo mismo se ilustra a continuación:
void main() {
var str = 'abc';
if(str) {
print('String is not empty');
} else {
print('Empty String');
}
}
Producirá lo siguiente output, en Checked Mode -
Unhandled exception:
type 'String' is not a subtype of type 'bool' of 'boolean expression' where
String is from dart:core
bool is from dart:core
#0 main (file:///D:/Demos/Boolean.dart:5:6)
#1 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:261)
#2 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148)
Producirá lo siguiente output, en Unchecked Mode -
Empty String
Note - el WebStorm IDE se ejecuta en modo marcado, de forma predeterminada.
Una colección muy utilizada en programación es un array. Dart representa matrices en forma deListobjetos. UNListes simplemente un grupo ordenado de objetos. losdart:core Library proporciona la clase List que permite la creación y manipulación de listas.
La representación lógica de una lista en Dart se da a continuación:
test_list - es el identificador que hace referencia a la colección.
La lista contiene los valores 12, 13 y 14. Los bloques de memoria que contienen estos valores se conocen como elements.
Cada elemento de la Lista está identificado por un número único llamado index. El índice comienza desdezero y se extiende hasta n-1 dónde nes el número total de elementos de la lista. El índice también se conoce comosubscript.
Las listas se pueden clasificar como:
- Lista de longitud fija
- Lista de crecimiento
Analicemos ahora estos dos tipos de lists en detalle.
Lista de longitud fija
La longitud de una lista de longitud fija no puede cambiar en tiempo de ejecución. La sintaxis para crear una lista de longitud fija es la siguiente:
Step 1 − Declaring a list
La sintaxis para declarar una lista de longitud fija se da a continuación:
var list_name = new List(initial_size)
La sintaxis anterior crea una lista del tamaño especificado. La lista no puede crecer ni reducirse en tiempo de ejecución. Cualquier intento de cambiar el tamaño de la lista resultará en una excepción.
Step 2 − Initializing a list
La sintaxis para inicializar una lista es la siguiente:
lst_name[index] = value;
Ejemplo
void main() {
var lst = new List(3);
lst[0] = 12;
lst[1] = 13;
lst[2] = 11;
print(lst);
}
Producirá lo siguiente output -
[12, 13, 11]
Lista de crecimiento
La longitud de una lista ampliable puede cambiar en tiempo de ejecución. La sintaxis para declarar e inicializar una lista ampliable es la siguiente:
Step 1 − Declaring a List
var list_name = [val1,val2,val3]
--- creates a list containing the specified values
OR
var list_name = new List()
--- creates a list of size zero
Step 2 − Initializing a List
El índice / subíndice se utiliza para hacer referencia al elemento que debe rellenarse con un valor. La sintaxis para inicializar una lista es la siguiente:
list_name[index] = value;
Ejemplo
El siguiente ejemplo muestra cómo crear una lista de 3 elementos.
void main() {
var num_list = [1,2,3];
print(num_list);
}
Producirá lo siguiente output -
[1, 2, 3]
Ejemplo
El siguiente ejemplo crea una lista de longitud cero utilizando el empty List() constructor. losadd() función en el List La clase se usa para agregar elementos dinámicamente a la lista.
void main() {
var lst = new List();
lst.add(12);
lst.add(13);
print(lst);
}
Producirá lo siguiente output -
[12, 13]
Propiedades de lista
La siguiente tabla enumera algunas propiedades de uso común del List clase en el dart:core library.
No Señor | Métodos y descripción |
---|---|
1 | primero Devuelve el primer caso del elemento. |
2 | esta vacio Devuelve verdadero si la colección no tiene elementos. |
3 | no está vacío Devuelve verdadero si la colección tiene al menos un elemento. |
4 | longitud Devuelve el tamaño de la lista. |
5 | last Returns the last element in the list. |
6 | reversed Returns an iterable object containing the lists values in the reverse order. |
7 | Single Checks if the list has only one element and returns it. |
In this chapter, we will discuss how to carry out some basic operations on Lists, such as −
Sr.No | Basic Operation & Description |
---|---|
1 | Inserting Elements into a List Mutable Lists can grow dynamically at runtime. The List.add() function appends the specified value to the end of the List and returns a modified List object. |
2 | Updating a list Lists in Dart can be updated by −
|
3 | Removing List items The following functions supported by the List class in the dart:core library can be used to remove the item(s) in a List. |
The Map object is a simple key/value pair. Keys and values in a map may be of any type. A Map is a dynamic collection. In other words, Maps can grow and shrink at runtime.
Maps can be declared in two ways −
- Using Map Literals
- Using a Map constructor
Declaring a Map using Map Literals
To declare a map using map literals, you need to enclose the key-value pairs within a pair of curly brackets "{ }".
Here is its syntax −
var identifier = { key1:value1, key2:value2 [,…..,key_n:value_n] }
Declarar un mapa usando un constructor de mapas
Para declarar un mapa usando un constructor de mapas, tenemos dos pasos. Primero, declare el mapa y segundo, inicialice el mapa.
los syntax a declare a map es como sigue -
var identifier = new Map()
Ahora, use la siguiente sintaxis para initialize the map -
map_name[key] = value
Ejemplo: Map Literal
void main() {
var details = {'Usrname':'tom','Password':'pass@123'};
print(details);
}
Producirá lo siguiente output -
{Usrname: tom, Password: pass@123}
Ejemplo: agregar valores a los literales de mapas en tiempo de ejecución
void main() {
var details = {'Usrname':'tom','Password':'pass@123'};
details['Uid'] = 'U1oo1';
print(details);
}
Producirá lo siguiente output -
{Usrname: tom, Password: pass@123, Uid: U1oo1}
Ejemplo: constructor de mapas
void main() {
var details = new Map();
details['Usrname'] = 'admin';
details['Password'] = 'admin@123';
print(details);
}
Producirá lo siguiente output -
{Usrname: admin, Password: admin@123}
Note - Un valor de mapa puede ser cualquier objeto, incluido NULL.
Mapa - Propiedades
los Map clase en el paquete dart: core define las siguientes propiedades:
No Señor | Descripción de propiedad |
---|---|
1 | Llaves Devuelve un objeto iterable que representa claves |
2 | Valores Devuelve un objeto iterable que representa valores. |
3 | Longitud Devuelve el tamaño del mapa |
4 | esta vacio Devuelve verdadero si el mapa es un mapa vacío |
5 | no está vacío Devuelve verdadero si el mapa es un mapa vacío |
Mapa - Funciones
A continuación, se muestran las funciones más utilizadas para manipular mapas en Dart.
No Señor | Nombre y descripción de la función |
---|---|
1 | añadir todo() Agrega todos los pares clave-valor de otros a este mapa. |
2 | claro() Elimina todos los pares del mapa. |
3 | eliminar() Elimina la clave y su valor asociado, si está presente, del mapa. |
4 | para cada() Aplica f a cada par clave-valor del mapa. |
Los símbolos en Dart son nombres de cadenas dinámicos y opacos que se utilizan para reflejar los metadatos de una biblioteca. En pocas palabras, los símbolos son una forma de almacenar la relación entre una cadena legible por humanos y una cadena que está optimizada para ser utilizada por computadoras.
La reflexión es un mecanismo para obtener metadatos de un tipo en tiempo de ejecución, como el número de métodos en una clase, el número de constructores que tiene o el número de parámetros en una función. Incluso puede invocar un método del tipo que se carga en tiempo de ejecución.
En Dart Reflexión, las clases específicas están disponibles en el dart:mirrorspaquete. Esta biblioteca funciona tanto en aplicaciones web como en aplicaciones de línea de comandos.
Sintaxis
Symbol obj = new Symbol('name');
// expects a name of class or function or library to reflect
los name debe ser un nombre de miembro público de Dart válido, un nombre de constructor público o un nombre de biblioteca.
Ejemplo
Considere el siguiente ejemplo. El código declara una claseFoo en una biblioteca foo_lib. La clase define los métodosm1, m2, y m3.
Foo.dart
library foo_lib;
// libarary name can be a symbol
class Foo {
// class name can be a symbol
m1() {
// method name can be a symbol
print("Inside m1");
}
m2() {
print("Inside m2");
}
m3() {
print("Inside m3");
}
}
Se carga el siguiente código Foo.dartbiblioteca y busca la clase Foo, con la ayuda del tipo de símbolo. Dado que estamos reflejando los metadatos de la biblioteca anterior, el código se importadart:mirrors biblioteca.
FooSymbol.dart
import 'dart:core';
import 'dart:mirrors';
import 'Foo.dart';
main() {
Symbol lib = new Symbol("foo_lib");
//library name stored as Symbol
Symbol clsToSearch = new Symbol("Foo");
// class name stored as Symbol
if(checkIf_classAvailableInlibrary(lib, clsToSearch))
// searches Foo class in foo_lib library
print("class found..");
}
bool checkIf_classAvailableInlibrary(Symbol libraryName, Symbol className) {
MirrorSystem mirrorSystem = currentMirrorSystem();
LibraryMirror libMirror = mirrorSystem.findLibrary(libraryName);
if (libMirror != null) {
print("Found Library");
print("checkng...class details..");
print("No of classes found is : ${libMirror.declarations.length}");
libMirror.declarations.forEach((s, d) => print(s));
if (libMirror.declarations.containsKey(className)) return true;
return false;
}
}
Tenga en cuenta que la línea libMirror.declarations.forEach ((s, d) => print (s)); iterará a través de cada declaración en la biblioteca en tiempo de ejecución e imprimirá las declaraciones como tipo deSymbol.
Este código debería producir lo siguiente output -
Found Library
checkng...class details..
No of classes found is : 1
Symbol("Foo") // class name displayed as symbol
class found.
Ejemplo: muestra el número de métodos de instancia de una clase
Consideremos ahora mostrar el número de métodos de instancia en una clase. La clase predefinidaClassMirror nos ayuda a lograr lo mismo.
import 'dart:core';
import 'dart:mirrors';
import 'Foo.dart';
main() {
Symbol lib = new Symbol("foo_lib");
Symbol clsToSearch = new Symbol("Foo");
reflect_InstanceMethods(lib, clsToSearch);
}
void reflect_InstanceMethods(Symbol libraryName, Symbol className) {
MirrorSystem mirrorSystem = currentMirrorSystem();
LibraryMirror libMirror = mirrorSystem.findLibrary(libraryName);
if (libMirror != null) {
print("Found Library");
print("checkng...class details..");
print("No of classes found is : ${libMirror.declarations.length}");
libMirror.declarations.forEach((s, d) => print(s));
if (libMirror.declarations.containsKey(className)) print("found class");
ClassMirror classMirror = libMirror.declarations[className];
print("No of instance methods found is ${classMirror.instanceMembers.length}");
classMirror.instanceMembers.forEach((s, v) => print(s));
}
}
Este código debería producir lo siguiente output -
Found Library
checkng...class details..
No of classes found is : 1
Symbol("Foo")
found class
No of instance methods found is 8
Symbol("==")
Symbol("hashCode")
Symbol("toString")
Symbol("noSuchMethod")
Symbol("runtimeType")
Symbol("m1")
Symbol("m2")
Symbol("m3")
Convertir símbolo en cadena
Puede convertir el nombre de un tipo como clase o biblioteca almacenada en un símbolo de nuevo en cadena usando MirrorSystemclase. El siguiente código muestra cómo puede convertir un símbolo en una cadena.
import 'dart:mirrors';
void main(){
Symbol lib = new Symbol("foo_lib");
String name_of_lib = MirrorSystem.getName(lib);
print(lib);
print(name_of_lib);
}
Debería producir lo siguiente output -
Symbol("foo_lib")
foo_lib
Las cadenas son una secuencia de caracteres. Dart representa cadenas como una secuencia de unidades de código Unicode UTF-16. Unicode es un formato que define un valor numérico único para cada letra, dígito y símbolo.
Dado que una cadena Dart es una secuencia de unidades de código UTF-16, los valores Unicode de 32 bits dentro de una cadena se representan mediante una sintaxis especial. UNrune es un número entero que representa un punto de código Unicode.
La clase String en el dart:core la biblioteca proporciona mecanismos para acceder runes. Se puede acceder a las unidades / runas de código de cadena de tres maneras:
- Usando la función String.codeUnitAt ()
- Usando la propiedad String.codeUnits
- Usando la propiedad String.runes
Función String.codeUnitAt ()
Se puede acceder a las unidades de código en una cadena a través de sus índices. Devuelve la unidad de código UTF-16 de 16 bits en el índice dado.
Sintaxis
String.codeUnitAt(int index);
Ejemplo
import 'dart:core';
void main(){
f1();
}
f1() {
String x = 'Runes';
print(x.codeUnitAt(0));
}
Producirá lo siguiente output -
82
Propiedad String.codeUnits
Esta propiedad devuelve una lista no modificable de las unidades de código UTF-16 de la cadena especificada.
Sintaxis
String. codeUnits;
Ejemplo
import 'dart:core';
void main(){
f1();
}
f1() {
String x = 'Runes';
print(x.codeUnits);
}
Producirá lo siguiente output -
[82, 117, 110, 101, 115]
Propiedad String.runes
Esta propiedad devuelve un iterable de puntos de código Unicode de este string.Runes se extiende iterable.
Sintaxis
String.runes
Ejemplo
void main(){
"A string".runes.forEach((int rune) {
var character=new String.fromCharCode(rune);
print(character);
});
}
Producirá lo siguiente output -
A
s
t
r
i
n
g
Los puntos de código Unicode generalmente se expresan como \uXXXX, donde XXXX es un valor hexadecimal de 4 dígitos. Para especificar más o menos de 4 dígitos hexadecimales, coloque el valor entre corchetes. Se puede usar el constructor de la clase Runes en la biblioteca dart: core para el mismo.
Ejemplo
main() {
Runes input = new Runes(' \u{1f605} ');
print(new String.fromCharCodes(input));
}
Producirá lo siguiente output -
Se utiliza una enumeración para definir valores constantes con nombre. Un tipo enumerado se declara utilizando elenum palabra clave.
Sintaxis
enum enum_name {
enumeration list
}
Dónde,
- El enum_name especifica el nombre del tipo de enumeración
- La lista de enumeración es una lista de identificadores separados por comas
Cada uno de los símbolos de la lista de enumeración representa un valor entero, uno mayor que el símbolo que lo precede. De forma predeterminada, el valor del primer símbolo de enumeración es 0.
Por ejemplo
enum Status {
none,
running,
stopped,
paused
}
Ejemplo
enum Status {
none,
running,
stopped,
paused
}
void main() {
print(Status.values);
Status.values.forEach((v) => print('value: $v, index: ${v.index}')); print('running: ${Status.running}, ${Status.running.index}'); print('running index: ${Status.values[1]}');
}
Producirá lo siguiente output -
[Status.none, Status.running, Status.stopped, Status.paused]
value: Status.none, index: 0
value: Status.running, index: 1
value: Status.stopped, index: 2
value: Status.paused, index: 3
running: Status.running, 1
running index: Status.running
Las funciones son los componentes básicos del código legible, mantenible y reutilizable. Una función es un conjunto de declaraciones para realizar una tarea específica. Las funciones organizan el programa en bloques lógicos de código. Una vez definidas, las funciones se pueden llamar para acceder al código. Esto hace que el código sea reutilizable. Además, las funciones facilitan la lectura y el mantenimiento del código del programa.
Una declaración de función le dice al compilador sobre el nombre, el tipo de retorno y los parámetros de una función. Una definición de función proporciona el cuerpo real de la función.
No Señor | Funciones y descripción |
---|---|
1 | Definición de una función Una definición de función especifica qué y cómo se haría una tarea específica. |
2 | Llamar a una función Se debe llamar a una función para ejecutarla. |
3 | Funciones de retorno Las funciones también pueden devolver valor junto con el control, de vuelta a la persona que llama. |
4 | Función parametrizada Los parámetros son un mecanismo para pasar valores a funciones. |
Parámetros opcionales
Los parámetros opcionales se pueden usar cuando los argumentos no necesitan pasarse obligatoriamente para la ejecución de una función. Un parámetro se puede marcar como opcional agregando un signo de interrogación a su nombre. El parámetro opcional debe establecerse como el último argumento de una función.
Tenemos tres tipos de parámetros opcionales en Dart:
No Señor | Descripción de parámetros |
---|---|
1 | Parámetro posicional opcional Para especificar parámetros posicionales opcionales, utilice corchetes []. |
2 | Parámetro con nombre opcional A diferencia de los parámetros posicionales, el nombre del parámetro debe especificarse mientras se pasa el valor. Se puede utilizar una llave {} para especificar parámetros con nombre opcionales. |
3 | Parámetros opcionales con valores predeterminados A los parámetros de función también se les pueden asignar valores por defecto. Sin embargo, dichos parámetros también pueden ser valores pasados explícitamente. |
Funciones de dardos recursivas
La recursividad es una técnica para iterar sobre una operación haciendo que una función se llame a sí misma repetidamente hasta que llegue a un resultado. La recursividad se aplica mejor cuando necesita llamar a la misma función repetidamente con diferentes parámetros dentro de un bucle.
Ejemplo
void main() {
print(factorial(6));
}
factorial(number) {
if (number <= 0) {
// termination case
return 1;
} else {
return (number * factorial(number - 1));
// function invokes itself
}
}
Debería producir lo siguiente output -
720
Funciones lambda
Las funciones lambda son un mecanismo conciso para representar funciones. Estas funciones también se denominan funciones de flecha.
Sintaxis
[return_type]function_name(parameters)=>expression;
Ejemplo
void main() {
printMsg();
print(test());
}
printMsg()=>
print("hello");
int test()=>123;
// returning function
Debería producir lo siguiente output -
hello 123
Un interfacedefine la sintaxis a la que debe adherirse cualquier entidad. Las interfaces definen un conjunto de métodos disponibles en un objeto. Dart no tiene una sintaxis para declarar interfaces. Las declaraciones de clase son en sí mismas interfaces en Dart.
Classesdebe usar la palabra clave implements para poder usar una interfaz. Es obligatorio que la clase de implementación proporcione una implementación concreta de todas las funciones de la interfaz implementada. En otras palabras, una clase debe redefinir cada función en la interfaz que desea implementar.
Sintaxis: implementación de una interfaz
class identifier implements interface_name
Ejemplo
En el siguiente programa, estamos declarando una clase Printer. losConsolePrinter La clase implementa la declaración de interfaz implícita para el Printerclase. losmain La función crea un objeto de la ConsolePrinter clase usando el newpalabra clave. Este objeto se usa para invocar la funciónprint_data definido en el ConsolePrinter clase.
void main() {
ConsolePrinter cp= new ConsolePrinter();
cp.print_data();
}
class Printer {
void print_data() {
print("__________Printing Data__________");
}
}
class ConsolePrinter implements Printer {
void print_data() {
print("__________Printing to Console__________");
}
}
Debería producir lo siguiente output -
__________Printing to Console__________
Implementación de múltiples interfaces
Una clase puede implementar múltiples interfaces. Las interfaces están separadas por una coma. lossyntax porque lo mismo se da a continuación:
class identifier implements interface-1,interface_2,interface_4…….
El seguimiento example muestra cómo puede implementar múltiples interfaces en Dart -
void main() {
Calculator c = new Calculator();
print("The gross total : ${c.ret_tot()}"); print("Discount :${c.ret_dis()}");
}
class Calculate_Total {
int ret_tot() {}
}
class Calculate_Discount {
int ret_dis() {}
}
class Calculator implements Calculate_Total,Calculate_Discount {
int ret_tot() {
return 1000;
}
int ret_dis() {
return 50;
}
}
Debería producir lo siguiente output -
The gross total: 1000
Discount:50
Dart es un lenguaje orientado a objetos. Admite funciones de programación orientadas a objetos como clases, interfaces, etc.classen términos de programación orientada a objetos es un modelo para la creación de objetos. UNclassencapsula datos para el objeto. Dart brinda soporte integrado para este concepto llamadoclass.
Declarar una clase
Utilizar el class palabra clave para declarar una classen Dart. Una definición de clase comienza con la palabra clave class seguida de laclass name; y el cuerpo de la clase encerrado por un par de llaves. La sintaxis para el mismo se da a continuación:
Sintaxis
class class_name {
<fields>
<getters/setters>
<constructors>
<functions>
}
los classLa palabra clave va seguida del nombre de la clase. Las reglas para los identificadores deben tenerse en cuenta al nombrar una clase.
Una definición de clase puede incluir lo siguiente:
Fields- Un campo es cualquier variable declarada en una clase. Los campos representan datos pertenecientes a objetos.
Setters and Getters- Permite al programa inicializar y recuperar los valores de los campos de una clase. Un getter / setter predeterminado está asociado con cada clase. Sin embargo, los predeterminados se pueden anular definiendo explícitamente un setter / getter.
Constructors - responsable de asignar memoria para los objetos de la clase.
Functions- Las funciones representan acciones que puede realizar un objeto. A veces también se les conoce como métodos.
Estos componentes juntos se denominan como data members de la clase.
Ejemplo: declarar una clase
class Car {
// field
String engine = "E1001";
// function
void disp() {
print(engine);
}
}
El ejemplo declara una clase Car. La clase tiene un campo llamadoengine. losdisp() es una función simple que imprime el valor del campo engine.
Creando instancia de la clase
Para crear una instancia de la clase, use la newpalabra clave seguida del nombre de la clase. La sintaxis para el mismo se da a continuación:
Sintaxis
var object_name = new class_name([ arguments ])
los new La palabra clave es responsable de la creación de instancias.
El lado derecho de la expresión invoca al constructor. Se deben pasar valores al constructor si está parametrizado.
Ejemplo: instanciar una clase
var obj = new Car("Engine 1")
Acceder a atributos y funciones
Se puede acceder a los atributos y funciones de una clase a través del objeto. Utilizar el '.' notación de puntos (llamada comoperiod) para acceder a los miembros de datos de una clase.
//accessing an attribute
obj.field_name
//accessing a function
obj.function_name()
Ejemplo
Eche un vistazo al siguiente ejemplo para comprender cómo acceder a los atributos y funciones en Dart:
void main() {
Car c= new Car();
c.disp();
}
class Car {
// field
String engine = "E1001";
// function
void disp() {
print(engine);
}
}
los output del código anterior es el siguiente:
E1001
Constructores de dardos
Un constructor es una función especial de la clase que se encarga de inicializar las variables de la clase. Dart define un constructor con el mismo nombre que el de la clase. Un constructor es una función y, por tanto, se puede parametrizar. Sin embargo, a diferencia de una función, los constructores no pueden tener un tipo de retorno. Si no declara un constructor, un valor predeterminadono-argument constructor se proporciona para usted.
Sintaxis
Class_name(parameter_list) {
//constructor body
}
Ejemplo
El siguiente ejemplo muestra cómo usar constructores en Dart:
void main() {
Car c = new Car('E1001');
}
class Car {
Car(String engine) {
print(engine);
}
}
Debería producir lo siguiente output -
E1001
Constructores nombrados
Dart proporciona named constructors para habilitar una definición de clase multiple constructors. La sintaxis de los constructores nombrados es la siguiente:
Sintaxis: Definiendo el constructor
Class_name.constructor_name(param_list)
Ejemplo
El siguiente ejemplo muestra cómo puede usar constructores con nombre en Dart:
void main() {
Car c1 = new Car.namedConst('E1001');
Car c2 = new Car();
}
class Car {
Car() {
print("Non-parameterized constructor invoked");
}
Car.namedConst(String engine) {
print("The engine is : ${engine}");
}
}
Debería producir lo siguiente output -
The engine is : E1001
Non-parameterized constructor invoked
La esta palabra clave
los thispalabra clave se refiere a la instancia actual de la clase. Aquí, el nombre del parámetro y el nombre del campo de la clase son iguales. Por lo tanto, para evitar la ambigüedad, el campo de la clase tiene el prefijothispalabra clave. El siguiente ejemplo explica lo mismo:
Ejemplo
El siguiente ejemplo explica cómo utilizar el this palabra clave en Dart -
void main() {
Car c1 = new Car('E1001');
}
class Car {
String engine;
Car(String engine) {
this.engine = engine;
print("The engine is : ${engine}");
}
}
Debería producir lo siguiente output -
The engine is : E1001
Clase de dardos ─ Getters y Setters
Getters y Setters, también llamado como accessors y mutators, permite que el programa inicialice y recupere los valores de los campos de clase respectivamente. Los getters o accessors se definen mediante elgetpalabra clave. Los setters o mutadores se definen utilizando elset palabra clave.
Un getter / setter predeterminado está asociado con cada clase. Sin embargo, los predeterminados se pueden anular definiendo explícitamente un setter / getter. Un captador no tiene parámetros y devuelve un valor, y el definidor tiene un parámetro y no devuelve un valor.
Sintaxis: Definición de un captador
Return_type get identifier
{
}
Sintaxis: Definiendo un setter
set identifier
{
}
Ejemplo
El siguiente ejemplo muestra cómo puede utilizar getters y setters en una clase de dardos -
class Student {
String name;
int age;
String get stud_name {
return name;
}
void set stud_name(String name) {
this.name = name;
}
void set stud_age(int age) {
if(age<= 0) {
print("Age should be greater than 5");
} else {
this.age = age;
}
}
int get stud_age {
return age;
}
}
void main() {
Student s1 = new Student();
s1.stud_name = 'MARK';
s1.stud_age = 0;
print(s1.stud_name);
print(s1.stud_age);
}
Este código de programa debería producir lo siguiente output -
Age should be greater than 5
MARK
Null
Herencia de clase
Dart apoya el concepto de herencia, que es la capacidad de un programa para crear nuevas clases a partir de una clase existente. La clase que se amplía para crear clases más nuevas se denomina clase padre / superclase. Las clases recién creadas se denominan clases secundarias / subclases.
Una clase hereda de otra clase usando la palabra clave 'extiende'. Child classes inherit all properties and methods except constructors from the parent class.
Sintaxis
class child_class_name extends parent_class_name
Note - Dart no admite herencia múltiple.
Ejemplo: herencia de clase
En el siguiente ejemplo, declaramos una clase Shape. La clase se amplía con elCircleclase. Dado que existe una relación de herencia entre las clases, la clase hija, es decir, la claseCar obtiene un acceso implícito a su miembro de datos de clase padre.
void main() {
var obj = new Circle();
obj.cal_area();
}
class Shape {
void cal_area() {
print("calling calc area defined in the Shape class");
}
}
class Circle extends Shape {}
Debería producir lo siguiente output -
calling calc area defined in the Shape class
Tipos de herencia
La herencia puede ser de los siguientes tres tipos:
Single - Cada clase puede extenderse como máximo a partir de una clase principal.
Multiple- Una clase puede heredar de varias clases. Dart no admite herencia múltiple.
Multi-level - Una clase puede heredar de otra clase secundaria.
Ejemplo
El siguiente ejemplo muestra cómo funciona la herencia multinivel:
void main() {
var obj = new Leaf();
obj.str = "hello";
print(obj.str);
}
class Root {
String str;
}
class Child extends Root {}
class Leaf extends Child {}
//indirectly inherits from Root by virtue of inheritance
La clase Leafderiva los atributos de las clases Root y Child en virtud de la herencia de varios niveles. Susoutput es como sigue -
hello
Dart: herencia de clases y anulación de métodos
La anulación de método es un mecanismo mediante el cual la clase secundaria redefine un método en su clase principal. El siguiente ejemplo ilustra lo mismo:
Ejemplo
void main() {
Child c = new Child();
c.m1(12);
}
class Parent {
void m1(int a){ print("value of a ${a}");} } class Child extends Parent { @override void m1(int b) { print("value of b ${b}");
}
}
Debería producir lo siguiente output -
value of b 12
El número y el tipo de los parámetros de la función deben coincidir al anular el método. En caso de una discrepancia en el número de parámetros o su tipo de datos, el compilador de Dart arroja un error. La siguiente ilustración explica lo mismo:
import 'dart:io';
void main() {
Child c = new Child();
c.m1(12);
}
class Parent {
void m1(int a){ print("value of a ${a}");} } class Child extends Parent { @override void m1(String b) { print("value of b ${b}");
}
}
Debería producir lo siguiente output -
value of b 12
La palabra clave estática
los static La palabra clave se puede aplicar a los miembros de datos de una clase, es decir, fields y methods. Una variable estática conserva sus valores hasta que el programa finaliza la ejecución. Los miembros estáticos son referenciados por el nombre de la clase.
Ejemplo
class StaticMem {
static int num;
static disp() {
print("The value of num is ${StaticMem.num}") ;
}
}
void main() {
StaticMem.num = 12;
// initialize the static variable }
StaticMem.disp();
// invoke the static method
}
Debería producir lo siguiente output -
The value of num is 12
La súper palabra clave
los superLa palabra clave se usa para referirse al padre inmediato de una clase. La palabra clave se puede utilizar para hacer referencia a la versión de superclase de unvariable, property, o method. El siguiente ejemplo ilustra lo mismo:
Ejemplo
void main() {
Child c = new Child();
c.m1(12);
}
class Parent {
String msg = "message variable from the parent class";
void m1(int a){ print("value of a ${a}");}
}
class Child extends Parent {
@override
void m1(int b) {
print("value of b ${b}"); super.m1(13); print("${super.msg}") ;
}
}
Debería producir lo siguiente output -
value of b 12
value of a 13
message variable from the parent class
La programación orientada a objetos define un objeto como "cualquier entidad que tenga un límite definido". Un objeto tiene lo siguiente:
State- Describe el objeto. Los campos de una clase representan el estado del objeto.
Behavior - Describe lo que puede hacer un objeto.
Identity- Un valor único que distingue un objeto de un conjunto de otros objetos similares. Dos o más objetos pueden compartir el estado y el comportamiento, pero no la identidad.
El operador de período (.) se utiliza junto con el objeto para acceder a los miembros de datos de una clase.
Ejemplo
Dart representa datos en forma de objetos. Cada clase en Dart extiende la clase Object. A continuación se muestra un ejemplo sencillo de creación y uso de un objeto.
class Student {
void test_method() {
print("This is a test method");
}
void test_method1() {
print("This is a test method1");
}
}
void main() {
Student s1 = new Student();
s1.test_method();
s1.test_method1();
}
Debería producir lo siguiente output -
This is a test method
This is a test method1
El operador Cascade (..)
El ejemplo anterior invoca los métodos de la clase. Sin embargo, cada vez que se llama a una función, se requiere una referencia al objeto. loscascade operator se puede utilizar como abreviatura en casos en los que hay una secuencia de invocaciones.
El operador en cascada (..) se puede utilizar para emitir una secuencia de llamadas a través de un objeto. El ejemplo anterior se puede reescribir de la siguiente manera.
class Student {
void test_method() {
print("This is a test method");
}
void test_method1() {
print("This is a test method1");
}
}
void main() {
new Student()
..test_method()
..test_method1();
}
Debería producir lo siguiente output -
This is a test method
This is a test method1
El método toString ()
Esta función devuelve una representación de cadena de un objeto. Eche un vistazo al siguiente ejemplo para comprender cómo utilizartoString método.
void main() {
int n = 12;
print(n.toString());
}
Debería producir lo siguiente output -
12
Dart, a diferencia de otros lenguajes de programación, no admite matrices. Las colecciones de Dart se pueden utilizar para replicar estructuras de datos como una matriz. La biblioteca dart: core y otras clases permiten la compatibilidad con la colección en los scripts de Dart.
Las colecciones de dardos se pueden clasificar básicamente como:
No Señor | Colección y descripción de dardos |
---|---|
1 | Lista Una lista es simplemente un grupo ordenado de objetos. losdart:core Library proporciona la clase List que permite la creación y manipulación de listas.
|
2 | Conjunto Conjunto representa una colección de objetos en los que cada objeto puede aparecer solo una vez. La biblioteca dart: core proporciona la clase Set para implementar lo mismo. |
3 | Mapas El objeto Map es un par clave / valor simple. Las claves y los valores de un mapa pueden ser de cualquier tipo. Un mapa es una colección dinámica. En otras palabras, Maps puede crecer y reducirse en tiempo de ejecución. La clase Map en la biblioteca dart: core proporciona soporte para la misma. |
4 | Cola Una cola es una colección que se puede manipular en ambos extremos. Las colas son útiles cuando desea crear una colección de primero en entrar, primero en salir. En pocas palabras, una cola inserta datos de un extremo y los elimina del otro extremo. Los valores se eliminan / leen en el orden en que se insertaron. |
Colecciones iterativas
La clase Iterator del dart:coreLa biblioteca permite un recorrido fácil de la colección Cada colección tiene uniteratorpropiedad. Esta propiedad devuelve un iterador que apunta a los objetos de la colección.
Ejemplo
El siguiente ejemplo ilustra atravesar una colección utilizando un objeto iterador.
import 'dart:collection';
void main() {
Queue numQ = new Queue();
numQ.addAll([100,200,300]);
Iterator i= numQ.iterator;
while(i.moveNext()) {
print(i.current);
}
}
los moveNext()La función devuelve un valor booleano que indica si hay una entrada posterior. loscurrent propiedad del objeto iterador devuelve el valor del objeto al que apunta actualmente el iterador.
Este programa debe producir lo siguiente output -
100
200
300
Dardo es un optionally typed language. Las colecciones en Dart son heterogéneas por defecto. En otras palabras, una sola colección de Dart puede albergar valores de varios tipos. Sin embargo, se puede hacer una colección de Dart para mantener valores homogéneos. El concepto de Genéricos se puede utilizar para lograr lo mismo.
El uso de genéricos impone una restricción sobre el tipo de datos de los valores que puede contener la colección. Estas colecciones se denominan colecciones con seguridad de tipos. La seguridad de tipos es una función de programación que garantiza que un bloque de memoria solo pueda contener datos de un tipo de datos específico.
Todas las colecciones de Dart admiten la implementación de seguridad de tipos a través de genéricos. Se usa un par de corchetes angulares que contienen el tipo de datos para declarar una colección de tipo seguro. La sintaxis para declarar una colección de tipo seguro es la siguiente.
Sintaxis
Collection_name <data_type> identifier= new Collection_name<data_type>
Las implementaciones con seguridad de tipos de List, Map, Set y Queue se muestran a continuación. Esta característica también es compatible con todas las implementaciones de los tipos de colección mencionados anteriormente.
Ejemplo: lista genérica
void main() {
List <String> logTypes = new List <String>();
logTypes.add("WARNING");
logTypes.add("ERROR");
logTypes.add("INFO");
// iterating across list
for (String type in logTypes) {
print(type);
}
}
Debería producir lo siguiente output -
WARNING
ERROR
INFO
Un intento de insertar un valor que no sea el tipo especificado resultará en un error de compilación. El siguiente ejemplo lo ilustra.
Ejemplo
void main() {
List <String> logTypes = new List <String>();
logTypes.add(1);
logTypes.add("ERROR");
logTypes.add("INFO");
//iterating across list
for (String type in logTypes) {
print(type);
}
}
Debería producir lo siguiente output -
1
ERROR
INFO
Ejemplo: conjunto genérico
void main() {
Set <int>numberSet = new Set<int>();
numberSet.add(100);
numberSet.add(20);
numberSet.add(5);
numberSet.add(60);
numberSet.add(70);
// numberSet.add("Tom");
compilation error;
print("Default implementation :${numberSet.runtimeType}");
for(var no in numberSet) {
print(no);
}
}
Debería producir lo siguiente output -
Default implementation :_CompactLinkedHashSet<int>
100
20
5
60
70
Ejemplo: cola genérica
import 'dart:collection';
void main() {
Queue<int> queue = new Queue<int>();
print("Default implementation ${queue.runtimeType}");
queue.addLast(10);
queue.addLast(20);
queue.addLast(30);
queue.addLast(40);
queue.removeFirst();
for(int no in queue){
print(no);
}
}
Debería producir lo siguiente output -
Default implementation ListQueue<int>
20
30
40
Mapa genérico
Una declaración de mapa con seguridad de tipos especifica los tipos de datos de:
- La clave
- El valor
Sintaxis
Map <Key_type, value_type>
Ejemplo
void main() {
Map <String,String>m={'name':'Tom','Id':'E1001'};
print('Map :${m}');
}
Debería producir lo siguiente output -
Map :{name: Tom, Id: E1001}
Un paquete es un mecanismo para encapsular un grupo de unidades de programación. En ocasiones, las aplicaciones pueden necesitar la integración de algunas bibliotecas o complementos de terceros. Cada lenguaje tiene un mecanismo para administrar paquetes externos como Maven o Gradle para Java, Nuget para .NET, npm para Node.js, etc. El administrador de paquetes para Dart espub.
Pub ayuda a instalar paquetes en el repositorio. El repositorio de paquetes alojados se puede encontrar enhttps://pub.dartlang.org/.
los package metadata está definido en un archivo, pubsec.yaml. YAML es el acrónimo deYet Another Markup Language. lospub La herramienta se puede utilizar para descargar todas las bibliotecas que requiere una aplicación.
Cada aplicación de Dart tiene un pubspec.yaml archivo que contiene las dependencias de la aplicación con otras bibliotecas y metadatos de aplicaciones como el nombre de la aplicación, el autor, la versión y la descripción.
El contenido de un pubspec.yaml el archivo debería verse así:
name: 'vector_victor'
version: 0.0.1
description: An absolute bare-bones web app.
...
dependencies: browser: '>=0.10.0 <0.11.0'
Lo importante pub commands son los siguientes:
No Señor | Comando y descripción |
---|---|
1 | ‘pub get’ Ayuda a obtener todos los paquetes de los que depende su aplicación. |
2 | ‘pub upgrade’ Actualiza todas sus dependencias a una versión más nueva. |
3 | ‘pub build’ Esto se usa para construir su aplicación web y creará una carpeta de compilación, con todos los scripts relacionados en ella. |
4 | ‘pub help’ Esto le brindará ayuda para todos los diferentes comandos de pub. |
Si está utilizando un IDE como WebStorm, puede hacer clic derecho en pubspec.yaml para obtener todos los comandos directamente:
Instalación de un paquete
Considere un ejemplo en el que una aplicación necesita analizar xml. Dart XML es una biblioteca ligera de código abierto y estable para analizar, recorrer, consultar y crear documentos XML.
Los pasos para lograr dicha tarea son los siguientes:
Step 1 - Agregue lo siguiente al archivo pubsec.yaml.
name: TestApp
version: 0.0.1
description: A simple console application.
#dependencies:
# foo_bar: '>=1.0.0 <2.0.0'
dependencies: https://mail.google.com/mail/u/0/images/cleardot.gif
xml:
Haga clic derecho en el pubsec.yamly obtener dependencias. Esto disparará internamente elpub get command Como se muestra abajo.
Los paquetes descargados y sus paquetes dependientes se pueden verificar en la carpeta de paquetes.
Dado que la instalación está completa ahora, debemos consultar el dart xmlen el proyecto. La sintaxis es la siguiente:
import 'package:xml/xml.dart' as xml;
Leer cadena XML
Para leer la cadena XML y verificar la entrada, Dart XML usa un parse()método. La sintaxis es la siguiente:
xml.parse(String input):
Ejemplo: análisis de la entrada de cadena XML
El siguiente ejemplo muestra cómo analizar la entrada de una cadena XML:
import 'package:xml/xml.dart' as xml;
void main(){
print("xml");
var bookshelfXml = '''<?xml version = "1.0"?>
<bookshelf>
<book>
<title lang = "english">Growing a Language</title>
<price>29.99</price>
</book>
<book>
<title lang = "english">Learning XML</title>
<price>39.95</price>
</book>
<price>132.00</price>
</bookshelf>''';
var document = xml.parse(bookshelfXml);
print(document.toString());
}
Debería producir lo siguiente output -
xml
<?xml version = "1.0"?><bookshelf>
<book>
<title lang = "english">Growing a Language</title>
<price>29.99</price>
</book>
<book>
<title lang = "english">Learning XML</title>
<price>39.95</price>
</book>
<price>132.00</price>
</bookshelf>
Una excepción (o evento excepcional) es un problema que surge durante la ejecución de un programa. Cuando ocurre una excepción, el flujo normal del programa se interrumpe y el programa / aplicación finaliza de manera anormal.
Las excepciones de Dart incorporadas incluyen:
No Señor | Excepciones y descripción |
---|---|
1 | DeferredLoadException Se lanza cuando una biblioteca diferida no se carga. |
2 | FormatException Se lanza una excepción cuando una cadena u otros datos no tienen el formato esperado y no se pueden analizar ni procesar. |
3 | IntegerDivisionByZeroException Se lanza cuando un número se divide por cero. |
4 | IOException Clase base para todas las excepciones relacionadas con Inupt-Output. |
5 | IsolateSpawnException Se lanza cuando no se puede crear un aislamiento. |
6 | Timeout Se lanza cuando se agota el tiempo de espera programado mientras se espera un resultado asincrónico. |
Cada excepción en Dart es un subtipo de la clase predefinida Exception. Las excepciones deben manejarse para evitar que la aplicación finalice abruptamente.
Los bloques try / on / catch
los tryblock incrusta código que posiblemente podría resultar en una excepción. El bloque on se utiliza cuando es necesario especificar el tipo de excepción. loscatch El bloque se usa cuando el controlador necesita el objeto de excepción.
los try El bloque debe ir seguido de exactamente uno on / catch bloque o uno finallybloque (o uno de ambos). Cuando ocurre una excepción en el bloque try, el control se transfiere alcatch.
los syntax para manejar una excepción es como se indica a continuación:
try {
// code that might throw an exception
}
on Exception1 {
// code for handling exception
}
catch Exception2 {
// code for handling exception
}
A continuación se presentan algunos puntos para recordar:
Un fragmento de código puede tener más de un bloque on / catch para manejar múltiples excepciones.
El bloque on y el bloque catch son mutuamente inclusivos, es decir, un bloque try se puede asociar tanto con el bloque on como con el bloque catch.
El siguiente código ilustra el manejo de excepciones en Dart:
Ejemplo: usar el bloque ON
El siguiente programa divide dos números representados por las variables x y yrespectivamente. El código lanza una excepción ya que intenta la división por cero. loson block contiene el código para manejar esta excepción.
main() {
int x = 12;
int y = 0;
int res;
try {
res = x ~/ y;
}
on IntegerDivisionByZeroException {
print('Cannot divide by zero');
}
}
Debería producir lo siguiente output -
Cannot divide by zero
Ejemplo: usar el bloque de captura
En el siguiente ejemplo, hemos utilizado el mismo código que el anterior. La única diferencia es que elcatch block(en lugar del bloque ON) aquí contiene el código para manejar la excepción. El parámetro decatch contiene el objeto de excepción lanzado en tiempo de ejecución.
main() {
int x = 12;
int y = 0;
int res;
try {
res = x ~/ y;
}
catch(e) {
print(e);
}
}
Debería producir lo siguiente output -
IntegerDivisionByZeroException
Ejemplo: en ... captura
El siguiente ejemplo muestra cómo utilizar el on...catch bloquear.
main() {
int x = 12;
int y = 0;
int res;
try {
res = x ~/ y;
}
on IntegerDivisionByZeroException catch(e) {
print(e);
}
}
Debería producir lo siguiente output -
IntegerDivisionByZeroException
El bloque finalmente
los finallyEl bloque incluye código que debe ejecutarse independientemente de la ocurrencia de una excepción. El opcionalfinally bloque se ejecuta incondicionalmente después try/on/catch.
La sintaxis para usar el finally el bloque es el siguiente:
try {
// code that might throw an exception
}
on Exception1 {
// exception handling code
}
catch Exception2 {
// exception handling
}
finally {
// code that should always execute; irrespective of the exception
}
El siguiente ejemplo ilustra el uso de finally bloquear.
main() {
int x = 12;
int y = 0;
int res;
try {
res = x ~/ y;
}
on IntegerDivisionByZeroException {
print('Cannot divide by zero');
}
finally {
print('Finally block executed');
}
}
Debería producir lo siguiente output -
Cannot divide by zero
Finally block executed
Lanzar una excepción
los throwLa palabra clave se utiliza para generar una excepción explícitamente. Una excepción planteada debe manejarse para evitar que el programa se cierre abruptamente.
los syntax para plantear una excepción explícitamente es -
throw new Exception_name()
Ejemplo
El siguiente ejemplo muestra cómo utilizar el throw palabra clave para lanzar una excepción -
main() {
try {
test_age(-2);
}
catch(e) {
print('Age cannot be negative');
}
}
void test_age(int age) {
if(age<0) {
throw new FormatException();
}
}
Debería producir lo siguiente output -
Age cannot be negative
Excepciones personalizadas
Como se especificó anteriormente, cada tipo de excepción en Dart es un subtipo de la clase incorporada Exception. Dart permite la creación de excepciones personalizadas ampliando las existentes. La sintaxis para definir una excepción personalizada es la siguiente:
Sintaxis: Definición de la excepción
class Custom_exception_Name implements Exception {
// can contain constructors, variables and methods
}
Las excepciones personalizadas deben plantearse explícitamente y las mismas deben manejarse en el código.
Ejemplo
El siguiente ejemplo muestra cómo definir y manejar una excepción personalizada.
class AmtException implements Exception {
String errMsg() => 'Amount should be greater than zero';
}
void main() {
try {
withdraw_amt(-1);
}
catch(e) {
print(e.errMsg());
}
finally {
print('Ending requested operation.....');
}
}
void withdraw_amt(int amt) {
if (amt <= 0) {
throw new AmtException();
}
}
En el código anterior, estamos definiendo una excepción personalizada, AmtException. El código genera la excepción si la cantidad pasada no está dentro del rango exceptuado. losmain función encierra la invocación de la función en el try...catch bloquear.
El código debería producir lo siguiente output -
Amount should be greater than zero
Ending requested operation....
De vez en cuando, los desarrolladores cometen errores al codificar. Un error en un programa se denomina error. El proceso de encontrar y corregir errores se denomina depuración y es una parte normal del proceso de desarrollo. Esta sección cubre herramientas y técnicas que pueden ayudarlo con las tareas de depuración.
El editor WebStorm habilita puntos de interrupción y depuración paso a paso. El programa se interrumpirá en el punto donde se adjunta el punto de interrupción. Esta funcionalidad es similar a la que podría esperar del desarrollo de aplicaciones Java o C #. Puede ver variables, navegar por la pila, pasar y pasar a llamadas a métodos y funciones, todo desde WebStorm Editor.
Agregar un punto de interrupción
Considere el siguiente fragmento de código. (TestString.dart)
void main() {
int a = 10, b = 20, c = 5;
c = c * c * c;
print("$a + $b = ${a+b}");
print("$a%$b = ${a%b}"); // Add a break point here print("$a*$b = ${a*b}");
print("$a/$b = ${a/b}");
print(c);
}
A add a breakpoint, haga clic en el margen izquierdo para. En la figura que se muestra a continuación, la línea número 7 tiene un punto de interrupción.
Run the program in debug mode. En el explorador de proyectos, haga clic derecho en el programa de dardos en nuestro caso TestString.dart.
Una vez que el programa se ejecute en modo de depuración, obtendrá la ventana del depurador como se muestra en la siguiente captura de pantalla. La pestaña de variables muestra los valores de las variables en el contexto actual. Puede agregar observadores para variables específicas y escuchar los cambios de valores usando la ventana de relojes.
Step IntoEl icono de flecha (F7) en el menú de depuración ayuda a Ejecutar el código una declaración a la vez. Si los métodos principales llaman a una subrutina, esto también se incluirá en el código de la subrutina.
Step over (F8): Es similar a Step Into. La diferencia de uso se produce cuando la declaración actual contiene una llamada a una subrutina. Si el método principal llama a una subrutina, el paso a paso no profundizará en la subrutina. saltará la subrutina.
Step Out(Shift + F8): Ejecuta las líneas restantes de una función en la que se encuentra el punto de ejecución actual. La siguiente declaración que se muestra es la declaración que sigue a la llamada de subrutina.
Después de ejecutarse en modo de depuración, el programa proporciona lo siguiente output -
10 + 20 = 30
10 % 20 = 10
10 * 20 = 200
10 / 20 = 0.5
125
UN typedef, o un alias de tipo de función, ayuda a definir punteros al código ejecutable dentro de la memoria. En pocas palabras, untypedef se puede utilizar como puntero que hace referencia a una función.
A continuación se muestran los pasos para implementar typedefs en un programa de Dart.
Step 1: Defining a typedef
UN typedefse puede usar para especificar una firma de función con la que queremos que coincidan funciones específicas. La firma de una función se define mediante los parámetros de una función (incluidos sus tipos). El tipo de retorno no es parte de la firma de la función. Su sintaxis es la siguiente.
typedef function_name(parameters)
Step 2: Assigning a Function to a typedef Variable
Una variable de typedef puede apuntar a cualquier función que tenga la misma firma que typedef. Puede utilizar la siguiente firma para asignar una función a untypedef variable.
type_def var_name = function_name
Step 3: Invoking a Function
los typedefLa variable se puede utilizar para invocar funciones. Así es como puede invocar una función:
var_name(parameters)
Ejemplo
Tomemos ahora un ejemplo para entender más sobre typedef en Dart.
Primero, definamos un typedef. Aquí estamos definiendo una firma de función. La función tomará dos parámetros de entrada del tipointeger. El tipo de retorno no es parte de la firma de la función.
typedef ManyOperation(int firstNo , int secondNo); //function signature
A continuación, definamos las funciones. Defina algunas funciones con la misma firma de función que la delManyOperation typedef.
Add(int firstNo,int second){
print("Add result is ${firstNo+second}");
}
Subtract(int firstNo,int second){
print("Subtract result is ${firstNo-second}"); } Divide(int firstNo,int second){ print("Add result is ${firstNo/second}");
}
Finalmente, invocaremos la función a través de typedef. Declare una variable del tipo ManyOperations. Asigne el nombre de la función a la variable declarada.
ManyOperation oper ;
//can point to any method of same signature
oper = Add;
oper(10,20);
oper = Subtract;
oper(30,20);
oper = Divide;
oper(50,5);
los operLa variable puede apuntar a cualquier método que tome dos parámetros enteros. losAddLa referencia de la función se asigna a la variable. Typedefs puede cambiar las referencias de función en tiempo de ejecución
Ahora juntemos todas las partes y veamos el programa completo.
typedef ManyOperation(int firstNo , int secondNo);
//function signature
Add(int firstNo,int second){
print("Add result is ${firstNo+second}"); } Subtract(int firstNo,int second){ print("Subtract result is ${firstNo-second}");
}
Divide(int firstNo,int second){
print("Divide result is ${firstNo/second}");
}
Calculator(int a, int b, ManyOperation oper){
print("Inside calculator");
oper(a,b);
}
void main(){
ManyOperation oper = Add;
oper(10,20);
oper = Subtract;
oper(30,20);
oper = Divide;
oper(50,5);
}
El programa debe producir lo siguiente output -
Add result is 30
Subtract result is 10
Divide result is 10.0
Note - El código anterior resultará en un error si el typedef variable intenta apuntar a una función con una firma de función diferente.
Ejemplo
Typedefstambién se puede pasar como parámetro a una función. Considere el siguiente ejemplo:
typedef ManyOperation(int firstNo , int secondNo); //function signature
Add(int firstNo,int second){
print("Add result is ${firstNo+second}");
}
Subtract(int firstNo,int second){
print("Subtract result is ${firstNo-second}"); } Divide(int firstNo,int second){ print("Divide result is ${firstNo/second}");
}
Calculator(int a,int b ,ManyOperation oper){
print("Inside calculator");
oper(a,b);
}
main(){
Calculator(5,5,Add);
Calculator(5,5,Subtract);
Calculator(5,5,Divide);
}
Producirá lo siguiente output -
Inside calculator
Add result is 10
Inside calculator
Subtract result is 0
Inside calculator
Divide result is 1.0
Una biblioteca en un lenguaje de programación representa una colección de rutinas (conjunto de instrucciones de programación). Dart tiene un conjunto de bibliotecas integradas que son útiles para almacenar rutinas que se utilizan con frecuencia. Una biblioteca de Dart se compone de un conjunto de clases, constantes, funciones, typedefs, propiedades y excepciones.
Importando una biblioteca
La importación hace que los componentes de una biblioteca estén disponibles para el código de la persona que llama. La palabra clave de importación se utiliza para lograr lo mismo. Un archivo de dardos puede tener varias declaraciones de importación.
Los URI de la biblioteca de Dart incorporados utilizan el esquema dart: para hacer referencia a una biblioteca. Otras bibliotecas pueden usar una ruta del sistema de archivos o el paquete: esquema para especificar su URI. Bibliotecas proporcionadas por un gestor de paquetes, tales como la herramienta de pub utiliza el paquete: esquema .
La sintaxis para importar una biblioteca en Dart se proporciona a continuación:
import 'URI'
Considere el siguiente fragmento de código:
import 'dart:io'
import 'package:lib1/libfile.dart'
Si desea utilizar solo una parte de una biblioteca, puede importarla de forma selectiva. La sintaxis para el mismo se da a continuación:
import 'package: lib1/lib1.dart' show foo, bar;
// Import only foo and bar.
import 'package: mylib/mylib.dart' hide foo;
// Import all names except foo
Algunas bibliotecas de uso común se dan a continuación:
No Señor | Biblioteca y descripción |
---|---|
1 | dart:io Soporte de archivos, sockets, HTTP y otras E / S para aplicaciones de servidor. Esta biblioteca no funciona en aplicaciones basadas en navegador. Esta biblioteca se importa de forma predeterminada. |
2 | dart:core Tipos integrados, colecciones y otras funciones básicas para cada programa de Dart. Esta biblioteca se importa automáticamente. |
3 | dart: math Constantes y funciones matemáticas, más un generador de números aleatorios. |
4 | dart: convert Codificadores y decodificadores para convertir entre diferentes representaciones de datos, incluidos JSON y UTF-8. |
5 | dart: typed_data Listas que manejan de manera eficiente datos de tamaño fijo (por ejemplo, enteros de 8 bytes sin signo). |
Ejemplo: importar y usar una biblioteca
El siguiente ejemplo importa la biblioteca incorporada dart: math. El fragmento llama alsqrt() función de la mathbiblioteca. Esta función devuelve la raíz cuadrada de un número que se le pasa.
import 'dart:math';
void main() {
print("Square root of 36 is: ${sqrt(36)}");
}
Output
Square root of 36 is: 6.0
Encapsulación en bibliotecas
Los scripts de Dart pueden anteponer identificadores con un guión bajo (_) para marcar sus componentes como privados. En pocas palabras, las bibliotecas de Dart pueden restringir el acceso a su contenido mediante scripts externos. Esto se denomina comoencapsulation. La sintaxis para el mismo se da a continuación:
Sintaxis
_identifier
Ejemplo
Primero, defina una biblioteca con una función privada.
library loggerlib;
void _log(msg) {
print("Log method called in loggerlib msg:$msg");
}
A continuación, importe la biblioteca
import 'test.dart' as web;
void main() {
web._log("hello from webloggerlib");
}
El código anterior resultará en un error.
Unhandled exception:
No top-level method 'web._log' declared.
NoSuchMethodError: method not found: 'web._log'
Receiver: top-level
Arguments: [...]
#0 NoSuchMethodError._throwNew (dart:core-patch/errors_patch.dart:184)
#1 main (file:///C:/Users/Administrator/WebstormProjects/untitled/Assertion.dart:6:3)
#2 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:261)
#3 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148)
Creación de bibliotecas personalizadas
Dart también le permite usar su propio código como biblioteca. La creación de una biblioteca personalizada implica los siguientes pasos:
Step 1: Declaring a Library
Para declarar explícitamente una biblioteca, use el library statement. La sintaxis para declarar una biblioteca es la siguiente:
library library_name
// library contents go here
Step 2: Associating a Library
Puede asociar una biblioteca de dos formas:
- Dentro del mismo directorio
import 'library_name'
- De un directorio diferente
import 'dir/library_name'
Ejemplo: biblioteca personalizada
Primero, definamos una biblioteca personalizada, calculator.dart.
library calculator_lib;
import 'dart:math';
//import statement after the libaray statement
int add(int firstNumber,int secondNumber){
print("inside add method of Calculator Library ") ;
return firstNumber+secondNumber;
}
int modulus(int firstNumber,int secondNumber){
print("inside modulus method of Calculator Library ") ;
return firstNumber%secondNumber;
}
int random(int no){
return new Random().nextInt(no);
}
A continuación, importaremos la biblioteca -
import 'calculator.dart';
void main() {
var num1 = 10;
var num2 = 20;
var sum = add(num1,num2);
var mod = modulus(num1,num2);
var r = random(10);
print("$num1 + $num2 = $sum"); print("$num1 % $num2= $mod");
print("random no $r");
}
El programa debe producir lo siguiente output -
inside add method of Calculator Library
inside modulus method of Calculator Library
10 + 20 = 30
10 % 20= 10
random no 0
Prefijo de biblioteca
Si importa dos bibliotecas con identificadores en conflicto, puede especificar un prefijo para una o ambas bibliotecas. Utilizar el'as'palabra clave para especificar el prefijo. La sintaxis para el mismo se da a continuación:
Sintaxis
import 'library_uri' as prefix
Ejemplo
Primero, definamos una biblioteca: loggerlib.dart.
library loggerlib;
void log(msg){
print("Log method called in loggerlib msg:$msg");
}
A continuación, definiremos otra biblioteca: webloggerlib.dart.
library webloggerlib;
void log(msg){
print("Log method called in webloggerlib msg:$msg");
}
Finalmente, importaremos la biblioteca con un prefijo.
import 'loggerlib.dart';
import 'webloggerlib.dart' as web;
// prefix avoids function name clashes
void main(){
log("hello from loggerlib");
web.log("hello from webloggerlib");
}
Producirá lo siguiente output -
Log method called in loggerlib msg:hello from loggerlib
Log method called in webloggerlib msg:hello from webloggerlib
Un asynchronous operation se ejecuta en un hilo, separado del mainhilo de aplicación. Cuando una aplicación llama a un método para realizar una operación de forma asincrónica, la aplicación puede continuar ejecutándose mientras el método asincrónico realiza su tarea.
Ejemplo
Tomemos un ejemplo para entender este concepto. Aquí, el programa acepta la entrada del usuario utilizando elIO library.
import 'dart:io';
void main() {
print("Enter your name :");
// prompt for user input
String name = stdin.readLineSync();
// this is a synchronous method that reads user input
print("Hello Mr. ${name}");
print("End of main");
}
los readLineSync()es un método sincrónico. Esto significa que la ejecución de todas las instrucciones que siguen alreadLineSync() la llamada a la función se bloqueará hasta que readLineSync() el método termina la ejecución.
los stdin.readLineSyncespera entrada. Se detiene en seco y no se ejecuta más hasta que recibe la entrada del usuario.
El ejemplo anterior dará como resultado lo siguiente output -
Enter your name :
Tom
// reads user input
Hello Mr. Tom
End of main
En informática, decimos que algo es synchronouscuando espera que suceda un evento antes de continuar. Una desventaja de este enfoque es que si una parte del código tarda demasiado en ejecutarse, los bloques subsiguientes, aunque no estén relacionados, no podrán ejecutarse. Considere un servidor web que debe responder a múltiples solicitudes de un recurso.
Un modelo de ejecución sincrónica bloqueará la solicitud de todos los demás usuarios hasta que termine de procesar la solicitud actual. En tal caso, como el de un servidor web, cada solicitud debe ser independiente de las demás. Esto significa que el servidor web no debe esperar a que la solicitud actual termine de ejecutarse antes de responder a la solicitud de otros usuarios.
En pocas palabras, debería aceptar solicitudes de nuevos usuarios antes de completar necesariamente las solicitudes de usuarios anteriores. Esto se denomina asincrónico. La programación asincrónica básicamente significa que no hay modelos de programación en espera o sin bloqueo. losdart:async El paquete facilita la implementación de bloques de programación asincrónicos en un script de Dart.
Ejemplo
El siguiente ejemplo ilustra mejor el funcionamiento de un bloque asincrónico.
Step 1 - Crea un contact.txt archivo como se indica a continuación and guárdelo en la carpeta de datos del proyecto actual.
1, Tom
2, John
3, Tim
4, Jane
Step 2 - Escriba un programa que lea el archivo sin bloquear otras partes de la aplicación.
import "dart:async";
import "dart:io";
void main(){
File file = new File( Directory.current.path+"\\data\\contact.txt");
Future<String> f = file.readAsString();
// returns a futrue, this is Async method
f.then((data)=>print(data));
// once file is read , call back method is invoked
print("End of main");
// this get printed first, showing fileReading is non blocking or async
}
los output de este programa será el siguiente -
End of main
1, Tom
2, John
3, Tim
4, Jan
El "final de main" se ejecuta primero mientras el script continúa leyendo el archivo. losFuture clase, parte de dart:async, se utiliza para obtener el resultado de un cálculo después de que se haya completado una tarea asincrónica. EstaFuture El valor se usa para hacer algo después de que finaliza el cálculo.
Una vez que se completa la operación de lectura, el control de ejecución se transfiere dentro "then()". Esto se debe a que la operación de lectura puede llevar más tiempo y, por lo tanto, no quiere bloquear otra parte del programa.
Dardo futuro
La comunidad de Dart define un Futurecomo "un medio para obtener un valor en el futuro". Simplemente pon,Future objectsson un mecanismo para representar valores devueltos por una expresión cuya ejecución se completará en un momento posterior. Varias de las clases integradas de Dart devuelven unFuture cuando se llama a un método asincrónico.
Dart es un lenguaje de programación de un solo subproceso. Si algún código bloquea el subproceso de ejecución (por ejemplo, al esperar una operación que requiere mucho tiempo o al bloquear la E / S), el programa se congela efectivamente.
Las operaciones asincrónicas permiten que su programa se ejecute sin bloquearse. Usos de dardosFuture objects para representar operaciones asincrónicas.
Concurrencyes la ejecución de varias secuencias de instrucciones al mismo tiempo. Implica realizar más de una tarea simultáneamente.
Usos de dardos Isolatescomo herramienta para realizar trabajos en paralelo. losdart:isolate package es la solución de Dart para tomar código Dart de un solo subproceso y permitir que la aplicación haga un mayor uso del hardware disponible.
Isolates, como sugiere el nombre, son unidades aisladas de código en ejecución. La única forma de enviar datos entre ellos es pasando mensajes, como la forma en que pasa mensajes entre el cliente y el servidor. Unisolate ayuda al programa a aprovechar los microprocesadores multinúcleo listos para usar.
Ejemplo
Tomemos un ejemplo para comprender mejor este concepto.
import 'dart:isolate';
void foo(var message){
print('execution from foo ... the message is :${message}');
}
void main(){
Isolate.spawn(foo,'Hello!!');
Isolate.spawn(foo,'Greetings!!');
Isolate.spawn(foo,'Welcome!!');
print('execution from main1');
print('execution from main2');
print('execution from main3');
}
Aquí el spawn método del Isolate la clase facilita la ejecución de una función, foo, en paralelo con el resto de nuestro código. losspawn la función toma dos parámetros -
- la función que se generará, y
- un objeto que se pasará a la función generada.
En caso de que no haya ningún objeto para pasar a la función generada, se le puede pasar un valor NULL.
Las dos funciones (foo and main)puede que no se ejecuten necesariamente en el mismo orden cada vez. No hay garantía de cuándofoo se ejecutará y cuando main()estará ejecutando. La salida será diferente cada vez que ejecute.
Salida 1
execution from main1
execution from main2
execution from main3
execution from foo ... the message is :Hello!!
Salida 2
execution from main1
execution from main2
execution from main3
execution from foo ... the message is :Welcome!!
execution from foo ... the message is :Hello!!
execution from foo ... the message is :Greetings!!
De los resultados, podemos concluir que el código de Dart puede generar un nuevo isolate de ejecutar código como la forma en que el código Java o C # puede iniciar un nuevo hilo.
Isolates difieren de los hilos en que un isolatetiene su propia memoria. No hay forma de compartir una variable entreisolates—La única forma de comunicarse entre isolates es mediante el paso de mensajes.
Note - La salida anterior será diferente para diferentes configuraciones de hardware y sistema operativo.
Aislar v / s futuro
Es importante realizar un trabajo computacional complejo de forma asincrónica para garantizar la capacidad de respuesta de las aplicaciones. Dart Future es un mecanismo para recuperar el valor de una tarea asincrónica después de que se ha completado, mientras Dart Isolates son una herramienta para abstraer el paralelismo e implementarlo de una manera práctica de alto nivel.
La prueba unitaria implica probar cada unidad individual de una aplicación. Ayuda al desarrollador a probar pequeñas funcionalidades sin ejecutar toda la compleja aplicación.
El dardo external library denominado "prueba" proporciona una forma estándar de escribir y ejecutar pruebas unitarias.
La prueba de la unidad de dardos implica los siguientes pasos:
Step 1: Installing the "test" package
Para instalar paquetes de terceros en el proyecto actual, necesitará el pubspec.yamlarchivo. Instalartest packages, primero haga la siguiente entrada en el pubspec.yaml archivo -
dependencies:
test:
Después de realizar la entrada, haga clic derecho en el pubspec.yamlfile y obtenga dependencias. Instalará el"test"paquete. A continuación se muestra una captura de pantalla para el mismo en elWebStorm Editor.
Los paquetes se pueden instalar desde el command linetambién. Escriba lo siguiente en la terminal:
pub get
Step 2: Importing the "test" package
import "package:test/test.dart";
Step 3 Writing Tests
Las pruebas se especifican mediante la función de nivel superior test(), mientras test assertions están hechos usando el expect()función. Para utilizar estos métodos, deben instalarse comopub dependencia.
Sintaxis
test("Description of the test ", () {
expect(actualValue , matchingValue)
});
los group()La función se puede utilizar para agrupar pruebas. La descripción de cada grupo se agrega al comienzo de las descripciones de su prueba.
Sintaxis
group("some_Group_Name", () {
test("test_name_1", () {
expect(actual, equals(exptected));
});
test("test_name_2", () {
expect(actual, equals(expected));
});
})
Ejemplo 1: una prueba aprobada
El siguiente ejemplo define un método Add(). Este método toma dos valores enteros y devuelve un entero que representa elsum. Para probar estoadd() método -
Step 1 - Importar el test paquete como se indica a continuación.
Step 2 - Defina la prueba usando el test()función. Aquí eltest() la función usa el expect() función para hacer cumplir una afirmación.
import 'package:test/test.dart';
// Import the test package
int Add(int x,int y)
// Function to be tested {
return x+y;
}
void main() {
// Define the test
test("test to check add method",(){
// Arrange
var expected = 30;
// Act
var actual = Add(10,20);
// Asset
expect(actual,expected);
});
}
Debería producir lo siguiente output -
00:00 +0: test to check add method
00:00 +1: All tests passed!
Ejemplo 2: una prueba fallida
los subtract()El método definido a continuación tiene un error lógico. El seguimientotest verifica lo mismo.
import 'package:test/test.dart';
int Add(int x,int y){
return x+y;
}
int Sub(int x,int y){
return x-y-1;
}
void main(){
test('test to check sub',(){
var expected = 10;
// Arrange
var actual = Sub(30,20);
// Act
expect(actual,expected);
// Assert
});
test("test to check add method",(){
var expected = 30;
// Arrange
var actual = Add(10,20);
// Act
expect(actual,expected);
// Asset
});
}
Output - El caso de prueba para la función add() pasa pero la prueba para subtract() falla como se muestra a continuación.
00:00 +0: test to check sub
00:00 +0 -1: test to check sub
Expected: <10>
Actual: <9>
package:test expect
bin\Test123.dart 18:5 main.<fn>
00:00 +0 -1: test to check add method
00:00 +1 -1: Some tests failed.
Unhandled exception:
Dummy exception to set exit code.
#0 _rootHandleUncaughtError.<anonymous closure> (dart:async/zone.dart:938)
#1 _microtaskLoop (dart:async/schedule_microtask.dart:41)
#2 _startMicrotaskLoop (dart:async/schedule_microtask.dart:50)
#3 _Timer._runTimers (dart:isolate-patch/timer_impl.dart:394)
#4 _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:414)
#5 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148)
Agrupación de casos de prueba
Puede agrupar el test casespara que le agregue más significado al código de prueba. Si tienes muchostest cases esto ayuda a escribir un código mucho más limpio.
En el código dado, estamos escribiendo un caso de prueba para el split() función y la trimfunción. Por lo tanto, agrupamos lógicamente estos casos de prueba y los llamamosString.
Ejemplo
import "package:test/test.dart";
void main() {
group("String", () {
test("test on split() method of string class", () {
var string = "foo,bar,baz";
expect(string.split(","), equals(["foo", "bar", "baz"]));
});
test("test on trim() method of string class", () {
var string = " foo ";
expect(string.trim(), equals("foo"));
});
});
}
Output - La salida agregará el nombre del grupo para cada caso de prueba como se indica a continuación -
00:00 +0: String test on split() method of string class
00:00 +1: String test on trim() method of string class
00:00 +2: All tests passed
Cada página web reside dentro de una ventana del navegador que puede considerarse un objeto.
UN Document objectrepresenta el documento HTML que se muestra en esa ventana. El objeto Documento tiene varias propiedades que hacen referencia a otros objetos que permiten el acceso y la modificación del contenido del documento.
La forma en que se accede al contenido de un documento y se modifica se denomina Document Object Modelo DOM. Los objetos están organizados en una jerarquía. Esta estructura jerárquica se aplica a la organización de objetos en un documento web.
Window- Top de la jerarquía. Es el elemento más externo de la jerarquía de objetos.
Document- Cada documento HTML que se carga en una ventana se convierte en un objeto de documento. El documento contiene el contenido de la página.
Elements- representar el contenido de una página web. Los ejemplos incluyen los cuadros de texto, el título de la página, etc.
Nodes - a menudo son elementos, pero también pueden ser atributos, texto, comentarios y otros tipos de DOM.
Aquí hay una jerarquía simple de algunos objetos DOM importantes:
Dart proporciona el dart:htmlbiblioteca para manipular objetos y elementos en el DOM. Las aplicaciones basadas en consola no pueden utilizardart:htmlbiblioteca. Para utilizar la biblioteca HTML en las aplicaciones web, importedart:html -
import 'dart:html';
Continuando, discutiremos algunos DOM Operations en la siguiente sección.
Encontrar elementos DOM
los dart:html biblioteca proporciona el querySelector función para buscar elementos en el DOM.
Element querySelector(String selectors);
los querySelector() La función devuelve el primer elemento que coincide con el grupo de selectores especificado. "selectors debe ser una cadena usando la sintaxis del selector CSS como se indica a continuación
var element1 = document.querySelector('.className');
var element2 = document.querySelector('#id');
Ejemplo: manipular DOM
Siga los pasos que se indican a continuación, en el IDE de Webstorm:
Step 1 - Archivo NewProject → En la ubicación, proporcione el nombre del proyecto como DemoWebApp.
Step 1 - En la sección "Generar contenido de muestra", seleccione SimpleWebApplication.
Creará un proyecto de muestra, DemoWebApp. Hay unpubspec.yaml archivo que contiene las dependencias que deben descargarse.
name: 'DemoWebApp'
version: 0.0.1
description: An absolute bare-bones web app.
#author: Your Name <[email protected]>
#homepage: https://www.example.com
environment:
sdk: '>=1.0.0 <2.0.0'
dependencies:
browser: '>=0.10.0 <0.11.0' dart_to_js_script_rewriter: '^1.0.1'
transformers:
- dart_to_js_script_rewriter
Si está conectado a la Web, estos se descargarán automáticamente; de lo contrario, puede hacer clic con el botón derecho en el pubspec.yaml y obtener dependencias.
En la carpeta web, encontrará tres archivos: Index.html, main.darty style.css
Index.html
<!DOCTYPE html>
<html>
<head>
<meta charset = "utf-8">
<meta http-equiv = "X-UA-Compatible" content = "IE = edge">
<meta name = "viewport" content = "width = device-width, initial-scale = 1.0">
<meta name = "scaffolded-by" content = "https://github.com/google/stagehand">
<title>DemoWebApp</title>
<link rel = "stylesheet" href = "styles.css">
<script defer src = "main.dart" type = "application/dart"></script>
<script defer src = "packages/browser/dart.js"></script>
</head>
<body>
<h1>
<div id = "output"></div>
</h1>
</body>
</html>
Main.dart
import 'dart:html';
void main() {
querySelector('#output').text = 'Your Dart web dom app is running!!!.';
}
Ejecutar el index.htmlarchivo; verá el siguiente resultado en su pantalla.
Manejo de eventos
los dart:html biblioteca proporciona el onClickevento para elementos DOM. La sintaxis muestra cómo un elemento podría manejar una secuencia de eventos de clic.
querySelector('#Id').onClick.listen(eventHanlderFunction);
los querySelector() La función devuelve el elemento del DOM dado y onClick.listen() tomará un eventHandlermétodo que se invocará cuando se genere un evento de clic. La sintaxis deeventHandler se da a continuación -
void eventHanlderFunction (MouseEvent event){ }
Tomemos ahora un ejemplo para comprender el concepto de Manejo de eventos en Dart.
TestEvent.html
<!DOCTYPE html>
<html>
<head>
<meta charset = "utf-8">
<meta http-equiv = "X-UA-Compatible" content = "IE = edge">
<meta name = "viewport" content = "width = device-width, initial-scale = 1.0">
<meta name = "scaffolded-by" content ="https://github.com/google/stagehand">
<title>DemoWebApp</title>
<link rel = "stylesheet" href = "styles.css">
<script defer src = "TestEvent.dart" type="application/dart"></script>
<script defer src = "packages/browser/dart.js"></script>
</head>
<body>
<div id = "output"></div>
<h1>
<div>
Enter you name : <input type = "text" id = "txtName">
<input type = "button" id = "btnWish" value="Wish">
</div>
</h1>
<h2 id = "display"></h2>
</body>
</html>
TestEvent.dart
import 'dart:html';
void main() {
querySelector('#btnWish').onClick.listen(wishHandler);
}
void wishHandler(MouseEvent event){
String name = (querySelector('#txtName') as InputElement).value;
querySelector('#display').text = 'Hello Mr.'+ name;
}