Streams - Programação Reativa (Em desenvolvimento)


Neste artigo, iremos abordar um dos assuntos fundamentais da programação reativa, streams.

.

 

Se você viu o nosso artigo anterior sobre futures, pode se lembrar que cada future

representa um único valor, seja um erro ou um dado, que é entregue de forma assíncrona.

Os streams funcionam de forma similar, só que em vez de apenas uma única coisa, eles podem entregar zero ou mais valores e erros ao longo do tempo. Se pensarmos em como um único valor se relaciona com um iterador do mesmo tipo, é desta forma que um future se relaciona com um stream.

Assim como acontece com futures, o importante é decidir com antecedência o que fazer quando uma porção de dados está pronta, quando há um erro e quando o stream está completo.

E o ciclo de eventos Dart ainda está encarregado de tudo.

Se está usando o método files.openRead para ler dados de um arquivo, por exemplo, ele retorna um stream. Pedaços de dados são lidos do disco
e chegam ao ciclo de eventos.

O dart:io olha para eles e diz: "Ah, eu tenho alguém esperando por isso," adiciona os dados ao stream e eles aparecem no código do seu app. Quando outro pedaço dos dados chega, ele entra e sai da mesma forma.

Streams baseados em temporizadores, que levam dados de um soquete de rede... eles também trabalham com o ciclo de eventos usando um clock e eventos de rede.

Certo, vamos falar sobre como trabalhar com dados fornecidos por um stream.

final myStream = NumberCreator().stream;

Digamos que eu tenha uma classe que me dará um stream que libera um novo integer a cada segundo... um, dois, três, quatro, cinco. Eu posso usar o método listen para me inscrever ao stream.

final myStream = NumberCreator().stream;

final subscription = myStream.listen(
(data) = print('Data: $data'),
);

Eu forneço uma função e toda vez que um novo valor for emitido pelo stream, a minha função é chamada e imprime isso.

Data: 1
Data: 2
Data: 3
...

O listen funciona assim. Uma coisa importante a se notar é que, por padrão streams são configurados para uma única inscrição.

Eles se atem aos seus valores até que alguém se inscreva e eles permitem apenas um ouvinte por toda a sua existência. Se tentar ouvir a um deles duas vezes, vai obter uma exceção.

final myStream = NumberCreator().stream;

final subscription = myStream.listen(
(data) = print('Data: $data'),
);
final subscription2 = myStream.listen(
(data) = print('Data again: $data'),
);

Felizmente, o Dart também oferece streams de broadcast. Podemos usar o método asBroadcastStream para criar um stream de broadcast a partir de um stream de inscrição única.

Em desenvolvimento...

 

193 Visualizações