Skip to main content


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çãoExemplo
Exibir mensagemprint()
Salvar dadossalvarUsuario()
Enviar notificaçãoenviarEmail()
Alterar estadoativarConta()


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;
}