DEV Community

Toshi Ossada for flutterbrasil

Posted on

Multiplos retornos no Flutter/DART com os Records

No último dia 10 de maio, ocorreu o Google IO, obviamente não foi um evento voltado para (somente) programação e sim um evento que anuncia todos os seus próximos lançamentos como o Bard, Pixel Tablet, Pixel Fold, Pixel Watch. etc.

Claro todos estávamos ansiosos com o lançamento do Dart 3 que foi anunciado em janeiro no Flutter Forward, e foi exatamente isso que aconteceu, Dart 3 na Stable junto com a vinda do Flutter 3.10, muitos acabaram se decepcionando pois estavam com expectativas muito elevadas achando que viria novidade, mas as novidades eram as que foram anunciadas no Flutter Forward.

Uma das features que eu particularmente estava aguardando é a possibilidade de sua função conseguir retornar mais de um valor, e isso hoje é possível aos records.

Basicamente é só colocar os tipos dos retornos entre parênteses e receber nas variáveis, também em parênteses, descontruindo os retornos

void main(){
final user = {
'name': 'Toshi Ossada',
'age': 25,
};
final (name, age) = userInfo(user);
print('Nome do Usuario: $name, idade: $age anos.');
}
(String, int) userInfo(Map<String, dynamic> json) {
return (json['name'], json['age']);
}
view raw main.dart hosted with ❤ by GitHub

No retorno ao invés de receber em várias variáveis posso também receber em apenas uma e acessar de forma posicional.

Também conseguimos passar o retorno de forma nomeada, basta colocar o nome do retorno na frente do tipo do dado

void main(){
final user = {
'name': 'Toshi Ossada',
'age': 25,
};
final userRetorno = userInfo(user);
print('Nome do Usuario: ${userRetorno.name}, idade: ${userRetorno.age} anos.');
}
({String name, int age}) userInfo(Map<String, dynamic> json) {
return (name: json['name'], age: json['age'] );
}
view raw playground.dart hosted with ❤ by GitHub

Caso queiramos ignorar alguns dos retornos basta usar o underline como nome da variável de retorno

void main(){
final user = {
'name': 'Toshi Ossada',
'age': 25,
};
var (String name, _) = userInfo(user);
print('Nome do Usuario: $name.');
}
(String, int) userInfo(Map<String, dynamic> json) {
return (json['name'] as String, json['age'] as int);
}
view raw playground.dart hosted with ❤ by GitHub

Com isso podemos fazer tratamento de erros que nem é de costume fazer em algumas linguagens como o Go Lang de retornar um Erro ou o valor da função e depois de retornarmos validamos se o erro foi retornado

void main(){
final (excessao, resultado) = dividir(10, 0);
if(excessao != null){
print(excessao.toString());
return ;
}
print(resultado);
}
(Exception? exception, double result) dividir(int dividendo, int divisor) {
if(divisor == 0){
return (Exception("Divisor não pode ser 0"), -1);
}
return (null, dividendo/divisor);
}
view raw playground.dart hosted with ❤ by GitHub

A dúvida de muitos será, isso substitui o DartZ? E a resposta é depende, se utiliza o DartZ apenas para retornar dois valores sim, entretanto o DartZ tem muitas outras features que nos auxiliam no desenvolvimento.

Muito bacana essa nova funcionalidade no Dart 3 né? Pode não parecer grande coisa, mas eu, que trabalhei com linguagens que tinham essa possibilidade, posso te garantir que ajuda bastante. Além do mais os records possibilitaram outras features mais interessantes como os Destructuring e os records patterns que iremos ver nos proximos artigos :)

Tem vários exemplos em meu github https://github.com/toshiossada Dê uma olhada e deixe suas estrelinhas! :)

Image description

Entre em nosso discord para interagir com a comunidade: flutterbrasil.com.br

Image of Datadog

Get the real story behind DevSecOps

Explore data from thousands of apps to uncover how container image size, deployment frequency, and runtime context affect real-world security. Discover seven key insights that can help you build and ship more secure software.

Read the Report

Top comments (0)

Image of Quadratic

Free AI chart generator

Upload data, describe your vision, and get Python-powered, AI-generated charts instantly.

Try Quadratic free

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay