Sobes.tech
Junior

Para que são usados os streams no Flutter?

sobes.tech IA

Resposta da IA

Streams no Flutter são utilizados para processar sequências de eventos assíncronos.

Principais casos de uso:

  1. Reagir a alterações nos dados: Redux, padrões BLoC usam streams para gerir o estado da aplicação e atualizar a UI de forma reativa quando há mudanças.
  2. Trabalhar com dados em fluxo: Obter dados via rede (por exemplo, WebSocket), ler de ficheiros, trabalhar com sensores do dispositivo.
  3. Processar interações do utilizador: Acompanhar o rolar, Draggable / DragTarget.
  4. Operações assíncronas: Executar tarefas em segundo plano e obter resultados à medida que estão prontos.

Conceitos-chave:

  • Stream: Sequência de eventos assíncronos. Um stream pode emitir 0 ou mais eventos e depois terminar (com sucesso ou erro).
  • StreamSubscription: Representa uma subscrição a um stream. Permite receber eventos do stream e gerir a subscrição (pausar, retomar, cancelar).
  • Sink: Usado para adicionar dados ao stream.
  • StreamBuilder: Widget que se reconstrói ao receber novos dados do stream.
// Exemplo de uso de StreamBuilder
StreamBuilder<int>(
  stream: counterStream, // O seu stream
  builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
    if (snapshot.hasError) {
      return Text('Erro: \\${snapshot.error}');
    }
    switch (snapshot.connectionState) {
      case ConnectionState.none:
        return Text('A aguardar...');
      case ConnectionState.waiting:
        return CircularProgressIndicator();
      case ConnectionState.active:
        return Text('Valor: \\${snapshot.data}');
      case ConnectionState.done:
        return Text('Stream terminado. Último valor: \\${snapshot.data}');
    }
  },
)
// Exemplo de um stream simples que emite números
Stream<int> countStream(int max) async* {
  for (int i = 0; i <= max; i++) {
    await Future.delayed(Duration(seconds: 1));
    yield i; // Emite o valor
  }
}