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

Sentry mobile image

Mobile Vitals: A first step to Faster Apps

Slow startup times, UI hangs, and frozen frames frustrate users—but they’re also fixable. Mobile Vitals help you measure and understand these performance issues so you can optimize your app’s speed and responsiveness. Learn how to use them to reduce friction and improve user experience.

Read the guide →

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

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

Okay