Noções básicas de Streams
Parte da seção Programação Orientada a Objetos do Journey de Dart da Coddy. Lição 77 de 110.
Enquanto um Future entrega um único valor, um Stream entrega uma sequência de valores ao longo do tempo. Pense nisso como um tubo que pode emitir múltiplos pedaços de dados — perfeito para eventos, atualizações em tempo real ou processamento de dados pedaço por pedaço.
Você pode criar um stream simples usando Stream.fromIterable() ou uma função geradora assíncrona com async* e yield:
Stream<int> countToThree() async* {
yield 1;
yield 2;
yield 3;
}
Future<void> main() async {
await for (var number in countToThree()) {
print(number);
}
}
// Saída: 1, 2, 3A palavra-chave async* marca uma função que retorna um Stream, e yield emite cada valor. Para consumir o stream, use await for, que processa cada valor à medida que chega.
Você também pode escutar um fluxo usando o método listen(), que recebe uma função de callback:
Stream<String> greetings() async* {
yield 'Hello';
yield 'Hi';
yield 'Hey';
}
void main() {
greetings().listen((message) {
print(message);
});
}A principal diferença em relação às Futures: uma Future é concluída uma vez com um único valor, enquanto um Stream pode emitir muitos valores antes de ser concluído. Isso torna os Streams ideais para lidar com dados contínuos, como interações do usuário, leituras de sensores ou dados que chegam em partes.
Desafio
FácilVamos criar um sistema de temporizador de contagem regressiva que emite valores ao longo do tempo usando fluxos! Você criará uma classe que gera uma sequência de números de contagem regressiva, demonstrando como os fluxos fornecem vários valores em vez de apenas um.
Você organizará seu código em dois arquivos:
countdown.dart: crie uma classeCountdownque gere fluxos de contagem regressiva. Sua classe deve ter:- Um campo
start(int) que armazena o número inicial da contagem regressiva - Um construtor que recebe o número inicial
- Um método
countDown()que retorna umStream<int>. Useasync*eyieldpara emitir números destartaté0(inclusive) - Um método
countDownWithMessage()que retorna umStream<String>. Ele deve emitir strings no formato'T-minus [number]'para cada número destartaté1, e então emitir'Liftoff!'como valor final
- Um campo
main.dart: importe seu arquivo de contagem regressiva e demonstre os dois métodos de fluxo. Sua função principal deve ser assíncrona e:- Criar uma instância de
Countdowncomeçando em3 - Imprimir
Number countdown: - Usar
await forpara iterar porcountDown()e imprimir cada número - Imprimir uma linha vazia
- Imprimir
Launch sequence: - Usar
await forpara iterar porcountDownWithMessage()e imprimir cada mensagem
- Criar uma instância de
Observe como cada instrução yield emite um valor por meio do fluxo, e await for processa cada valor conforme ele chega. Diferentemente de um Future, que fornece um único resultado, seus fluxos emitirão vários valores em sequência!
Saída esperada:
Number countdown:
3
2
1
0
Launch sequence:
T-minus 3
T-minus 2
T-minus 1
Liftoff!Experimente você mesmo
import 'countdown.dart';
Future<void> main() async {
// TODO: Crie uma instância de Countdown começando de 3
// TODO: Imprima 'Number countdown:'
// TODO: Use await for para iterar através de countDown() e imprimir cada número
// TODO: Imprima uma linha vazia
// TODO: Imprima 'Launch sequence:'
// TODO: Use await for para iterar através de countDownWithMessage() e imprimir cada mensagem
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de OOP
Arquivos externosBibliotecas e importsIntrodução à OOPClasses vs. objetosA palavra-chave thisMétodosVariáveis de instânciaNoções básicas de construtoresRevisão - Calculadora simples4Segurança contra nulos
Introdução à segurança contra nulosAnulável vs. não anulávelOs operadores ? e !Palavra-chave Late e segurança contra nulosOperadores conscientes de nulosSegurança contra nulos em classesRecapitulação — Sistema de perfil de usuário7Classes Abstratas e Interfaces
Classes AbstratasMétodos AbstratosInterfaces em DartInterfaces ImplícitasImplementação vs. ExtensãoMúltiplas InterfacesRecapitulação - Calculadora de Formas10Coleções e Genéricos
Visão geral de List, Set e MapColeções com segurança de tiposClasses genéricasMétodos genéricosRestrições genéricasIterable e IteratorRecapitulação - Armazenamento genérico13Conceitos Avançados de OOP
Composição vs. HerançaMétodos de ExtensãoClasses ChamáveisClasses Seladas (Dart 3)Registros (Dart 3)Padrões e Correspondência (3.0)Enums com Métodos16Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses de Livros e Usuários2Construtores em Dart
Construtor padrãoConstrutores nomeadosListas de inicializaçãoConstrutores constantesConstrutores factoryConstrutores de redirecionamentoRevisão - Construtor de formas5Encapsulamento
Membros Públicos vs. PrivadosConvenção do Prefixo _Privacidade no Nível da BibliotecaAprofundamento em Getters e SettersOcultação de InformaçõesRecapitulação - Registros de Alunos8Mixins
Introdução a MixinsCriando MixinsUsando vários MixinsPalavra-chave on em MixinsMixin vs HerançaMixin vs InterfaceRecapitulação - Sistema de Animais11Métodos Especiais
Sobrescrita de toString()Sobrescrita de hashCode e ==Interface ComparableMétodo call()Sobrescrita de noSuchMethodRecapitulação - Coleção Personalizada14Padrões de Projeto – Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão Strategy3Propriedades de Classe
Membros de Instância vs. EstáticosCampos Final e ConstVariáveis LateMétodos e Campos EstáticosGetters e SettersRecapitulação - Gerenciador de Contas Bancárias6Herança
Herança BásicaA Palavra-chave superSobrescrita de MétodosA Anotação @overrideA Palavra-chave final para ClassesConstrutores e HerançaRecapitulação - Hierarquia de Funcionários9Polimorfismo
Fundamentos do polimorfismoPolimorfismo por meio de interfacesVerificação de tipos em tempo de execuçãoOs operadores is e asPalavra-chave covarianteRecapitulação — Processador de pagamentos12OOP Assíncrona
Futures e async/awaitNoções básicas de StreamsControladores de StreamConstrutores assíncronosAsync em métodos de classeRecapitulação — Buscador de dados15Padrões de Projeto — Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão RepositoryPratique por conta própria: Compilador de Dart online