Recapitulação — Buscador de dados
Parte da seção Programação Orientada a Objetos do Journey de Dart da Coddy. Lição 81 de 110.
Desafio
FácilVamos criar uma classe DataFetcher que reúne todos os conceitos de OOP assíncrada deste capítulo! Você criará um serviço de dados que usa inicialização assíncrona, métodos assíncronos para buscar itens individuais e um fluxo para fornecer vários 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
Stringfinal chamadosourceque armazena de onde vêm os dados - 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 como 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 fluxo
fetchMultiple(int count)que retorna umStream<String>. Ele deve produzir itens para IDs de 1 até, inclusive,count, usando seu métodofetchItempara cada um deles (aguarde cada busca antes de produzir o item)
- Um campo
main.dart: importe seu buscador de dados e demonstre os três padrões assíncronos funcionando juntos:- Imprima
Connecting to data source... - Use a fábrica assíncrona para conectar-se a uma fonte chamada
CloudDB - Imprima
Connected to [source]usando o campo de fonte do buscador - Imprima uma linha vazia
- Imprima
Fetching single item: - Busque e imprima o item com o ID
42 - Imprima uma linha vazia
- Imprima
Fetching multiple items: - Use
await forpara iterar porfetchMultiple(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 individuais e async* com yield para transmitir vários resultados. Observe como o método do fluxo 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 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