Como fazer entrada e saída de dados no Terminal com Dart
7 min7 minutos de leitura
7 min7 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.
Autor(a)
Ricarth Lima
Acredito que educação e computação podem mudar o mundo para melhor, em especial, juntas. Amo Flutter e Unity!
Inscreva-se em nossa Newsletter
Fique por dentro de conteúdos, insights e oportunidades do universo tech. Receba novidades e lançamentos direto no seu e-mail.
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:
voidmain() {
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!
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`
classMinhaClasse {
staticconstdouble pi = 3.1415;
finaldouble raio;
MinhaClasse(this.raio);
doublecalcArea(){
return pi * raio * raio;
}
@overrideStringtoString(){
return"A área do círculo com raio $raio é igual a: ${calcArea()}.";
}
}
voidmain(){
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';
voidmain() {
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';
voidmain() {
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!