Qual é o seu conhecimento sobre assíncrono em Dart?
sobes.tech IA
Resposta da IA
A asincronia em Dart é implementada usando:
-
Conceito de "isolados" (Isolates): Processos de trabalho independentes, cada um com sua própria memória. São usados para executar tarefas intensivas em recursos em paralelo sem bloquear o thread principal da interface de usuário. A comunicação entre isolados ocorre através de ports (ReceivePort, SendPort).
-
Palavras-chave
async,await:asyncmarca uma função que realizará operações assíncronas e retornará umFuture.awaité usado dentro de uma funçãoasyncpara esperar a conclusão de umFuture. Quando alcançado, a execução da função é suspensa, permitindo que outras operações sejam executadas enquanto oFuturetermina com um valor ou erro.
Future<String> fetchData() async { // Simulação de atraso await Future.delayed(Duration(seconds: 2)); return 'Dados recebidos'; } void main() async { print('Início'); String result = await fetchData(); // Espera a conclusão do fetchData print(result); print('Fim'); } -
Classe
Future<T>: Representa o resultado de uma operação assíncrona que estará disponível no futuro.Futurepode estar em um de três estados:- Não concluído (uncompleted)
- Concluído com valor (completed with a value)
- Concluído com erro (completed with an error)
O tratamento da conclusão do
Futureé feito comthen(),catchError(),whenComplete()ouawait. -
Classe
Stream<T>: Representa uma sequência de eventos assíncronos. É usada para processar fluxos de dados, por exemplo, leitura de arquivo, recebimento de dados via rede, eventos de interface de usuário. O fluxo pode ser de assinatura única (single-subscription) ou de múltiplas assinaturas (broadcast). O processamento de eventos do fluxo é feito comlisten(),async*,yield.Stream<int> countStream(int to) async* { for (int i = 1; i <= to; i++) { await Future.delayed(Duration(seconds: 1)); yield i; // Enviando valor ao fluxo } } void main() { Stream<int> stream = countStream(3); stream.listen( (data) => print('Recebido: $data'), onError: (error) => print('Erro: $error'), onDone: () => print('Fluxo concluído'), ); }
A asincronia em Dart é baseada no modelo de "loop de eventos" (event loop). O thread principal executa o código sequencialmente, mas ao encontrar uma operação assíncrona (por exemplo, await ou Future.then), ela é delegada ao "pool de eventos" (event queue) e o código continua a ser executado. Quando a operação assíncrona termina, seu resultado é enviado de volta ao "pool de eventos". O ciclo de eventos verifica continuamente o "pool de eventos" e executa tarefas quando o thread principal está livre.