Como fazer entrada e saída de dados no Terminal com Dart  

Ricarth Lima
Ricarth Lima

Compartilhe

Avalie este artigo

7 minutos de leitura

Este artigo é para quem está começando a programar em Dart e quer aprender, passo a passo, como fazer entrada de dados (input) usando o terminal, além de como exibir informações com print no Dart.

Veja como utilizar comandos como stdin.readLineSync(), entender o funcionamento de stdin em Dart e fazer input/output diretamente no terminal. 

Esse artigo está dividido nos seguintes passos: 

  • A importância de “conversar” com o computador; 
  • Saída de dados com a função Print; 
  • Entrada de dados com a Biblioteca dart:io. 

Aprender a usar essas ferramentas vai ajudar você bastante no processo de aprendizado da linguagem Dart! Vamos lá? 

O que é entrada e saída de dados em Dart (input/output)"  

Quando tratamos de Programação, é comum imaginar que queremos trocar dados com o computador para resolvermos nossos problemas, certo?

Essa troca de dados, quando ocorre diretamente, muitas vezes é chamada Entrada/Saída (ou mais conhecida como I/O, do inglês, Input/Output). 

Quando programamos em Dart, usamos principalmente o terminal para ler as informações que a ferramenta nos entrega (como dados, erros e avisos) e o resultado das operações que estamos realizando. 

Banner promocional da Alura destacando até 35% de desconto em cursos de tecnologia. A mensagem reforça que a diferença entre potencial e resultado está no preparo, incentivando profissionais a se anteciparem às mudanças do mercado e investirem no desenvolvimento de novas habilidades. A imagem mostra uma pessoa usando fones de ouvido e há um botão com a chamada "Aproveitar agora" para começar a evoluir na carreira tech.

Saída de dados com a função Print 

Um dos primeiros contatos que temos com Dart é a função print(). Usamos essa função para mostrar algo no terminal do Dart. No começo, costumamos usá-la para imprimir (ou seja, mostrar no terminal) textos simples, mas ela pode ser muito mais poderosa que isso. 

Vamos entender melhor como isso funciona? 

Como interpolar variáveis e expressões com print Dart  

Essa funcionalidade, na verdade, pode ser utilizada em qualquer String (pois se trata de uma propriedade do objeto String). No entanto, costuma ser usada principalmente em Strings dentro da função print() 

Para concatenar (juntar) informações textuais com dados armazenados nas nossas variáveis, podemos interpolar essas variáveis, e até expressões, com nossa String usando o caractere $. Observe o código e veja se está claro para você o que acontece: 

void main() { 
  int idade = 25; 
  print("Minha idade é " + idade.toString()); // Tem que converter manualmente para concatenar, mais trabalhoso, menos legível. 
  print("Minha idade é $idade"); // Adicionado por interpolação. 
  print("Minha idade ano que vem será: ${idade + 1}"); // Uma expressão! 
}

Se observamos bem o código, veremos que ele todo está ainda na “fase” de entrada. Primeiro, é criada uma variável int chamada idade e com valor de 25. 

Em seguida, a função print é utilizada para exibir no terminal a variável criada anteriormente. Tudo que é passado para a função print será mostrado no terminal como saída. 

Saída: 

Na imagem há a captura de tela do terminal do Dart. Há três linhas em destaque, as duas primeiras mostam o mesmo resultado “Minha idade é 25”, e a terceira diz “Minha idade ano que vem será: 26”. 

Imprimindo outros tipos de objetos 

A função print() consegue mostrar algo na tela para todo tipo de objeto em Dart. Para isso, ela usa o método toString(), que é herdado da classe Object, que é como se fosse o “molde” de todos os outros objetos! 

Isso quer dizer que você pode imprimir Inteiros, Doubles, Booleans, Listas, Maps, Funções e até Classes! 

void main() { 
  String name = "Ricarth"; 
  int idade = 25; 
  double altura = 1.79; 
  bool geek = true; 
  List<String> listCoding = ["Flutter", "Unity"]; 
  MinhaClasse minhaClasse = MinhaClasse(2); 
  print(name); 
  print(idade); 
  print(altura); 
  print(geek); 
  print(listCoding); 
  print(main); 
  print(MinhaClasse); 
  print(minhaClasse); 
}

Saída: 

Na imagem há a captura de tela do terminal do Dart. Há várias linhas em destaque, a primeira mostra o resultado da impressão da String, a segunda, do inteiro, a terceira, do double, a quarta, do boolean, a quinta, da lista de Strings, a sexta da função, da quarta da classe MinhaClasse, e a última, a da instância da classe MinhaClasse. 

Note que, no exemplo, é possível imprimir até mesmo a função main, e algumas informações padrões são exibidas automaticamente. 

Observe também que a variável minhaClasse, uma instância da classe MinhaClasse, foi exibida como “Instance of ‘MinhaClasse’”.

Essa é a saída padrão quando uma classe não tem o método toString() sobrescrito (ou seja, personalizado). No exemplo a seguir, vamos ver como sobrescrever o método toString() utilizando a anotação @override 

class MinhaClasse { 
  static const double pi = 3.1415; 
  final double raio; 
  MinhaClasse(this.raio); 
  double calcArea() { 
return pi * raio * raio; 
  } 
  @override 
  String toString() { 
return "A área do círculo com raio $raio é igual a: ${calcArea()}."; 
  } 
} 
void main() { 
  MinhaClasse minhaClasse = MinhaClasse(2); 
  print(minhaClasse); 
}

Saída: 

Note que agora a saída não foi mais um “Instance of ‘MinhaClasse’” e sim um texto elaborado que nós programamos anteriormente no método toString()

Entrada de dados com a Biblioteca dart:io 

E se quisermos receber uma informação digitada pelo teclado, vinda do terminal? Isso é possível! Para isso, utilizaremos a biblioteca dart:io (confira mais detalhes na documentação oficial: Dart: An introduction to the dart:io library). 

Se você ainda não souber o que é uma biblioteca, tudo bem! Vamos conversar sobre isso mais para frente na Formação Dart da Alura! Mas, para resumir, é um conjunto de códigos que podemos importar (ou seja, adicionar) ao nosso código e a partir daí teremos várias outras funções já prontas para usarmos. 

Para fazer essa importação da biblioteca dart:io, coloque a linha que segue no começo do arquivo Dart: 

import 'dart:io'; 

Uma vez importada, agora podemos usar a função stdin.readLineSync(), que vai fazer a execução do nosso programa parar e ficar esperando até digitarmos algo. 

import 'dart:io'; 
void main() { 
  print("Qual a sua idade?"); 
  stdin.readLineSync(); 
}

No exemplo acima, não armazenamos a informação que chega do teclado em uma variável, fazendo com que este dado seja perdido.

Para armazenar a informação digitada, devemos guardá-la em uma variável do tipo String, pois, independentemente do que for digitado (número ou texto), o stdin.readLineSync() sempre retorna uma String?. 

import 'dart:io'; 
void main() { 
  print("Qual a sua idade?"); 
  String? input = stdin.readLineSync(); 
  print("Sua idade é $input."); 
}

Note que existe uma interrogação após o tipo String, indicando que a variável input também pode ser nula (o que pode ocorrer em situações de erro ou operações assíncronas). Este conceito está relacionado ao Null Safety. Saiba mais sobre Null Safety neste artigo da Alura

Como o stdin.readLineSync() retorna apenas valores do tipo String?, mas a idade é um valor inteiro, é necessário converter esse valor de String? para `int`.

Para isso, utilizamos a técnica chamada Type Casting (veja mais sobre tipos e conversões na documentação, em inglês, do Dart) para convertermos de String? para int

void main() { 
  print("Qual a sua idade?"); 
  String? input = stdin.readLineSync(); 
  if (input != null) { 
int idade = int.parse(input); 
    print("Ano que vem sua idade será ${idade + 1} anos."); 
  } else { 
    print("Não foi possível calcular o valor da idade"); 
  } 
}

Como String? pode ser nulo, é importante garantir que existe um valor não nulo em input. Isso é feito verificando if (input != null). Se houver valor, fazemos a conversão e mostramos o resultado na tela. 

Resumo: como usar entrada de dados (input) e saída (print) em Dart  

Agora você já sabe como receber uma informação do teclado, manipulá-la e exibi-la no terminal de forma eficiente! 

Como desafio extra, proponho criar um programa que solicita o nome (String), idade (int), altura (double) e peso (double) da pessoa usuária e exibe o nome, idade e IMC (Índice de Massa Corporal)! de uma forma amigável. 

Para saber mais 

Espero que tenha gostado da leitura e tenha sentido aquela ansiedade boa de colocar a mão no código! Como recomendação, esse texto (em inglês) com mais usos da Biblioteca dart:io

Mas, se você quer ir além da entrada e saída de dados em Dart e dominar Flutter do básico ao avançado, vale continuar sua jornada de estudos com a carreira Desenvolvimento Mobile com Flutter. 

Te vejo por aí no maravilhoso mundo do Dart! Até mais! 

Avalie este artigo 

✨ Agradecemos pela sua avaliação! ✨ 

Avalie este artigo

Ricarth Lima
Ricarth Lima

Acredito que educação e computação podem mudar o mundo para melhor, em especial, juntas. Amo Flutter e Unity!

Veja outros artigos sobre Mobile