Funções
Uma função é um bloco de código que recebe um nome, criado para executar uma tarefa. Em vez de repetir o mesmo código várias vezes, você cria uma função e chama essa função quando precisar. Para criar uma função faça:
void mostrarMensagem() {
print('Sistema iniciado');
}
Depois precisa chamar essa função no main() ou em alguma função que tenha sido chamada no main().
void main() {
mostrarMensagem();
}
Em Dart, funções são objetos, isso significa que elas podem ser guardadas em variáveis, passadas como parâmetro e usadas dentro de outras funções.
Estrutura básica de uma função
A estrutura básica é:
tipoDeRetorno nomeDaFuncao(parametros) {
// código da função
}
Exemplo:
void exibirUsuario() {
print('Usuário: Jose');
}
void
Indica que a função não retorna valor.exibirUsuario
Nome da função.()
Local onde ficam os parâmetros.
Função sem retorno
Uma função sem retorno apenas executa uma ação, exemplo:
void exibirBoasVindas() {
print('Bem-vindo ao sistema');
}
void main() {
exibirBoasVindas();
}
A palavra void indica que a função não devolve nenhum valor. Use void quando a função apenas faz algo, como:
| Ação | Exemplo |
|---|---|
| Exibir mensagem | print() |
| Salvar dados | salvarUsuario() |
| Enviar notificação | enviarEmail() |
| Alterar estado | ativarConta() |
Função com parâmetro
O parâmetro é um valor que a função recebe, exemplo:
void exibirUsuario(String nome) {
print('Usuário: $nome');
}
void main() {
exibirUsuario('Jose');
exibirUsuario('Ana');
}
Função com mais de um parâmetro
Uma função pode receber vários parâmetros, exemplo:
void exibirProduto(String nome, double preco) {
print('Produto: $nome');
print('Preço: R\$ $preco');
}
void main() {
exibirProduto('Teclado', 150.00);
}
Função com retorno
Uma função com retorno calcula ou produz um valor e devolve esse valor para quem chamou.
double calcularTotal(double preco, int quantidade) {
double total = preco * quantidade;
return total;
}
void main() {
double resultado = calcularTotal(25.50, 3);
print(resultado); // Exibe: 76.5
}
Função com retorno direto
Quando a função é pequena, você pode retornar direto.
double calcularTotal(double preco, int quantidade) {
return preco * quantidade;
}
void main() {
print(calcularTotal(10.00, 5)); // Exibe: 50.0
}
A função faz a conta e retorna o resultado sem criar uma variável interna.
Função com arrow syntax
O dart permite uma forma curta para funções que têm apenas uma expressão.
double calcularTotal(double preco, int quantidade) => preco * quantidade;
void main() {
print(calcularTotal(10.00, 5));
}
A sintaxe => é uma forma curta de escrever { return expressão; }. Ela deve ser usada apenas quando há uma expressão simples para retornar. Estas duas funções fazem a mesma coisa:
double calcularTotal(double preco, int quantidade) {
return preco * quantidade;
}
double calcularTotal(double preco, int quantidade) => preco * quantidade;
Parâmetros posicionais
Os parâmetros que vimos até agora são posicionais, ou seja, a ordem deles importa.
void criarUsuario(String nome, int idade) {
print('Nome: $nome');
print('Idade: $idade');
}
void main() {
criarUsuario('Jose', 27);
}
Parâmetros nomeados
Os parâmetros nomeados usam {} na declaração da função, exemplo:
void criarUsuario({required String nome, required int idade}) {
print('Nome: $nome');
print('Idade: $idade');
}
void main() {
criarUsuario(nome: 'Jose', idade: 27);
}
Os parâmetros nomeados são opcionais por padrão, a menos que sejam marcados com required.
Valores padrão
Você pode definir um valor padrão para um parâmetro, esse valor será usado caso um valor não seja fornecido por quem está chamando a função.
void criarUsuario({
required String nome,
int idade = 18,
bool ativo = true,
}) {
print('Nome: $nome');
print('Idade: $idade');
print('Ativo: $ativo');
}
void main() {
criarUsuario(nome: 'Ana');
}
Parâmetros opcionais posicionais
Também existem parâmetros opcionais posicionais, eles usam [].
void exibirMensagem(String usuario, [String? setor]) {
print('Usuário: $usuario');
if (setor != null) {
print('Setor: $setor');
}
}
void main() {
exibirMensagem('Jose');
exibirMensagem('Ana', 'Suporte');
}
Resultado:
Usuário: Jose
Usuário: Ana
Setor: Suporte
A declaração [String? setor] informa que o parâmetro setor é opcional, ele pode ser uma String ou null.
Escopo de variáveis
O escopo define onde uma variável pode ser acessada. Uma variável criada dentro de uma função só existe dentro daquela função.
void exibirUsuario() {
String nome = 'Jose';
print(nome);
}
void main() {
exibirUsuario();
print(nome); // erro
}
Variáveis criadas dentro de um bloco {} ficam presas a esse bloco.
Funções anônimas
Uma função anônima é uma função sem nome. Ela é muito usada quando você quer passar uma função como argumento para outra função. Exemplo com lista:
void main() {
List<String> usuarios = ['Ana', 'Jose', 'Carlos'];
usuarios.forEach((usuario) {
print('Usuário: $usuario');
});
}
O usuarios.forEach(...) executa uma função para cada item da lista. Já o trecho abaixo cria a função anônima:
(usuario) {
print('Usuário: $usuario');
}
Ela recebe um usuário e executa o print. A documentação chama essas funções de anonymous functions, lambdas ou closures.
Função anônima com =>
Quando a função anônima tem apenas uma expressão, pode usar =>, exemplo:
void main() {
List<String> usuarios = ['Ana', 'Jose', 'Carlos'];
usuarios.forEach((usuario) => print('Usuário: $usuario'));
}
Esse código faz a mesma coisa que:
usuarios.forEach((usuario) {
print('Usuário: $usuario');
});
Use a forma curta quando o código for simples.
Guardando função em variável
Como funções são objetos em Dart, você pode guardar uma função em uma variável.
void main() {
var dobrar = (int numero) {
return numero * 2;
};
print(dobrar(5));
}
Função recebendo outra função
Uma função pode receber outra função como parâmetro.
void executarOperacao(int numero, int Function(int) operacao) {
int resultado = operacao(numero);
print(resultado);
}
void main() {
executarOperacao(5, (numero) => numero * 2);
}
A linha int Function(int) operacao significa que operacao é uma função que recebe um int e retorna um int.
Já a linha int resultado = operacao(numero); executa a função recebida como parâmetro.
A linha executarOperacao(5, (numero) => numero * 2); passa o número 5 e uma função anônima que dobra o valor. Esse assunto é intermediário, mas é importante conhecer porque aparece bastante em listas, callbacks e Flutter.
Não se preocupe em tentar entender tudo ao máximo nesse momento.
Função com Return
Quando a função precisa retornar algum valor, nunca se esqueça de fornecer o tipo da função. Apesar de funcionar em alguns casos (quando a função não possui tipo), é melhor evitar esse comportamento.
Evite fazer o exemplo abaixo:
calcularTotal(double preco, int quantidade) {
return preco * quantidade;
}
O melhor é sempre definir o tipo da função:
double calcularTotal(double preco, int quantidade) {
return preco * quantidade;
}