Desvendando os Completers no Dart: Simplificando o Desenvolvimento Assíncrono

Toshi Ossada
Flutter Brasil
Published in
3 min readJul 28, 2024
completers

A programação assíncrona é algo que certamente está presente no dia-a-dia de todo desenvolvedor e necessitamos frequentemente gerenciar Futures.

E é bem simples, na verdade, controlar o fluxo de uma Future para garantir que não executemos a Future antes de um código que dependa de seu resultado quando executamos a partir de uma interação do usuário, entretanto as vezes essa execução foge um pouco de nosso controle. Mas calma, no Dart existe com Completers e serve justamente para esses casos.

O Completer é uma forma de executar Futures, que podem ser completadas ou disparar um error, e gerencia-las manualmente. O Completer te dará uma maior flexibilidade no controle das Futures.

No Completer teremos 5 propriedades importantes

Então para usarmos o Completer podemos executar o complete(T) para quando queremos completar com sucesso e o .completeError(Object) quando queremos completar com algum error.

A partir dai conseguimos utilizar a Future normalmente

Um exemplo pratico que podemos fazer é a de criar um Timeout para chamada de uma API, no exemplo a seguir estou simulando a chamada em uma API que demora 5 segundos e configurei um Timeout de 3 segundos.

E o Resultado será

Se eu mudar o timeout para 10 segundos obterei

Agora imagine que necessitemos executar alguma função assíncrona no construtor de uma classe, como por exemplo, iremos utilizar o Hive e necessitamos abrir o box no construtor para que utilizemos nos outros métodos.

O problema dessa abordagem é que não conseguimos controlar o fluxo de execução das Futures e não conseguimos garantir que o _init() seja executado antes do add() por exemplo.

Dai que entra os completers, utilizando o Completer conseguimos facilmente garantir que o box do Hive está aberto antes de chamarmos o add() ou até mesmo o values.

E para utilizarmos basta criar uma instancia do repositório e chamar os métodos add() e getAl()

Legal, ne? Essa abordagem eu utilizo bastante quando crio uma adaptação do Hive por exemplo e preciso registrar no meu gerenciador de injeção de dependência como o getIt e o modular, é uma forma muito eficaz de trabalhar

Entre em nosso discord para interagir com a comunidade e ficar por dentro de todas as nossas publicações: https://discord.flutterbrasil.com.br

--

--