Recapitulação - Data Fetcher
Parte da seção Programação Orientada a Objetos do Journey de Dart da Coddy — lição 81 de 110.
Desafio
FácilVamos construir uma classe DataFetcher que reúne todos os conceitos de POO assíncrona deste capítulo! Você criará um serviço de dados que utiliza inicialização assíncrona, métodos assíncronos para buscar itens individuais e uma stream para entregar múltiplos resultados ao longo do tempo.
Você organizará seu código em dois arquivos:
data_fetcher.dart: Crie uma classeDataFetcherque simula a busca de dados de uma fonte remota. Sua classe deve ter:- Um campo
finaldo tipoStringchamadosourceque armazena de onde os dados vêm - Um construtor privado que inicializa a fonte
- Um método de fábrica assíncrono estático
connect(String sourceName)que retorna umFuture<DataFetcher>. Simule um atraso de conexão de 100 milissegundos e, em seguida, retorne uma nova instância com a fonte definida para o nome fornecido - Um método assíncrono
fetchItem(int id)que retorna umFuture<String>. Simule um atraso de 50 milissegundos e, em seguida, retorne uma string no formato:[source]-Item-[id] - Um método gerador de stream
fetchMultiple(int count)que retorna umStream<String>. Isso deve produzir (yield) itens para IDs de 1 atécount(inclusive), usando seu métodofetchItempara cada um (aguarde cada busca antes de produzir o resultado)
- Um campo
main.dart: Importe seu buscador de dados e demonstre todos os três padrões assíncronos trabalhando juntos:- Imprima
'Connecting to data source...' - Use a fábrica assíncrona para se conectar a uma fonte chamada
'CloudDB' - Imprima
'Connected to ${fetcher.source}'usando o campo source do buscador - Imprima uma linha vazia
- Imprima
'Fetching single item:' - Busque e imprima o item com ID
42 - Imprima uma linha vazia
- Imprima
'Fetching multiple items:' - Use
await forpara iterar através defetchMultiple(3)e imprimir cada item - Imprima uma linha vazia
- Imprima
'All operations complete!'
- Imprima
Este desafio combina o padrão de fábrica assíncrona estática para inicialização, métodos assíncronos regulares para operações únicas e async* com yield para streaming de múltiplos resultados. Observe como o método de stream pode chamar outros métodos assíncronos internamente!
Saída esperada:
Connecting to data source...
Connected to CloudDB
Fetching single item:
CloudDB-Item-42
Fetching multiple items:
CloudDB-Item-1
CloudDB-Item-2
CloudDB-Item-3
All operations complete!Experimente você mesmo
import 'data_fetcher.dart';
void main() async {
// TODO: Imprima 'Connecting to data source...'
// TODO: Use a factory assíncrona para se conectar a uma fonte chamada 'CloudDB'
// TODO: Imprima 'Connected to [source]' usando o campo source do fetcher
// TODO: Imprima uma linha vazia
// TODO: Imprima 'Fetching single item:'
// TODO: Busque e imprima o item com ID 42
// TODO: Imprima uma linha vazia
// TODO: Imprima 'Fetching multiple items:'
// TODO: Use 'await for' para iterar por fetchMultiple(3) e imprimir cada item
// TODO: Imprima uma linha vazia
// TODO: Imprima 'All operations complete!'
}
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos ExternosBibliotecas e ImportaçõesIntrodução à POOClasses vs ObjetosA Palavra-chave thisMétodosVariáveis de InstânciaFundamentos de ConstrutoresRecapitulação - Calculadora Simples4Null Safety
Introdução ao Null SafetyNullable vs Non-NullableOs Operadores ? e !Palavra-chave Late e Null SafetyOperadores Null-AwareNull Safety em ClassesRecapitulação - Sistema de Perfil de Usuário7Classes Abstratas e Interfaces
Classes AbstratasMétodos AbstratosInterfaces em DartInterfaces ImplícitasImplementando vs EstendendoMúltiplas InterfacesRecapitulação - Calculadora de Formas10Coleções e Generics
Visão Geral de List, Set e MapColeções Type-SafeClasses GenéricasMétodos GenéricosRestrições de GenericsIterable e IteratorRecapitulação - Armazenamento Genérico13Conceitos Avançados de POO
Composição vs HerançaMétodos de ExtensãoClasses ChamáveisClasses Seladas (Dart 3)Records (Dart 3)Patterns & Matching (3.0)Enums com Métodos16Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses Livro e Usuário2Construtores em Dart
Construtor PadrãoConstrutores NomeadosListas de InicializaçãoConstrutores ConstantesConstrutores FactoryConstrutores de RedirecionamentoRecapitulação - Shape Builder5Encapsulamento
Membros Públicos vs PrivadosA Convenção do Prefixo _Privacidade em Nível de BibliotecaAprofundamento em Getters & SettersOcultação de InformaçãoRecapitulação - Registros de Estudantes8Mixins
Introdução aos MixinsCriando MixinsUsando Múltiplos MixinsPalavra-chave on em MixinsMixin vs HerançaMixin vs InterfaceRecapitulação - Sistema Animal11Métodos Especiais
Sobrescrita de toString()Sobrescrita de hashCode & ==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 & ConstVariáveis LateMétodos e Campos EstáticosGetters e SettersRecapitulação - Gerenciador de Conta Bancária6Herança
Herança BásicaA Palavra-chave superSobrescrita de MétodoA Anotação @overrideA Palavra-chave final para ClassesConstrutores e HerançaRecapitulação - Hierarquia de Funcionários9Polimorfismo
Fundamentos do PolimorfismoPolimorfismo via InterfacesVerificação de Tipos em Tempo de ExecuçãoOs Operadores is & asPalavra-chave CovariantRecapitulação - Processador de Pagamentos12POO Assíncrona
Futures e async/awaitFundamentos de StreamsStream ControllersConstrutores AssíncronosAsync em Métodos de ClasseRecapitulação - Data Fetcher15Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Repository