StreamBuilder

Os apps modernos são altamente assincrônicos, ou seja, qualquer coisa pode acontecer a qualquer momento e em qualquer ordem.

Você pode pensar nesses eventos como um fluxos de dados (Dart oferece um ótimo suporte para fluxos assincrônicos de dados, utilizando fluxos).

Como você utiliza fluxos num app do Flutter?

Use o widget StreamBuilder que escutará os eventos que fluem a partir da transmissão.
Para qualquer novo evento, ele vai reconstruir a sentença, oferecendo o evento mais recente para ser utilizado.

Comece dando um fluxo ao StreamBuilder:

StreamBuilder(
  stream: _myStream,
  //...
);

Basta conectar, então escreva o construtor determinando um snapshot, declare qual deve ser a aparencia dessa parte do seu app.

StreamBuilder(
  stream: _myStream,
  builder: (context, snapshot) {
    return MyWidget(snapshot.data);
  }
);

Você pode indicar os dados iniciais, com o initialData, para que seu widget tenha algo que mostrar, enquanto aguarda o primeiro evento.

StreamBuilder(
  stream: _myStream,
  initialData: ...,
  builder: (context, snapshot) {
    return MyWidget(snapshot.data);
  }
);

Ou verificar antes no snapshot através do snapsht.hasData se há dados para depois mostrá-los. Caso não haja, você pode exibir um indicador de carregamento.

StreamBuilder(
  stream: _myStream,
  builder: (context, snapshot) {
    if (!snapshot.hasData) {
      return CircularProgressIndicator();
    }
    return MyWidget(snapshot.data);
  }
);

Poderá também checar como está sua conexão com o ConnectionState:

StreamBuilder(
  stream: _myStream,
  builder: (context, snapshot) {
    switch (snapshot.connectionState) {
      case ConnectionState.waiting:
      case ConnectionState.none:
        return LinearProgressIndicator();
      case ConnectionState.active:
        return MyWidget(snapshot.data);
      case ConnectionState.done:
        return MyFinalWidget(snapshot.data);
    }    
  }
);

Há a possibilidade também de poder verifique possí­veis erros com o snapshot.hasError:


StreamBuilder(
  stream: _myStream,
  builder: (context, snapshot) {
    if (!snapshot.hasError) {
      return UhOh(snapshot.error);
    }
    return MyWidget(snapshot.data);
  }
);


Você pode usar StreamBuilder com dados do Firebase, utilizando o SensorEvents, até mesmo com o status de conexão da rede.

175 Visualizações