Agrega interactividad a tu aplicación
Agrega comandos simples a tu aplicación cli. Aprende los fundamentos de la sintaxis de Dart incluyendo flujo de control, colecciones, variables, funciones y más.
En este capítulo, obtendrás práctica directa con la sintaxis de Dart. Aprenderás a leer la entrada del usuario, imprimir información de uso y crear una interacción básica de línea de comandos.
Qué lograrás
Prerrequisitos
#Antes de comenzar este capítulo, asegúrate de tener:
- Completado el Capítulo 1 y tener un entorno de desarrollo de Dart en funcionamiento.
- Familiaridad con conceptos básicos de programación (variables, tipos de datos, flujo de control).
Tareas
#Agrega alguna funcionalidad básica a tu aplicación de línea de comandos Dartpedia y luego explora la sintaxis de Dart para ella.
Tarea 1: Implementar los comandos version y help
#-
Implementa el comando
versionencli/bin/cli.dart: Agrega lógica para manejar un comandoversion, el cual imprime la versión actual de la CLI. Usa una sentenciaifpara verificar si el primer argumento proporcionado esversion. También necesitarás una constanteversion.Primero, por encima de tu función
main, declara una variableconstpara la versión. El valor de una variableconstnunca se puede cambiar después de haber sido establecido:dartconst version = '0.0.1'; // Add this lineA continuación, modifica tu función
mainpara verificar el argumentoversion:dartvoid main(List<String> arguments) { if (arguments.isEmpty) { print('Hello, Dart!'); } else if (arguments.first == 'version') { print('Dartpedia CLI version $version'); } }La sintaxis
$versionse llama interpolación de cadenas. Te permite incrustar el valor de la variable directamente en una cadena prefijando el nombre de la variable con un signo$. -
Prueba el comando
version: Ejecuta tu aplicación con el argumento version:bashdart bin/cli.dart versionAhora deberías ver:
bashDartpedia CLI version 0.0.1Si ejecutas tu aplicación sin argumentos, aún verás "Hello, Dart!".
-
Agrega una función
printUsage: Para hacer la salida más amigable para el usuario, crea una función separada para mostrar la información de uso. Coloca esta función fuera y debajo de tu funciónmain.dartvoid printUsage() { // Add this new function print( "The following commands are valid: 'help', 'version', 'search <ARTICLE-TITLE>'" ); }searches el comando que eventualmente buscará en Wikipedia. -
Implementa el comando
helpy refinamain: Ahora, integra el comandohelpusando una sentenciaelse if, y limpia el comportamiento predeterminado para llamar a la funciónprintUsage.Modifica tu función
mainpara que se vea así:dartvoid main(List<String> arguments) { if (arguments.isEmpty || arguments.first == 'help') { printUsage(); // Change this from 'Hello, Dart!' } else if (arguments.first == 'version') { print('Dartpedia CLI version $version'); } else { printUsage(); // Catch-all for any unrecognized command. } } -
Comprende la estructura
if/elsey las variables: Ahora que has implementado el flujo de control en la funciónmain, revisa el código que se agregó para ello.arguments.isEmptycomprueba si no se proporcionaron argumentos de línea de comandos.arguments.firstaccede al primerísimo argumento, que estás usando como nuestro comando.versionse declara como unaconst. Esto significa que su valor se conoce en tiempo de compilación y no puedes cambiarlo durante el tiempo de ejecución.argumentses una variable normal (no constante) porque su contenido puede cambiar durante el tiempo de ejecución en función de la entrada del usuario.
Ejecuta tu aplicación con el argumento help. Deberías ver impresa la información de uso:
bashdart bin/cli.dart helpAdemás, intenta ejecutarlo sin ningún argumento:
bashdart bin/cli.dartTen en cuenta que continúa mostrando la información de uso. En este punto, cualquier comando que no hayas definido también imprimirá la información de uso. Este es el comportamiento esperado por ahora.
Tarea 2: Implementar el comando search
#Next, implementa un comando search básico que tome como entrada el título de un artículo.
A medida que construyes esta funcionalidad, trabajarás con
manipulación de List, comprobaciones de nulos e interpolación de cadenas.
-
Integra el comando
searchenmain: Primero, modifica la funciónmainencli/bin/cli.dartpara incluir una ramaelse ifque maneje el comandosearch. Por ahora, solo imprime un mensaje de marcador de posición.dartvoid main(List<String> arguments) { if (arguments.isEmpty || arguments.first == 'help') { printUsage(); } else if (arguments.first == 'version') { print('Dartpedia CLI version $version'); } else if (arguments.first == 'search') { // Add this new block: print('Search command recognized!'); } else { printUsage(); } } -
Prueba el nuevo comando: Ejecuta tu aplicación con el comando
search:bashdart bin/cli.dart searchDeberías ver:
bashSearch command recognized! -
Define la función
searchWikipedia: El comandosearcheventualmente ejecutará la lógica central de tu aplicación llamando a una función llamadasearchWikipedia. Por ahora, haz quesearchWikipediaimprima los argumentos que se le pasan con el comandosearch. Coloca esta nueva función debajo demain.dart// ... (your existing main function) void searchWikipedia(List<String>? arguments) { // Add this new function and add ? to arguments type print('searchWikipedia received arguments: $arguments'); } // ... (your existing printUsage() function)Aspectos destacados del código anterior:
List<String>? argumentssignifica que la propia listaargumentspuede sernull.
-
Llama a la función
searchWikipediadesde la funciónmain: Ahora, modifica el bloque del comandosearchenmainpara llamar asearchWikipediay pasarle cualquier argumento que venga después del propio comandosearch. Usaarguments.sublist(1)para obtener todos los argumentos a partir del segundo. Si no se proporcionan argumentos después desearch, pasanullasearchWikipedia.dartvoid main(List<String> arguments) { if (arguments.isEmpty || arguments.first == 'help') { printUsage(); } else if (arguments.first == 'version') { print('Dartpedia CLI version $version'); } else if (arguments.first == 'search') { // Add this new block: final inputArgs = arguments.length > 1 ? arguments.sublist(1) : null; searchWikipedia(inputArgs); } else { printUsage(); } }Aspectos destacados del código anterior:
- Las variables
finalsolo se pueden establecer una vez y se usan cuando nunca se tiene la intención de volver a cambiar la variable en el código. arguments.sublist(1)crea una nueva lista que contiene todos los elementos de la listaargumentsdespués del primer elemento (que erasearch).arguments.length > 1 ? ... : null;es un operador condicional (ternario). Asegura que si no se proporcionan argumentos después del comandosearch,inputArgsse convierte ennull, coincidiendo con el comportamiento del código de ejemplo para el parámetroargumentsdesearchWikipediaque es de tipoList<String>?.
- Las variables
-
Prueba
searchWikipediacon argumentos: Usando la línea de comandos, ejecuta la aplicación con el título de un artículo de prueba:bashdart bin/cli.dart search Dart ProgrammingDeberías ver:
bashsearchWikipedia received arguments: [Dart, Programming]A continuación, ejecuta el mismo comando sin los argumentos adicionales:
bashdart bin/cli.dart searchDeberías ver:
bashsearchWikipedia received arguments: null -
Maneja el título del artículo faltante y la entrada del usuario con el comando
stdin: Es más amigable para el usuario solicitarle información si no proporciona el título de un artículo en la línea de comandos. Usastdin.readLineSync()para esto.Primero, añade la importación necesaria en la parte superior de tu archivo
cli/bin/cli.dart:dartimport 'dart:io'; // Add this line at the topdart:ioes una librería principal del SDK de Dart y proporciona APIs para trabajar con archivos, directorios, sockets, clientes y servidores HTTP, y más.Ahora, actualiza tu función
searchWikipedia.dartvoid searchWikipedia(List<String>? arguments) { final String articleTitle; // If the user didn't pass in arguments, request an article title. if (arguments == null || arguments.isEmpty) { print('Please provide an article title.'); // Await input and provide a default empty string if the input is null. articleTitle = stdin.readLineSync() ?? ''; } else { // Otherwise, join the arguments into a single string. articleTitle = arguments.join(' '); } print('Current article title: $articleTitle'); }Este bloque de código anterior introduce algunos conceptos clave:
- Declara una variable
final String articleTitle. Esto permite que el análisis estático detecte quearticleTitleserá unStringy no será nulo. - Luego, una sentencia
if/elsecomprueba si se proporcionaron argumentos de línea de comandos para la búsqueda. - Si faltan argumentos, solicita información al usuario,
lee la entrada usando
stdin.readLineSync()y maneja de forma segura los casos en los que no se proporciona ninguna entrada. - Si los argumentos están presentes, usa
arguments.join(' ')para combinarlos en una sola cadena de búsqueda.
Aspectos destacados del código anterior:
stdin.readLineSync() ?? ''lee la entrada del usuario. Aunquestdin.readLineSync()puede devolver nulo, el operador de coalescencia nula (??) se usa para proporcionar una cadena vacía ('') como alternativa si la entrada es nula. Esta es una forma concisa de asegurar que la variable sea una cadena no nula.arguments.join(' ')concatena todos los elementos de la listaargumentsen una sola cadena, usando un espacio como separador. Por ejemplo,['Dart', 'Programming']se convierte en"Dart Programming". Esto es crucial para tratar las entradas de línea de comandos de varias palabras como una única frase de búsqueda.- El análisis estático de Dart puede detectar que
articleTitlese garantiza que se inicializará cuando se ejecute la sentencia print. Sin importar qué camino se tome a través del cuerpo de esta función, la variable no acepta nulos (non-nullable).
- Declara una variable
-
Termina
searchWikipediapara imprimir resultados de búsqueda simulados: ActualizasearchWikipediapara mostrar mensajes que parezcan que nuestro programa encontró algo. Esto nos ayuda a ver lo que hará nuestro programa terminado sin construir todo realmente en este momento. Solo verás estos mensajes si incluyes una consulta de búsqueda al ejecutar el programa.Por ejemplo:
dart bin/cli.dart search Dart Programming.dartvoid searchWikipedia(List<String>? arguments) { final String articleTitle; // If the user didn't pass in arguments, request an article title. if (arguments == null || arguments.isEmpty) { print('Please provide an article title.'); // Await input and provide a default empty string if the input is null. articleTitle = stdin.readLineSync() ?? ''; } else { // Otherwise, join the arguments into a single string. articleTitle = arguments.join(' '); } print('Looking up articles about "$articleTitle". Please wait.'); print('Here ya go!'); print('(Pretend this is an article about "$articleTitle")'); } -
Final Test Run with both scenarios:
Ahora que la simulación del artículo está configurada, prueba la función
searchWikipediade diferentes maneras:bashdart bin/cli.dart search Dart ProgrammingDeberías ver:
bashLooking up articles about "Dart Programming". Please wait. Here ya go! (Pretend this is an article about "Dart Programming")Ejecutar sin argumentos (escribe "Flutter Framework" cuando se te solicite):
bashdart bin/cli.dart searchbashPlease provide an article title. Flutter FrameworkAhora has construido con éxito el comando
searchbásico con el manejo de la entrada del usuario, tratando correctamente las entradas de la línea de comandos de varias palabras como una sola frase de búsqueda en la salida.
Revisión
#Qué lograste
Aquí tienes un resumen de lo que construiste y aprendiste en esta lección.Construiste manejadores de comandos con sentencias if y else
Usaste sentencias if y else para enrutar diferentes comandos como help,
version y search. Este patrón de flujo de control es fundamental para construir aplicaciones de CLI interactivas que respondan a la entrada del usuario.
Trabajaste con listas y variables
Aprendiste a declarar variables con var, final y const, y trabajaste con listas usando
.isEmpty, .first, .sublist() y .join(). También usaste la interpolación de cadenas ($variable) para incrustar valores en literales de cadena.
Tuviste en cuenta la nulabilidad en tu código
Adoptaste la seguridad contra nulos (sound null safety) de Dart mediante el uso de tipos que aceptan nulos (?), comprobaciones de nulos y el operador de coalescencia nula (??) para proporcionar valores predeterminados cuando las expresiones puedan ser
null.
Definiste y llamaste funciones
Creaste las funciones printUsage() y searchWikipedia() para organizar tu código en unidades reutilizables. Separar la lógica reutilizable en funciones ayuda a mantener limpia la función
main y hace que tu código sea más fácil de leer y mantener.
Leíste y manejaste la entrada del usuario
Usaste stdin.readLineSync() de dart:io para leer la entrada desde la terminal. Esto permite solicitudes interactivas como una alternativa o además de los argumentos de la línea de comandos.
Cuestionario
#Pon a prueba tu comprensión
1 / 3staticNo exactamente.
staticse usa para miembros a nivel de clase, no para declarar constantes. Sin embargo, las constantes a nivel de clase también deben serstatic.const¡Correcto!
constdeclara una constante en tiempo de compilación. El valor debe ser conocido en tiempo de compilación y nunca puede cambiar.finalNo exactamente.
finalcrea una variable que solo se puede inicializar una vez, pero su valor se determina en tiempo de ejecución, no en tiempo de compilación.varNo exactamente.
Las variables declaradas con
varse pueden reasignar y no es necesario conocerlas en tiempo de compilación.
stdin.readLineSync() in a CLI application?Para leer una sola línea de entrada de texto del usuario.
¡Correcto!
stdin.readLineSync()lee una sola línea de texto de la entrada estándar, permitiendo que tu programa reciba la entrada del usuario.Para imprimir la salida en la consola.
No exactamente.
La impresión de la salida se realiza con
print(),stdout.write()y otros métodos similares.Para verificar si un archivo existe.
No exactamente.
La existencia de archivos se comprueba usando
File.existsSync()o métodos similares.Para ejecutar un comando.
No exactamente.
La ejecución de comandos se realiza mediante
Process.run()o métodos similares.
arguments.sublist(1) return when arguments is ['search', 'Dart', 'Programming']?['Programming']No exactamente.
Este es solo el último elemento. El argumento
1especifica el índice inicial, no cuántos elementos omitir del final.['search']No exactamente.
sublist(1)devuelve elementos a partir del índice 1 (el segundo elemento), no solo el primer elemento.['search', 'Dart']No exactamente.
Esta respuesta incluye
'search', perosublist(1)comienza desde el índice 1, lo que excluye el elemento en el índice 0.['Dart', 'Programming']¡Correcto!
sublist(1)crea una nueva lista que contiene todos los elementos desde el índice 1 en adelante, omitiendo el primer elemento.
Siguiente lección
#En el próximo capítulo, te sumergirás en la
programación asíncrona y aprenderás cómo
obtener datos de la API de Wikipedia usando el paquete http.
Esto permitirá que tu aplicación
recupere datos reales y se los muestre al usuario.
A menos que se indique lo contrario, la documentación de este sitio refleja Dart 3.12.2. Página actualizada por última vez el 22-06-2026. Ver fuente oreportar un problema.