Acesso direto aos conteúdos
| Conteúdo | Link |
|---|---|
| Funções | acesso |
| Programação Orientada a Objetos | acesso |
| Null Safety | work in progress |
| Collections | work in progress |
| Programação Assíncrona | work in progress |
Dart é uma linguagem fortemente tipada, o que significa que cada variável tem um tipo específico. Neste documento, exploraremos os principais tipos básicos da linguagem com exemplos práticos.
Dart pode inferir o tipo de uma variável com base no valor atribuído. Isso é feito utilizando a palavra-chave var.
var nome = "Dart"; // Inferido como String
var idade = 30; // Inferido como int
print(nome.runtimeType); // Saída: String
print(idade.runtimeType); // Saída: intA inferência de tipos ajuda a tornar o código mais legível sem perder segurança de tipos.
Dart possui os modificadores final e const para criar variáveis imutáveis.
O modificador final permite definir uma variável que pode ser inicializada apenas uma vez.
final String linguagem = "Dart";
final int ano = 2011;
print(linguagem); // Saída: Dart
print(ano); // Saída: 2011A diferença de
finalparavaré que, após a atribuição inicial, o valor não pode ser alterado.
O modificador const cria constantes em tempo de compilação, ou seja, o valor deve ser conhecido no momento da compilação.
const double pi = 3.14159;
const int maxUsuarios = 1000;
print(pi); // Saída: 3.14159
print(maxUsuarios); // Saída: 1000A diferença entre
finaleconsté quefinalpode receber valores em tempo de execução, enquantoconstdeve ser conhecido em tempo de compilação.
Considere a criação e exibição de uma variável imutável para a data e hora atual.
final data = DateTime.now();
print(data);Este código compila por que a data atual é recebida no momento da execução do código.
const data = DateTime.now();
print(data);Este código FALHA por que a data atual só será conhecida em tempo de compilação e o compilador não poderá determinar este valor previamente, pois o momento da compilação é indeterminado e o valor não pode ser atribuido; então para este caso deveremos utilizar o modificador final paea obter o valor em tempo de execução.
O tipo num é a superclasse dos números em Dart. Ele pode representar tanto inteiros (int) quanto números de ponto flutuante (double).
num numero1 = 10;
num numero2 = 5.5;
print(numero1); // Saída: 10
print(numero2); // Saída: 5.5O tipo int representa números inteiros, ou seja, sem casas decimais.
int idade = 25;
print(idade); // Saída: 25int a = 10;
int b = 3;
print(a + b); // Saída: 13
print(a - b); // Saída: 7
print(a * b); // Saída: 30
print(a ~/ b); // Saída: 3 (divisão inteira)
print(a % b); // Saída: 1 (resto da divisão)
print('11 é impar? ${11.isOdd}'); // Saída: 11 é impar? true
print('10 é par? ${10.isEven}'); //Saída: 10 é par? trueO tipo double representa números de ponto flutuante (com casas decimais).
double preco = 10.99;
print(preco); // Saída: 10.99double x = 5.7;
double y = 2.3;
print(x + y); // Saída: 8.0
print(x - y); // Saída: 3.4
print(x * y); // Saída: 13.11
print(x / y); // Saída: 2.4782608695652173
print('A minha pretenção salarial é de R\$ ${10000.toStringAsFixed(2)}'); //Saída: A minha pretenção salarial é de R$ 10000.00O tipo String representa uma sequência de caracteres.
String nome = "Dart";
print("Olá, $nome!"); // Saída: Olá, Dart!// Interpolacao de dados
print('Nome: $nome, idade: $idade, seu nome tem ${nome.length} caracteres.');
// Utilização de caracteres especiais como Emojs.
print('I \u2764 Dart\u0021');
print('I \u{1FA77} Dart\u{1F3AF}');
// String formatadas com múltiplas linhas.
final fraseMultiLinha = '''
Primei linha
Segunda linha
Terceira linha
''';
String texto = "Dart é incrível!";
print(texto.length); // Saída: 16
print(texto.toUpperCase()); // Saída: DART É INCRÍVEL!
print(texto.toLowerCase()); // Saída: dart é incrível!
print(texto.contains("Dart")); // Saída: trueO tipo List representa uma coleção ordenada de elementos.
Estes são exemplos básicos sobre Lists, teremos uma aula dedicada para collections mais à frente.
List<int> numeros = [1, 2, 3, 4, 5];
numeros.add(6);
print(numeros); // Saída: [1, 2, 3, 4, 5, 6]List<String> frutas = ["Maçã", "Banana", "Laranja"];
print(frutas.length); // Saída: 3
print(frutas[1]); // Saída: Banana
frutas.remove("Maçã"); // Remove "Maçã"
print(frutas); // Saída: [Banana, Laranja]O tipo Map representa uma coleção de pares chave-valor.
Estes são exemplos básicos sobre Maps, teremos uma aula dedicada para collections mais à frente.
Map<String, int> idades = {
"Ana": 30,
"Pedro": 25,
"Maria": 28,
};
print(idades["Pedro"]); // Saída: 25idades["João"] = 32; // Adiciona um novo par chave-valor
print(idades.containsKey("Ana")); // Saída: true
print(idades.keys); // Saída: (Ana, Pedro, Maria, João)
print(idades.values); // Saída: (30, 25, 28, 32)O tipo Function representa funções que podem ser armazenadas em variáveis e passadas como argumentos.
void saudacao(String nome) {
print("Olá, $nome!");
}
// Observe que o objeto declarado minhFuncao recebe uma função já declarada nas linhas anteriores. Ao executá-la, estamos realizando a execução da função minhaFuncao que é um objeto do tipo saudacao, um void callBack (String{}).
Function minhaFuncao = saudacao;
minhaFuncao("Marina"); // Saída: Olá, Marina!Funções anonimas são funções que não possuem identificadores.
Onserve que o objeto multiplicar está recebendo uma Função Anonima, logo ele será do tipo (int, int) => int, ou seja uma função que recebe 2 parametros do tipo int e tem seu retorno do tipo int.
var multiplicar = (int a, int b) => a * b;
print(multiplicar(3, 4)); // Saída: 12O tipo dynamic permite armazenar valores de qualquer tipo, mas deve ser usado com cautela, pois desativa a verificação de tipos em tempo de compilação.
Discutiremos a validação de tipos em tempo de compilação em outro momento.
### Verificando o tipo de uma variável `dynamic`
```dart
dynamic x = 'Ahsoka';
print('x: $x: ${x.runtimeType}');
x = 20;
print('x: $x: ${x.runtimeType}');
x = ['a', 'b', 'c'];
print('x: $x: ${x.runtimeType}');
x = {'a': 1, 'b': 2};
print('x: $x: ${x.runtimeType}');
x = () => print('Olá');
print('x: $x: ${x.runtimeType}');Dart oferece uma variedade de tipos de dados para manipulação eficiente de valores. Compreender esses tipos é essencial para o desenvolvimento de aplicativos robustos e eficientes.
Agora você pode conferir os exemplos mais detalhados sobre Functions neste arquivo.