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

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.
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:

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:

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:
- Em inglês: Standard Input Output - Geeks For Geeks
- Em inglês: The Dart type system | Dart
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! ✨









