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

AWS Security LIVE!

Tune in for AWS Security LIVE!

Join AWS Security LIVE! for expert insights and actionable tips to protect your organization and keep security teams prepared.

Learn More

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

AWS Security LIVE!

Hosted by security experts, AWS Security LIVE! showcases AWS Partners tackling real-world security challenges. Join live and get your security questions answered.

Tune in to the full event

DEV is partnering to bring live events to the community. Join us or dismiss this billboard if you're not interested. ❤️