Playlist: Curso Grátis de FLUTTER e DART Completo
Programação assíncrona: fluxos
Os fluxos fornecem uma sequência assíncrona de dados.
As sequências de dados incluem eventos gerados pelo usuário e dados lidos dos arquivos.
Você pode processar um fluxo usando aguardar ou listen () da API do Stream.
Os fluxos fornecem uma maneira de responder aos erros.
Existem dois tipos de fluxos: assinatura única ou transmissão.
A programação assíncrona em Dart é caracterizada pelas classes Future e Stream.
Um futuro representa um cálculo que não é concluído imediatamente. Onde uma função normal retorna o resultado, uma função assíncrona retorna um futuro, que eventualmente conterá o resultado. O futuro dirá quando o resultado estiver pronto.
Um fluxo é uma sequência de eventos assíncronos. É como um Iterable assíncrono – onde, em vez de obter o próximo evento quando você o solicita, o fluxo informa que há um evento quando está pronto.
Recebendo Eventos de Fluxo
Os fluxos podem ser criados de várias maneiras, o que é um tópico para outro artigo, mas todos podem ser usados da mesma maneira: o loop assíncrono para o qual o iterativo iterará os eventos de um fluxo como o loop for sobre um Iterable. Por exemplo:
Futuro MENOR int MAIOR sumStream (fluxo MENOR int MAIOR stream) async
var sum = 0;
aguardar por (var value in stream)
soma + = valor;
soma de retorno;
Esse código simplesmente recebe cada evento de um fluxo de eventos inteiros, adiciona-os e retorna (um futuro da) a soma. Quando o corpo do loop termina, a função é pausada até o próximo evento chegar ou o fluxo ser concluído.
A função é marcada com a palavra-chave async, que é necessária ao usar o loop de aguardar.
O exemplo a seguir testa o código anterior gerando um fluxo simples de números inteiros usando uma função async *:
Nota: Clique em executar para ver o resultado na saída do console.
Eventos de erro
Os fluxos são feitos quando não há mais eventos neles e o código que recebe os eventos é notificado disso, assim como é notificado de que um novo evento chega. Ao ler eventos usando um loop de espera, os loops param quando o fluxo é concluído.
Em alguns casos, um erro acontece antes que o fluxo seja feito; talvez a rede falhe ao buscar um arquivo de um servidor remoto, ou talvez o código que criou os eventos tenha um bug, mas alguém precisa saber disso.
Os fluxos também podem fornecer eventos de erro, como entrega de eventos de dados. A maioria dos fluxos parará após o primeiro erro, mas é possível ter fluxos que entreguem mais de um erro e fluxos que forneçam mais dados após um evento de erro. Neste documento, apenas discutimos fluxos que fornecem no máximo um erro.
Ao ler um fluxo usando aguardar, o erro é lançado pela instrução de loop. Isso também encerra o loop. Você pode pegar o erro usando try-catch. O exemplo a seguir lança um erro quando o iterador de loop é igual a 4:
Trabalhando com fluxos
A classe Stream contém um número de métodos auxiliares que podem fazer operações comuns em um fluxo para você, semelhantes aos métodos em um Iterable. Por exemplo, você pode encontrar o último inteiro positivo em um fluxo usando lastWhere () da API do Stream.
Dois tipos de fluxos
Existem dois tipos de fluxos.
Fluxos de Assinatura Única
O tipo mais comum de fluxo contém uma sequência de eventos que são partes de um todo maior. Os eventos precisam ser entregues na ordem correta e sem perder nenhum deles. Esse é o tipo de fluxo que você recebe quando lê um arquivo ou recebe uma solicitação da web.
Esse fluxo só pode ser ouvido uma vez. Ouvir novamente mais tarde pode significar perder os eventos iniciais, e então o resto do fluxo não faz sentido. Quando você começar a ouvir, os dados serão buscados e fornecidos em partes.
Transmitir transmissões
O outro tipo de fluxo é destinado a mensagens individuais que podem ser manipuladas uma por vez. Esse tipo de fluxo pode ser usado para eventos de mouse em um navegador, por exemplo.
Você pode começar a ouvir esse fluxo a qualquer momento e obter os eventos que são disparados enquanto ouve. Mais de um ouvinte pode ouvir ao mesmo tempo e você pode ouvir novamente depois de cancelar uma assinatura anterior.