Adicione interatividade ao seu app
Adicione comandos simples à sua aplicação CLI. Aprenda os fundamentos da sintaxe do Dart, incluindo controle de fluxo, coleções, variáveis, funções e muito mais.
Neste capítulo, você vai praticar a sintaxe do Dart na prática. Você vai aprender a ler a entrada do usuário, exibir informações de uso e criar uma interação básica pela linha de comando.
O que você vai realizar
Pré-requisitos
#Antes de começar este capítulo, certifique-se de:
- Ter concluído o Capítulo 1 e ter um ambiente de desenvolvimento Dart funcionando.
- Ter familiaridade com conceitos básicos de programação (variáveis, tipos de dados, controle de fluxo).
Tarefas
#Adicione algumas funcionalidades básicas à sua aplicação de linha de comando Dartpedia e depois explore a sintaxe do Dart para isso.
Tarefa 1: Implemente os comandos version e help
#-
Implemente o comando
versionemcli/bin/cli.dart: Adicione a lógica para tratar um comandoversion, que exibe a versão atual da CLI. Use uma instruçãoifpara verificar se o primeiro argumento fornecido éversion. Você também vai precisar de uma constanteversion.Primeiro, acima da sua função
main, declare uma variávelconstpara a versão. O valor de uma variávelconstnunca pode ser alterado depois de definido:cli/bin/cli.dartdartconst version = '0.0.1'; // Add this lineEm seguida, modifique sua função
mainpara verificar o argumentoversion:cli/bin/cli.dartdartvoid main(List<String> arguments) { if (arguments.isEmpty) { print('Hello, Dart!'); } else if (arguments.first == 'version') { print('Dartpedia CLI version $version'); } }A sintaxe
$versioné chamada de interpolação de strings. Ela permite incorporar o valor da variável diretamente em uma string, prefixando o nome da variável com o sinal$. -
Teste o comando
version: Execute sua aplicação com o argumento version:bashdart bin/cli.dart versionAgora você deve ver:
bashDartpedia CLI version 0.0.1Se você executar seu app sem argumentos, ainda verá "Hello, Dart!".
-
Adicione uma função
printUsage: Para deixar a saída mais amigável, crie uma função separada para exibir as informações de uso. Coloque essa função fora e abaixo da sua funçãomain.cli/bin/cli.dartdartvoid printUsage() { // Add this new function print( "The following commands are valid: 'help', 'version', 'search <ARTICLE-TITLE>'" ); }searché o comando que, no futuro, vai pesquisar na Wikipedia. -
Implemente o comando
helpe refine omain: Agora, integre o comandohelpusando uma instruçãoelse if, e simplifique o comportamento padrão para chamar a funçãoprintUsage.Modifique sua função
mainpara que fique assim:cli/bin/cli.dartdartvoid 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. } } -
Entenda a estrutura
if/elsee as variáveis: Agora que você implementou o controle de fluxo na funçãomain, revise o código adicionado para isso.arguments.isEmptyverifica se nenhum argumento de linha de comando foi fornecido.arguments.firstacessa o primeiro argumento, que você está usando como comando.versioné declarada comoconst. Isso significa que o valor é conhecido em tempo de compilação, e você não pode alterá-lo durante a execução.argumentsé uma variável comum (não constante), porque seu conteúdo pode mudar em tempo de execução, de acordo com a entrada do usuário.
Execute sua aplicação com o argumento help. Você deve ver as informações de uso impressas:
bashdart bin/cli.dart helpTambém tente executá-la sem nenhum argumento:
bashdart bin/cli.dartRepare que ela continua exibindo as informações de uso. Por enquanto, qualquer comando que você ainda não definiu também vai imprimir as informações de uso. Esse é o comportamento esperado por enquanto.
Tarefa 2: Implemente o comando search
#
Em seguida, implemente um comando search básico que recebe o título de um artigo como entrada.
Ao construir essa funcionalidade, você vai trabalhar com
manipulação de List, verificações de nulabilidade e interpolação de strings.
-
Integre o comando
searchaomain: Primeiro, modifique a funçãomainemcli/bin/cli.dartpara incluir um ramoelse ifque trate o comandosearch. Por enquanto, apenas imprima uma mensagem provisória.cli/bin/cli.dartdartvoid 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(); } } -
Teste o novo comando: Execute sua aplicação com o comando
search:bashdart bin/cli.dart searchVocê deve ver:
bashSearch command recognized! -
Defina a função
searchWikipedia: O comandosearchvai, no futuro, executar a lógica principal da aplicação chamando uma função chamadasearchWikipedia. Por enquanto, façasearchWikipediaimprimir os argumentos recebidos com o comandosearch. Coloque essa nova função abaixo demain.cli/bin/cli.dartdart// ... (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)Destaques do código anterior:
List<String>? argumentssignifica que a própria listaargumentspode sernull.
-
Chame a função
searchWikipediaa partir da funçãomain: Agora, modifique o bloco do comandosearchnomainpara chamarsearchWikipediae passar os argumentos que vêm depois do próprio comandosearch. Usearguments.sublist(1)para obter todos os argumentos a partir do segundo. Se nenhum argumento for fornecido apóssearch, passenullparasearchWikipedia.cli/bin/cli.dartdartvoid 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(); } }Destaques do código anterior:
- Variáveis
finalsó podem ser definidas uma vez e são usadas quando você não pretende mais alterar a variável no código. arguments.sublist(1)cria uma nova lista com todos os elementos da listaargumentsdepois do primeiro elemento (que erasearch).arguments.length > 1 ? ... : null;é um operador condicional (ternário). Ele garante que, se nenhum argumento for fornecido após o comandosearch,inputArgsse tornenull, o que corresponde ao comportamento do código de exemplo para o parâmetroargumentsdesearchWikipedia, do tipoList<String>?.
- Variáveis
-
Teste o
searchWikipediacom argumentos: Usando a linha de comando, execute a aplicação com um título de artigo de teste:bashdart bin/cli.dart search Dart ProgrammingVocê deve ver:
bashsearchWikipedia received arguments: [Dart, Programming]Em seguida, execute o mesmo comando sem os argumentos extras:
bashdart bin/cli.dart searchVocê deve ver:
bashsearchWikipedia received arguments: null -
Trate o título de artigo ausente e a entrada do usuário com o comando
stdin: É mais amigável pedir ao usuário que informe o título se ele não o fornecer na linha de comando. Usestdin.readLineSync()para isso.Primeiro, adicione o import necessário no topo do arquivo
cli/bin/cli.dart:cli/bin/cli.dartdartimport 'dart:io'; // Add this line at the topdart:ioé uma biblioteca principal do Dart SDK e oferece APIs para lidar com arquivos, diretórios, sockets, clientes e servidores HTTP, entre outros recursos.Agora, atualize sua função
searchWikipediaabaixo demain.cli/bin/cli.dartdart// ... (your existing main function) void 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'); } // ... (your existing printUsage() function)Este bloco de código introduz alguns conceitos importantes:
- Ele declara a variável
final String articleTitle. Isso permite que a análise estática detecte quearticleTitleserá umaStringe não será nula. - Em seguida, uma instrução
if/elseverifica se os argumentos de linha de comando para a busca foram fornecidos. - Se os argumentos estiverem ausentes, ele pede a entrada ao usuário,
lê o texto com
stdin.readLineSync()e trata com segurança os casos em que nenhuma entrada é informada. - Se os argumentos estiverem presentes, ele usa
arguments.join(' ')para combiná-los em uma única string de busca.
Destaques do código anterior:
stdin.readLineSync() ?? ''lê a entrada do usuário. Emborastdin.readLineSync()possa retornar null, o operador de coalescência nula (??) fornece uma string vazia ('') como alternativa caso a entrada seja null. Essa é uma forma concisa de garantir que a variável seja uma string não nula.arguments.join(' ')concatena todos os elementos da listaargumentsem uma única string, usando um espaço como separador. Por exemplo,['Dart', 'Programming']se torna"Dart Programming". Isso é essencial para tratar entradas de linha de comando com várias palavras como uma única frase de busca.- A análise estática do Dart consegue detectar que
articleTitleé garantidamente inicializada quando a instrução print é executada. Não importa por qual caminho o corpo da função seja percorrido, a variável é não anulável.
- Ele declara a variável
-
Finalize o
searchWikipediapara imprimir resultados de busca simulados: Atualize osearchWikipediapara exibir mensagens que deem a impressão de que o programa encontrou algo. Isso ajuda você a ver o que o programa final vai fazer, sem precisar construir tudo agora.Quando você executa o comando
search, omainpassa os argumentos apóssearchparasearchWikipedia, que então imprime essas mensagens usando a consulta da linha de comando ou a entrada solicitada.Seu arquivo
cli/bin/cli.dartcompleto agora deve ficar assim:cli/bin/cli.dartdartimport 'dart:io'; const version = '0.0.1'; void 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') { final inputArgs = arguments.length > 1 ? arguments.sublist(1) : null; searchWikipedia(inputArgs); } else { printUsage(); } } void 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")'); } void printUsage() { print( "The following commands are valid: 'help', 'version', 'search <ARTICLE-TITLE>'", ); } -
Execução final de teste com os dois cenários:
Agora que a simulação de artigo está configurada, teste a função
searchWikipediade algumas maneiras diferentes:bashdart bin/cli.dart search Dart ProgrammingVocê deve ver:
bashLooking up articles about "Dart Programming". Please wait. Here ya go! (Pretend this is an article about "Dart Programming")Em seguida, execute o comando
searchsem argumentos extras (digite "Flutter Framework" quando for solicitado):bashdart bin/cli.dart searchbashPlease provide an article title. Flutter Framework Looking up articles about "Flutter Framework". Please wait. Here ya go! (Pretend this is an article about "Flutter Framework")Agora você construiu com sucesso o comando
searchbásico com tratamento de entrada do usuário, tratando corretamente entradas de linha de comando com várias palavras como uma única frase de busca na saída.
Revisão
#O que você realizou
Veja um resumo do que você construiu e aprendeu nesta lição.Criou manipuladores de comandos com instruções if e else
Você usou instruções if e else para direcionar comandos diferentes, como help,
version e search. Esse padrão de controle de fluxo é fundamental para construir aplicações CLI interativas que respondem à entrada do usuário.
Trabalhou com listas e variáveis
Você aprendeu a declarar variáveis com final e const e trabalhou com listas usando
.isEmpty, .first, .sublist() e .join(). Você também usou interpolação de strings ($variable) para incorporar valores em literais de string.
Lidou com nulabilidade no seu código
Você adotou o sound null safety do Dart usando tipos anuláveis (?), verificações de null e o operador de coalescência nula (??) para fornecer valores padrão quando expressões podem ser
null.
Definiu e chamou funções
Você criou as funções printUsage() e searchWikipedia() para organizar seu código em unidades reutilizáveis. Separar a lógica reutilizável em funções ajuda a manter a função
main limpa e facilita a leitura e a manutenção do código.
Leu e tratou a entrada do usuário
Você usou stdin.readLineSync() de dart:io para ler a entrada do terminal. Isso permite prompts interativos como alternativa ou complemento aos argumentos de linha de comando.
Quiz
#Confira seu entendimento
1 / 3-
constIsso mesmo!
constdeclara uma constante de tempo de compilação. O valor precisa ser conhecido em tempo de compilação e nunca pode mudar. -
varNão exatamente.
Variáveis declaradas com
varpodem ser reatribuídas e não precisam ter o valor conhecido em tempo de compilação. -
finalNão exatamente.
finalcria uma variável que só pode ser inicializada uma vez, mas o valor é definido em tempo de execução, e não de compilação. -
staticNão exatamente.
staticé usado para membros de nível de classe, e não para declarar constantes. No entanto, constantes de nível de classe também precisam serstatic.
stdin.readLineSync() em um aplicativo CLI?
-
Ler uma única linha de texto digitada pelo usuário.
Isso mesmo!
stdin.readLineSync()lê uma única linha de texto da entrada padrão, permitindo que o programa receba dados do usuário. -
Imprimir saída no console.
Não exatamente.
A saída é impressa com
print(),stdout.write()e outros métodos semelhantes. -
Executar um comando.
Não exatamente.
A execução de comandos é feita com
Process.run()ou métodos semelhantes. -
Verificar se um arquivo existe.
Não exatamente.
A existência de arquivos é verificada com
File.existsSync()ou métodos semelhantes.
arguments.sublist(1) retorna quando arguments é ['search', 'Dart', 'Programming']?
-
['Dart', 'Programming']Isso mesmo!
sublist(1)cria uma nova lista com todos os elementos a partir do índice 1, pulando o primeiro elemento. -
['search']Não exatamente.
sublist(1)retorna os elementos a partir do índice 1 (o segundo elemento), e não apenas o primeiro. -
['search', 'Dart']Não exatamente.
Esta resposta inclui
'search', massublist(1)começa no índice 1, o que exclui o elemento do índice 0. -
['Programming']Não exatamente.
Isso é apenas o último elemento. O argumento
1especifica o índice inicial, e não quantos elementos pular a partir do final.
Próxima lição
#
No próximo capítulo, você vai mergulhar na
programação assíncrona e aprender como
buscar dados da API da Wikipedia usando o pacote http.
Isso vai permitir que sua aplicação
obtenha dados reais e os exiba para o usuário.
Salvo indicação em contrário, a documentação neste site reflete Dart 3.13.7. Página atualizada pela última vez em 2026-11-12. Ver código-fonte ou relatar um problema.
Encontrou essa página sem tradução ou que precisa de correção? Abra uma issue e nos ajude a manter esse site em PT-BR para ajudar pessoas como você.