Master Clean Architecture em Flutter para iniciantes | Rahul Agarwal | Skillshare
Pesquisar

Velocidade de reprodução


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Master Clean Architecture em Flutter para iniciantes

teacher avatar Rahul Agarwal, Flutter Developer & Trainer

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Aulas neste curso

    • 1.

      INTRODUÇÃO DO CURSO

      0:53

    • 2.

      Visão geral da arquitetura limpa

      8:14

    • 3.

      UI

      45:36

    • 4.

      Entidades

      5:35

    • 5.

      Pacote de localizador de serviços

      5:52

    • 6.

      Usecases e repositórios

      8:42

    • 7.

      Modelos

      12:08

    • 8.

      Fontes de dados e repositórios

      16:03

    • 9.

      serviços

      17:57

    • 10.

      Bloc com visão geral de gerenciamento de estado do Cubit

      9:32

    • 11.

      Implementação de Bloc e Cubit em App

      33:28

    • 12.

      Teste de modularidade de arquitetura limpa

      7:00

  • --
  • Nível iniciante
  • Nível intermediário
  • Nível avançado
  • Todos os níveis

Gerado pela comunidade

O nível é determinado pela opinião da maioria dos estudantes que avaliaram este curso. Mostramos a recomendação do professor até que sejam coletadas as respostas de pelo menos 5 estudantes.

161

Estudantes

--

Projeto

Sobre este curso

A arquitetura limpa é o modelo de um sistema modular, que segue estritamente o princípio de design chamado separação de preocupações. Mais especificamente, este estilo de arquitetura centra-se na divisão de software em camadas, para simplificar o desenvolvimento e manutenção do próprio sistema. Quando as camadas estão bem separadas, peças individuais podem ser reutilizadas, bem como desenvolvidas e atualizadas de forma independente.

Neste curso, você vai fazer uma aplicação inteira do zero usando Arquitetura Limpa e gerenciamento de estado de Bloc e Cubit. Você também vai incorporar a API REST usando dois pacotes diferentes Http e Dio. E você vai aprender sobre a injeção de dependência e como tornar isso simples usando o pacote get_it. Você vai aprender sobre a estrutura de arquivos de uma aplicação do mundo real e como tornar seu código escalável e modular.

A arquitetura limpa dividirá o projeto Flutter em 3 camadas principais, nomeadamente:

Camada de apresentação

A camada de apresentação consiste no código para acessar os dados do aplicativo a partir de um repositório. Além disso, há o código para gerenciamento de estado, como provedores, BLOC e assim por diante.

Camada de domínio

A camada de domínio é a mais profunda na arquitetura limpa. Esta camada contém o código para aplicações de lógica de negócios, como entidades e casos de uso.

Camada de dados

A camada de dados está localizada na camada ultraperiférica. Esta camada consiste em código fonte de dados, como consumir APIs de descanso, acesso ao banco de dados local, Firebase ou outras fontes. Além disso, nesta camada, geralmente há o código de plataforma que constrói a IU (widgets).

Conheça seu professor

Teacher Profile Image

Rahul Agarwal

Flutter Developer & Trainer

Professor

Hello, I'm Rahul. I am skilled in building cross platform application using Flutter. I am freelance developer as well as conduct workshops to share my knowledge with the community.

Visualizar o perfil completo

Level: Intermediate

Nota do curso

As expectativas foram atingidas?
    Superou!
  • 0%
  • Sim
  • 0%
  • Um pouco
  • 0%
  • Não
  • 0%

Por que fazer parte da Skillshare?

Faça cursos premiados Skillshare Original

Cada curso possui aulas curtas e projetos práticos

Sua assinatura apoia os professores da Skillshare

Aprenda em qualquer lugar

Faça cursos em qualquer lugar com o aplicativo da Skillshare. Assista no avião, no metrô ou em qualquer lugar que funcione melhor para você, por streaming ou download.

Transcrições

1. INTRODUÇÃO DO CURSO: Um para criar um aplicativo do mundo real usando arquitetura adequada, separando a lógica de negócios e o quadro branco. Então este curso é perfeito para você. Neste curso, você criará um aplicativo inteiro do zero usando arquitetura limpa com gerenciamento de bloco e estado cúbico. Você também incorporará a API rest em seu aplicativo usando dois pacotes diferentes, HTTP. E você também aprenderá sobre injeção de dependência usando o pacote getters. E o mais importante, você aprenderá como separar seu telefone em três camadas diferentes, camadas dados, domínio e apresentação e criar seu módulo. Meu nome é. E neste curso, seu instrutor será enganado a seco. Espero que você goste. Então, sem perder mais tempo, inscreva-se agora e vamos começar. 2. Visão geral da arquitetura limpa: Bem-vindo ao primeiro vídeo do nosso curso que está agitado em arquitetura. Neste vídeo, aprenderemos sobre arquiteturas limpas. Portanto, antes de entrar na arquitetura limpa, precisamos saber por que usar a arquitetura em primeiro lugar. Se você tem um aplicativo de pequena ou média escala, digamos um aplicativo em que você precisa apertar alguns botões. E na interface do usuário, haverá alguma imagem exibida ou algum texto de exibição. Então você não precisa de uma arquitetura, pois é um ato muito simples. E incorporar uma arquitetura nesse tipo de aplicativo será um processo demorado. Mas digamos que você tenha um aplicativo muito grande, onde não apenas você, mas muitos outros desenvolvedores estão trabalhando no mesmo projeto. Por exemplo, digamos que você esteja criando aplicativos muito grandes como o Uber ou um aplicativo muito grande. Zomato, aquela coisa. Não só você, mas muitos outros desenvolvedores estão trabalhando em um único projeto. Dessa vez, ter uma arquitetura adequada não só ajuda a acelerar o desenvolvimento, mas também ajuda a padronizar um padrão de design em toda a equipe de desenvolvimento de aplicativos. Além disso, ter uma arquitetura estruturada muito adequada nos ajuda a modularizar o código. Aí vem uma bela parte da arquitetura limpa. A arquitetura limpa ajuda os desenvolvedores de aplicativos a modularizar o código. O que quero dizer com modularização? Modularizar o código significa ter seções separadas para cada conjunto independente. Agora, se você quiser mudar, por exemplo, há um serviço de back-end que você está usando, digamos que dispare isso. E, posteriormente, você deseja alterá-lo para um back-end personalizado e, em seguida, modularizar a arquitetura. Você pode fazer isso com muita facilidade sem afetar outras camadas. Além disso, se você estiver usando, digamos, um pacote que está funcionando bem por enquanto. Mas mais tarde, você deseja alterar o pacote para um pacote diferente para facilitar seu uso, Andy, para a melhoria do aplicativo que você tem, você pode usar essa arquitetura modularizada para altere facilmente alguns arquivos. E então você pode executar novamente o aplicativo como estava. Agora, como sabemos agora, essa arquitetura é necessária no caso de fazer aplicativos de médio ou grande porte. Então, por que devemos escolher uma arquitetura limpa? Há muito mais opções de arquitetura, como MVVM, MDD. Veja, por que devemos usar o Clean Architect? Bem, para entender isso, precisamos conhecer a estrutura fundamental básica da arquitetura limpa. A arquitetura limpa separa o código em três camadas diferentes. Uma é a camada de apresentação, segunda é a camada de domínio. O terceiro são os dados. camada de apresentação consiste na interface do usuário e na lógica da apresentação. A lógica da apresentação é a gestão do estado. Por exemplo, gerenciamento estadual, como bloco, bloco com côvado, provedor, febre, maconha, GetX e assim por diante. A camada de domínio é mais fina, onde nossa principal lógica de negócios do aplicativo conterá. A camada de domínio consiste em três seções. A seção de entidades, a seção de casos de uso e os repositórios contratam tal. Agora vamos entender um pouco sobre cada uma dessas seções. A entidade faz parte, contém os objetos que usaremos para mostrar os dados em nossa interface do usuário. Os casos de uso conterão a lógica principal, por exemplo, validação de senha e validação de e-mail. E o contrato de repositórios contém o contrato ou a classe abstrata de onde obteremos os dados. Agora, a camada de dados é a camada de onde obteremos os dados de fontes externas, como APIs ou bancos de dados, ou mesmo ou falso. camada de dados consiste em três seções. Repositórios, implementação, onde implementaremos os repositórios que estavam no contrato de repositórios. Onde também está a seção do modelo e as fontes de dados. Nada de modelos se estenderá das entidades. As fontes anti-dados buscarão os dados de APIs ou bancos de dados ou até mesmo de nosso pessoal. Agora, como éramos antes, essa arquitetura limpa ajuda a modularizar o código. Isso também significa que cada seção é uma seção independente, a camada de apresentação, B, camada de domínio e os dados são todos independentes entre si. Portanto, se mudarmos algo na camada de dados, isso não deve afetar a camada de apresentação. É camada de domínio. Da mesma forma, se mudarmos algo na apresentação, isso não deve afetar a camada de domínio e os dados lá. Agora, como nosso aplicativo está tendo camadas separadas para a interface do usuário e a lógica, ele também ajuda no teste do código. Escrevendo testes unitários para o, especificamente para a lógica. E o widget de escrita para DUIs será feito com muita facilidade. Antes de entrar na parte de codificação deste curso, vamos primeiro ver o que realmente fará para aprender a arquitetura limpa. Então, faremos este aplicativo que mostra novidades. E usaremos uma notícia ou API, que é uma API de código aberto. Agora, quando clicarmos nesta notícia, uma nova página será aberta onde podemos ver o resto das necessidades. Além disso, podemos pesquisar algumas novidades, digamos, eu realmente não mostrei as notícias que são pesquisadas. Agora vamos criar um novo aplicativo. Vou nomear o aplicativo de notícias do aplicativo, certo? E abriremos o aplicativo no código VS. Ok. Agora vamos ver a estrutura do arquivo. Primeiro, teremos uma pasta chamada features. No aplicativo que mostramos. Só há um recurso que está exibindo as notícias, certo? Portanto, o novo recurso dentro desse recurso de notícias do programa terá três seções. Primeiro, seção de apresentação. A segunda é a seção de domínio. O terceiro é a coleta de dados. Agora, além dos recursos, também terá um arquivo principal. Agora, o conteúdo do arquivo principal não será usado apenas em um ou dois recursos, mas em todo o candidato deve. Uma pasta será constante. Outra pasta será fracassos e os sucessos chegarão a essa parte mais tarde no curso. Outro serão os serviços. Esses são serviços externos que usaremos todos, digamos, pacotes. Então, essa é a estrutura básica de pastas. No próximo vídeo, começaremos com a interface do usuário do aplicativo. Então, obrigado por assistir. Nos vemos na próxima. 4. Entidades: Bem-vindo ao terceiro vídeo da nossa série de arquitetura flutter clean, onde estamos criando um aplicativo inteiro usando a arquitetura limpa. Neste vídeo, vamos percorrer a camada de domínio. E na camada de domínio, como vimos, temos três seções. Entidades, casos de uso e repositório são contratos. Então, neste vídeo, vamos dar uma olhada na parte das DTNs. Portanto, antes de pular para o código, vamos ver exatamente quais são os dados sobre os quais criaremos a entidade. Assim, podemos obter os dados em news api.org. Então, se você for para news api.org, lá você pode obter a documentação, fará login e obterá a chave da API mais tarde na seção de dados. Mas, por enquanto, vamos ver em que tipo de dados estaremos trabalhando. Então vá para documentos, documentação e clique em tudo. Portanto, essa é uma API, e essa API nos fornece, sempre que fazemos uma solicitação get, essa API nos fornece dados json. Será necessário o nome do autor, o título, o autor é um formato de string. Como você pode ver, o titin também está em formato de string. E também precisamos do URL da imagem, resulta em formato de string. E publicado em também está em formato de string. Esta é a data e a hora. O conteúdo também está em formato de string. Ok, agora vamos fazer nossa entidade. Então, vamos para a seção Recursos. E dentro da seção de domínio, criaremos uma nova pasta chamada entities. Dentro das entidades fará uma nova entidade chamada News info dot, dot fará uma classe conhecida como news info. E primeiro terá uma sequência de títulos. O segundo será uma sequência de alterações. terceiro será uma sequência de imagens que você adicionou antes será uma sequência de conteúdo. E o quinto seria o tipo de estática pública. Agora, vamos adicionar tudo dentro do nosso construtor. Agora, exceto data e hora. Tudo pode ser anulável. Por exemplo, um artigo de notícias pode ter um título ou, às vezes, até mesmo não ter um título. Normalmente, todos os tipos de notícias para cada artigo de notícias devem ter um título, mas pode haver algum erro no banco de dados, talvez na parte de trás da pessoa que está escrevendo o artigo de notícias possa ter esqueci de adicionar o título. Portanto, temos que considerar esses casos extremos. Então, precisamos tornar o título anulável. Além disso, o autor também pode ser anulável para que também imageUrl possa ou não estar presente. Para que também o conteúdo também possa ou não estar presente. Para que também nos seja dado, mas a data e hora será preservada porque sempre que uma notícia é publicada, ela tem que estar presente. Então, além disso, além da data e hora, não precisamos fazer mais nada necessário. A palavra-chave necessária significa que sempre que estamos ligando para as informações de notícias, precisamos adicionar a data e hora. Agora, quais são exatamente os tipos anuláveis? Por exemplo, se tivermos uma string de, digamos nome, e eu dou um nome de RAM aqui. Estamos dizendo especificamente às trevas lá. A variável name está usando um tipo de dados de string e o valor da variável name sempre será uma string e nunca poderá ser variável nula. Mas se a atribuirmos como string com um ponto de interrogação , estaremos dizendo ao dark que a variável name pode ser uma string ou pode ser none. Por exemplo, o nome também pode não ser. Isso também funcionará. Então, terminamos com a entidade que faz parte do nosso aplicativo. No próximo vídeo, aprenderemos sobre um pacote muito importante que usaremos, que é o localizador de serviços ou o pacote get it. Então, obrigado por assistir a este vídeo. Vejo você na próxima. 5. Pacote de localizador de serviços: Olá e bem-vindo ao quarto vídeo da série flutter clean architecture, onde estamos criando um aplicativo inteiro usando arquitetura limpa. Neste vídeo, aprenderemos sobre um pacote muito importante chamado pacote get it. Agora, o que esse pacote get it nos ajuda a encaixar antes saber que precisamos saber o que exatamente é injeção de dependência. Então, o que exatamente é injeção de dependência? Vamos ver um exemplo. Então, faremos um novo arquivo. Você não precisa criar esse arquivo. Este arquivo será apenas para este vídeo. Pode ser o exemplo DIE ponto, ponto. E aqui estamos importando nosso pacote de material dot dot. E faremos alguns widgets da lista de pulos. Vamos primeiro fazer isso, depois eu explico. Ok. Então, como você pode ver, este é um botão fictício, que leva um botão elevado. E você pode ver que nossa caixa fictícia depende do nosso botão fictício. Além disso. Podemos ver que temos um botão fictício, que é um botão elevado. Temos uma caixa fictícia, que depende do botão de determinação. Temos um cartão fictício, que depende da caixa fictícia, que é novamente dependente do botão fictício. E temos nossa página fictícia, que depende do cartão fictício, que depende da caixa fictícia e que depende do botão fictício. Agora, se tivermos, digamos uma classe de informações de botão que armazena as informações do botão. Por exemplo, digamos x aqui. E se quisermos passar isso aqui, para que possamos usar este aqui. Então, agora precisamos passar essas informações de botão em todos esses widgets. Vamos ver como passamos em nosso botão fictício na íntegra, em nossa caixa fictícia. Agora, precisamos passar as informações do botão em nossos cartões fictícios para que possamos usá-lo em nossa caixa fictícia. Agora, como estamos usando as informações do botão em nosso cartão fictício, também precisamos passá-lo em nossa página fictícia. Então vimos que estamos usando apenas informações do botão em nosso botão fictício. Mas como tudo isso é dependente, precisamos passar as informações do botão no topo. Então, para evitar esse problema, vem D, pegue o pacote. Agora, para acessar isso, também precisamos chamar especificamente nossa função de serviços de configuração no arquivo ponto ponto principal. Então, para fazer isso, primeiro, precisamos dar sua primeira ligação de fator que garanta a inicialização. O que este faz é inicializar as coisas necessárias para que as plataformas nativas necessárias em nosso iOS e Android sejam construídas antes de executar qualquer coisa no aplicativo. Agora vamos ligar para os serviços de configuração e agora terminamos. Então foi isso para este vídeo. No próximo vídeo, usaremos o pacote get it na parte Casos de uso e repositórios. E também precisamos do localizador de serviços, por enquanto você pode excluí-lo, criaremos isso no próximo vídeo. Então, obrigado por assistir. Vejo você na próxima. 6. Usecases e repositórios: Olá e bem-vindo ao quinto vídeo do nosso curso de arquitetura flutter clean, onde estamos construindo um aplicativo inteiro usando a arquitetura flutter clean. No vídeo de hoje, aprenderemos sobre casos de uso e repolarização e repositórios na seção de domínio. Então, vamos para nossos recursos. E dentro do domínio, vamos criar uma nova pasta chamada casos de uso. E vamos criar outra pasta chamada Repositórios. Dentro dos casos de uso, faremos um novo arquivo chamado fetch News. Ponto. O Dot criará uma nova classe chamada Fetch news. E dentro da turma, escreveremos uma função chamada buscar notícias. Antes disso, gostaria de falar sobre um pacote chamado pacote de pontos. Vamos primeiro ver que o pacote de pontos brancos será necessário. Vamos para pop dot diff e pesquisar por pontos. Vamos importar esse pacote em nosso projeto. Vamos para um arquivo YAML de ponto de especificação de pub. Agora, geralmente quando estamos buscando algo ou obtendo algo ou de uma função, geralmente podemos retornar apenas um único tipo de dados. Por exemplo, se tivermos um futuro de informações de notícias e eu estou dizendo para buscar notícias. Portanto, essa função só pode retornar informações de notícias. Mas pode haver um caso em que, do nosso back-end, não estamos recebendo algumas notícias e por aí, mas estamos recebendo um erro. Então, dessa vez, o que queremos fazer não é devolver as notícias na íntegra, mas retornar um fracasso. Como podemos fazer isso? Podemos fazer isso usando pontos. Então, vamos importar os pontos primeiro. E usando isso começa, podemos fazer é criar um qualquer um. Com qualquer um, podemos retornar aos tipos de dados. Digamos que um seja int e o outro seja string. Agora, o que realmente queremos retornar é um fracasso. E há uma lista de informações de notícias. Agora, vamos criar essa classe de falha. E a falha será usada em todo o nosso aplicativo. Então, para isso, precisamos criá-lo no código. Já criamos um arquivo chamado fracassos e sucessos. Aqui dentro, criaremos um novo arquivo chamado failures dot, dot. Criamos uma classe abstrata. Fracasso. Haverá uma mensagem de string que conterá a mensagem de falha, se houver alguma. Agora vamos criar uma nova falha chamada Fetch. Buscar vídeo, o que estenderá a falha. E aqui dentro faremos um construtor constante. Qual falha? E já que estamos estendendo a falha, precisamos passar a mensagem neste super. Então, agora podemos voltar, podemos excluir este. Agora podemos retornar a falha de busca aqui. Se importarmos o Phineas. Ok? Agora, essa é a camada de domínio. Não queremos escrever nenhum negócio, nenhuma lógica de dados dentro do nosso domínio. O domínio deve consistir apenas na lógica de negócios, como senha, validação, validação de e-mail, etc. etc. Então, para isso, para conectar a camada de dados com a camada de domínio, precisamos usar repositórios. Agora, como podemos usar isso? Vamos aos nossos repositórios e criar uma nova república. Em primeiro lugar, precisamos mudar o nome das notícias falsas. Notícias falsas. Casos de uso, caso de uso, para que possamos segregar que é um caso de uso. Agora, dentro de nossos repositórios, criaremos um novo arquivo chamado Fetch repo contract dot, dot. Agora, como isso é um contrato, isso será apenas uma aula abstrata. O que queremos dizer com classe abstrata? Por exemplo, você está dirigindo um carro. Você está girando o volante, volante na direção esquerda. O carro está indo na direção esquerda. Você está olhando na direção certa, o carro está indo na direção certa. Você sabe que ao dirigir o volante, o carro vai para a esquerda ou para a direita. Mas você sabe o que faz o funcionamento interno do intestino que você não conhece? Então, as aulas abstratas são exatamente assim. Isso nos dará funções que farão o trabalho. Mas não precisamos saber o que exatamente, como exatamente é a função, o trabalho feito na função criará uma classe abstrata fora do ventrículo de busca. Aqui teremos uma função de falha futura. Mas vamos parar com o novo ZoomInfo. Não. Podemos acessar nossos casos de uso e importar o Fed. Devo colocar aqui? Tudo bem, vou chamar o pólo vegetal aqui. Agora. Agora podemos simplesmente devolver as notícias fetch repo dot fetch aqui. Então, terminamos nosso caso de uso. E o que estamos fazendo com nosso repositório. Mas também estamos tendo um recurso de pesquisa aqui. Então, apenas ter as notícias do PECC não funcionará. Também precisamos cor-de-rosa para a funcionalidade de pesquisa. Por exemplo, sempre que você estiver pesquisando algum texto, naquela vez que ele entrou, o que precisamos é retornar, procuramos textos, notícias aqui. Então, para fazer isso, também precisamos passar por outro campo chamado texto de pesquisa. Agora, isso pode ser nulo. Nós pesquisamos texto pode ser feito quando é nulo, só mostrará as notícias normais. E quando o texto da pesquisa não for nulo, esse horário mostrará as notícias da pesquisa. Agora também precisamos adicioná-lo em nossos casos de uso. Aqui também adicionaremos uma sequência de texto de pesquisa. Ok? Agora terminamos. No próximo vídeo. Estaremos trabalhando nos dados lá. Então, obrigado por assistir. Vejo você na próxima. 7. Modelos: Olá e bem-vindo ao sexto vídeo da nossa série de arquitetura flutter clean, onde estamos criando um aplicativo inteiro usando a arquitetura limpa. Nesta seção, vamos iniciar a camada de dados. E dentro dos dados, começaremos com os modelos. Então, vamos primeiro criar uma pasta na pasta de dados, modelos de falha. Dentro dos modelos, vamos criar um novo modelo chamado News info model dot, dot. E vamos criar uma classe chamada News info model, que estenderá as informações de notícias. Agora, você precisa fazer um construtor de classe modal e ser super super função. Agora vamos ver o que a super função está pedindo. Pedir um DateTime é obrigatório. O nome do autor, o conteúdo, imagem que você detectou. Sabíamos que o título imageURL content e o autor são todos strings e o datetime, datetime time. Mas os dados que obteremos estarão no formato JSON. Tudo. Teremos um tipo de dados diferente. Então, vamos primeiro ver qual tipo de dados ficará feliz. Então, precisamos ir para news api.org, ir para a documentação. Dentro da documentação, vá para tudo. E vamos verificar qual é o tipo de dados de nossos dados que estamos obtendo de nossas notícias api.org. Apl é uma string, o que é bom. O título também é uma string, o que é bom. Você é o suficiente. A imagem também é uma string. Publicamos isso, que é o DateTime. Também está em string, o que é indesejável. Mas, para ser notável, o conteúdo também está no Street. Ok, agora sabemos quais tipos de dados estamos obtendo da nossa API. Então, vamos escrever aqui. Quando escrever. Primeiro, precisamos do título, depois do nome do autor, do URL da imagem, do conteúdo e dos dados. Dentro desse super você vai definir o título, título? Já que o título em nossas informações de notícias também é uma string que pode ser anulada. E aqui também o título é uma corda que é maleável. Então está tudo bem. E nosso autor dentro de nossas informações de notícias é uma string que é anulável. Aqui também está uma string que é anulável. Então, podemos simplesmente passar por isso. O URL da nossa imagem também é uma string que pode ser anulada. URL da imagem Hero, que é uma string que é anulável. Nós apenas passamos aqui. E nosso conteúdo também é o mesmo que você pode ver agora nossas informações de notícias, gesticulando, que é anulável e heróis, então é uma string. A data e hora, no entanto, dentro de nossas informações de notícias, é uma data e hora que não é anulável. Mas em nosso modelo de informações de notícias, nós o definimos para uma string que não está nivelada. O motivo é que os dados que estamos obtendo também são uma string. E esperamos que, em alguns casos, isso possa ser nulo, então precisamos cuidar disso. Então, o que podemos fazer aqui é criar uma função chamada Obter data, hora. No formato de data e hora. Estamos escrevendo uma função com. Então vamos remover a constante aqui. Vamos pegar uma função estática e que terá um tipo de retorno de datetime com o mesmo nome. E aqui também passaremos uma sequência de datetime, que nada mais é do que esta. Vamos passar por esse fluxo aqui. Agora. Em primeiro lugar, diremos que se o DateTime for igual a, igual a nulo, então não faça nada. Basta retornar uma data e hora do ponto de data e hora atual. Agora podemos obter a função datetime, datetime dot now atual . E se o DateTime não for nulo, o que fazer? Depois, há uma função muito útil da data que nos permite analisar a string para o tipo de dados datetime. Vamos ver como podemos fazer isso. Escreveremos pela última vez. Data e hora, formato de data e hora porque para tripés de pontos de data e hora, usando datetime. Agora, os tripés fazem. O que os tripés fazem é tentar converter a string date time, que é esta, em um tipo de dados datetime. Também aqui, podemos apenas dar um não anulável, o que significa que aqui a data e hora nunca pode ser nula. A razão é que já verificamos se a hora é nula, então retornaremos Ponto de tempo agora. Então, dentro do outro, a data e hora nunca pode ser nula. Então, podemos dar esse ponto de exclamação. E a mecânica diz especificamente que dentro do outro, a data e hora não será nula. Além disso, os tripés retornam a data e hora, mas que é anulável. Agora, por que é anulável? Se, digamos que ele tente analisar. Não precisamos fornecer especificamente o ponto de exclamação aqui, pois já estamos verificando se o DateTime não está aqui. Agora, por que a função de tripés de ponto datetime retorna uma data e hora que é anulável. O motivo é que os tripés tentam passar o formato datetime ou a string datetime para um tipo de dados datetime. Mas digamos que não consiga converter isso. Digamos que temos uma corda que é algo olá. Agora, este olá Não pode ser, este olá não pode ser convertido em uma data e hora. Datetime pode ser convertido, digamos que algo assim possa ser convertido, convertido em um datetime, mas hello não pode ser convertido. Então, o que acontece quando estamos nos dando alguns textos que não podem ser convertidos em uma data e hora, ele apenas retorna um valor nulo. Vamos mudar o olá para depender. Agora, se o formato datetime, datetime for igual a null, então também retornaremos o ponto datetime. Agora. Agora, isso significa que ele tentou analisar o datetime, que está em formato de string, para um datetime que está no formato datetime, mas não conseguiu. Então, essa é a razão pela qual estamos retornando a data e hora daquela hora presente. Mas se não for nulo, se DateTime não for nulo, queremos dizer que ele tem palavras analisadas. Se tiver, ele foi capaz de analisar os dados que estão em formato de string para Editar hora, que está no formato datetime. Então, dessa vez, não fazemos nada além de voltar. Ok, então este está pronto. Agora, precisamos criar outro método, que é um método muito útil. Estaremos criando um método de mapa de trombos. Vamos criar e depois explicarei. Agora, o que esse método faz é na primeira semana, que tipo de dados estamos obtendo. Aqui, estamos obtendo dados no formato JSON. Ou podemos dizer que está em um formato de mapa, que é uma string, que é o nosso t. E o valor é dinâmico, que significa que pode ser uma string. Pode ser, pode ser feito, pode ser qualquer coisa. Dinâmico significa que pode ser string, pode ser, pode ser qualquer tipo de dados ou política nula. Para converter este mapa em um museu para modelo, precisamos de uma função e essa função é de. Agora. Precisamos dizer isso especificamente como um fato. Agora, expliquei no vídeo do localizador de serviços, o que é uma fábrica e o que é um singleton? Singleton. Instância é um singleton onde estamos usando a mesma instância em todo o aplicativo. Mas em um método de fábrica. O que é feito é criar uma nova instância desse objeto sempre que estamos chamando. Então, quando, sempre que chamarmos um método from map em nosso aplicativo, dessa vez ele criará uma nova instância do modelo de informações de notícias. Digamos que estamos ligando do mapa cinco vezes em nosso aplicativo. Assim, cinco novas instâncias de notícias e para modem serão criadas. Mas se fosse um singleton , mesmo que seja lembrado de cinco vezes, ele criará apenas uma única instância. Ok? Agora também precisamos fornecer os dados aqui, que o título seja mapeado. E se pudermos ver aqui, só precisamos mapear esses valores aqui. O título aqui, podemos simplesmente copiá-lo aqui. E do mapa com o título, o autor será mapeado. E se verificarmos aqui, o autor é esse autor. Então, podemos copiar este e colá-lo aqui. O URL da imagem será o mapa e o URL da imagem. Url demais. Vamos copiar este e colá-lo aqui. O conteúdo é mapeado. Vamos conferir aqui. Este conteúdo e a data e hora que é publicado atuam com este tópico, este aqui. E agora terminamos as notícias em para model.fit do método map, que converte a string do mapa notícias bidirecionais dinâmicas. E para o Senhor. Então, obrigado por assistir a este vídeo. No próximo vídeo, vamos nos aprofundar na seção de fontes de dados e repositórios. Obrigado por assistir. Vejo você na próxima. 8. Fontes de dados e repositórios: Olá e bem-vindo ao sétimo vídeo de nossa série de arquitetura plana quando estamos fazendo um aplicativo inteiro usando arquitetura enxuta. Neste vídeo, falaremos sobre as fontes de dados e repositórios na seção de dados. Então, primeiro vamos ao nosso arquivo de dados e vamos criar uma nova pasta chamada Repositórios. Dentro dos repositórios criará um novo arquivo chamado Fetch report. No IMP, o que significa ponto de implementação, ponto fará uma nova classe chamada which report IMP, que implementará tal repo. Agora, também precisamos, já que estamos implementando o repositório fetch, que estava presente na camada de domínio. Portanto, precisamos substituir essa função dentro do IMP do repositório buscado. Para substituir, você simplesmente não pode fazer uma coisa. Clique aqui, pressione Controle e pontos e crie, e toque aqui, crie um sobrescrito ausente. Ele criará automaticamente a função. Agora, não queremos lançar um erro aqui, então vamos excluir isso. Dentro dessa função. Ligaremos para as fontes de dados. Então, antes disso, precisamos criar a fonte de dados. Então, vamos criar uma nova pasta dentro do arquivo de dados chamada fontes de dados. E dentro da fonte de dados criará um novo arquivo chamado de ds remoto. Ds significa nomes de fontes de dados do que o, como o nome diz, estamos buscando os dados da fonte de dados remota, que é uma API externa. Então, nós o chamamos de fetch de várias fontes. Vamos criar uma classe abstrata a partir de uma fonte de dados remota. Dentro da aula abstrata, teremos um futuro que retornará uma lista de informações de notícias. Modelo. O nome será buscar notícias. E também aqui incorporaremos a funcionalidade de pesquisa usando o texto de pesquisa. No último vídeo, expliquei se o texto da pesquisa era nulo, então as notícias normais quando visuais e reinicia textos não foram perdidas. Em seguida, as ferramentas de busca no bushel. Agora, dentro do uso de busca, o que precisamos fazer é chamar um serviço externo, como o serviço HTTP ou todo o serviço, usando o qual obteremos os dados de nossa API externa. Então, vamos fazer isso. Em primeiro lugar, publicaremos antes de criarmos um mapa dinâmico de cordas. Isso conterá os dados que nos são fornecidos pela API. Para fazer isso, precisamos fazer o serviço. Mas neste vídeo, não vamos fazer o serviço, então faremos apenas o contrato do serviço. Portanto, dentro da pasta principal, temos uma pasta de serviços de serviços. E dentro da pasta de serviços, criaremos um novo arquivo chamado HTTP, ou digamos, API que iniciamos desde que estamos obtendo os dados das APIs. Então, estamos escrevendo APIs. Se não for feito. Vamos criar esse serviço de API. Crie um serviço de API de classe abstrata. E dentro do serviço de API criará uma nova pasta. String futura Dynamic get data. Agora podemos chamar esse. Aqui. O que podemos fazer é criar o serviço de API. Como essa é uma classe abstrata, também precisamos implementá-la em uma classe separada. Vamos criar o copo. Proteção de vidro contra florescimento remoto que estou me dando até a condição que implementa do suporte remoto qual é a função? E aqui dentro, aplicamos provavelmente o serviço de API. Ok, agora chamamos o serviço de API, e aqui chamaremos a função get data em nossa superfície de API, certo? Não é extremo. Dinâmico é igual a dois. Ou podemos dizer que dados são iguais a talvez começar, ficar diferente. Também precisamos esperar aqui, pois isso retorna um futuro mapas e dinâmicos. E como estamos usando nossa cadeira, precisamos fazer essa função. Ok, então estamos obtendo os dados, mas quais dados realmente estamos obtendo, vamos para news api.org. documentação do Insight abordará todos os dados que estamos obtendo da API é um mapa. E dentro do mapa, quais são os dados reais que queremos são esses artigos. Esses artigos contêm uma lista de mapas. Então deixe-me primeiro codificar e depois eu vou. Então, dentro dos dados, obtendo uma lista, vamos chamá-la de lista de artigos. Podemos ver aqui que isso é, se assumirmos que tudo isso são os dados, então dentro dos dados, se obtivermos os artigos, os artigos conterão uma lista. Agora, esta é uma lista de mapas, mas os mapas dentro deste e a demanda no coração são um pouco diferentes. Então, para isso, o que podemos fazer é criar uma nova lista fora do mapa, string, lista dinâmica. Eu realmente não inicializei para uma lista vazia. E iteramos todos os itens dentro desta lista e convertemos cada item em uma dinâmica de string de mapa. Vamos fazer isso. Então, chamaríamos de mapa. Será igual à lista. E diremos que esse cara é tão dinâmico de mapas. Agora vamos adicionar esse mapa dentro da nossa lista de mapas. Mapa totalmente abastecido em. Ok. Agora, o que podemos fazer é criar uma nova lista de modelos de informações de notícias. Vamos inicializá-lo com uma lista vazia. E agora vamos percorrer todos os itens na lista de mapas. Vamos converter cada uma das listas de mapas cada um dos mapas dentro do mapa, este museu amanhã. Vamos fazer isso. Agora. Usaremos o método de mapa forte que criamos na seção do modelo. Vamos chamá-lo de perder Phil Martin do mapa. E o mapa será cada um dos itens dentro dos mapas D. Agora vamos adicionar o modelo newsvendor dentro da lista de notícias e depois retornar. Ok, feito aqui. Mas digamos que haja algum erro ocorrendo aqui. Digamos que nossa função get data mostre alguma exceção. Então, precisamos pegar essas exceções aqui. Então, o que podemos fazer é copiar todo esse código e colá-lo dentro de um bloco try catch. Então, se obtivermos algum erro, lançaremos uma exceção. A exceção pode ser qualquer extração. Mas o que realmente queremos fazer é criar exceções personalizadas. Então, para fazer isso, precisamos ir para fracassos e sucessos, fazer um novo arquivo chamado excepcional stark dark. E criaremos uma exceção personalizada. Essa exceção implementa exceção. Essa exceção aqui. Ele é uma vantagem dada pela escuridão e tem um construtor de fábrica. Então, como vimos nos fracassos, estávamos estendendo o fracasso, mas este, não podemos fazer isso aqui porque não podemos estender uma aula. Só temos um construtor de fábrica, então precisamos implementá-lo. Então, vamos criar a exceção de busca construída aqui. Ok? Agora podemos lançar essa exceção. Você pode escrever exceção. Vamos dar uma mensagem também para começar. E vamos abri-la. Portanto, terminamos com a função buscar notícias dentro nossa implementação de fonte de dados remota. Além disso. Vamos chamar essa função dentro do nosso repositório. Implementação Voltarei. Primeiro. Vamos começar a aula aqui. Mas da fonte de dados remota. Agora podemos usar esse aqui. Pesquisado. Diz que isso retorna um valor de futuras notícias da lista em formato que não pode ter um método, pois essa função o retorna, seja uma falha ou uma lista usando. Então, o que precisamos fazer é devolvê-lo assim, certo? Ok? Então, o que está acontecendo aqui? Estamos dizendo que, uma vez que a função fetch nice, return, retorna um futuro de falha ou lista de informações de notícias. Então, estamos dizendo que essa função retornará o lado direito do valor either, o que significa que o either tem dois valores, ou falha, todas essas coisas se movem para essa função, retornará o lado direito dos itens listados. Ok? Mas também vimos que as fontes de dados estão erradas aqui ou exceção aqui. Portanto, também precisamos capturar a exceção em nosso repositório. Então, podemos fazer isso tentando pegar o bloco. Mas também vimos que estamos lançando uma exceção personalizada da seção do projeto. Assim, podemos pegar a exceção do cliente na exceção de argumento de venda. E agora podemos lançar um fracasso também. Então, voltaremos à esquerda. Qual falha com uma mensagem E dot message. Este E nada mais é do que um objeto de exceção de busca. Também precisamos devolver a baixa de seus dados para essas notícias. Então, agora terminamos a implementação do repositório, terminamos com as fontes de dados. Vamos recapitular mais uma vez. Fizemos, implementamos o relatório de busca na aula de implementação de nível científico. Em seguida, examinamos as fontes de dados e criamos a fonte de dados para fazer o diagnóstico. Fizemos um resumo dos custos do serviço da API, que implementaremos no próximo vídeo. E então alteramos os tipos de dados a serem necessários. Tipos de dados da dinâmica da equipe do Maps para o museu para modelo e, em seguida, retornam as notícias ou três exceções de busca. E então, dentro do repositório, usamos outro bloco try-catch onde, se não houvesse erro, retornaríamos o direito da falha, que é lista, informações de notícias e todas as exceções. Detectaremos a exceção que foi retornada dentro de nossas fontes de dados. Aqui. Estamos pegando isso e depois retornando o lado esquerdo do, o que é uma falha, que é buscada. Então é isso para este vídeo. No próximo vídeo, vamos nos aprofundar nos serviços. Então, obrigado por assistir. Vejo você na próxima. 9. serviços: Olá e bem-vindo ao oitavo vídeo da série de arquitetura limpa Flutter, onde estamos criando um aplicativo inteiro usando uma arquitetura mais limpa. Neste vídeo, vamos falar sobre a parte de serviços. Então, primeiro, vamos para a seção de código. E dentro dos serviços, já criamos uma classe abstrata chamada API service, que nos dá o, que tem uma função, Get Data, que retorna uma futura cadeia de caracteres de mapa dinâmica. Então, vamos implementar a superfície da API aqui. Além disso, serviço de BI IMP. Imp são os termos de implementação que permanecerão se o serviço de BI. Agora vamos adicionar a função aqui e substituí-la. Aqui, usaremos um pacote e obteremos dados de nossa API externa. E o pacote se chama HTTP. Então, para isso, vamos prosseguir. E aqui escreveremos HTTP. Vamos pegar o pacote. Então, ao fazer isso, podemos copiar o nome do pacote. E aqui vamos basicamente empacotar dentro do vetor I look ups. Agora vamos importar o pacote em nosso serviço de API. E diremos que é importante HTTPS, HTP, HTTP. Podemos obter os dados do nosso HTTP e como da nossa API. E como podemos fazer isso é que existe uma função útil chamada HTTP GET. E nesta função get, obteremos os dados necessários da nossa API externa desta. Então, o que precisamos fazer é dar, vamos primeiro ver o que essa função get leva. A função get recebe um URI, como você pode ver aqui. E você obtém a função também usa cabeçalhos, mas também exigirá parâmetros de consulta. Como podemos ver. Esta é a API principal que fornecerá o q igual ao Bitcoin. chave API igual a F por meio de uma chave de API vai para o GPI. Mantenha isso em nossos parâmetros de consulta que também precisemos adicioná-lo aqui. Então, vamos ver como vamos fazer isso. Ok, então vamos primeiro adicionar o URL para isso. Precisamos fornecer o URL aqui, certo? URL de streaming, e nós o adicionaremos aqui também. Você também está, como você pode ver, que estamos precisando de parâmetros de consulta. Então, teremos outro mapa. Corda, dinâmica. Pais prontos. Precisamos adicioná-lo aqui. Ok? Agora, o URL não é um URL de string real, URI. Precisamos analisar a string, você a adiciona de qualquer maneira. Podemos fazer isso usando seus caminhos de pensamento. E para fornecer os parâmetros de consulta do Kusto, precisamos chamar uma função replace. E aqui podemos adicionar os parâmetros usando duas partículas gordurosas. Ok? Então, agora estamos obtendo os dados do nosso intestino. Vamos armazenar os dados em algum lugar. Para fazer isso, precisamos fazer a função em uma função sinc. E o resultado aqui, teríamos a resposta final igual a http.get. Vamos ver o que isso retorna. Ele retorna uma resposta. Escreva aqui. Ok, agora, se o código de status da resposta for igual a 200, isso significa que obtivemos sucesso, obtivemos com sucesso os dados da API. Então, agora podemos retornar os dados aqui, retornar o corpo da resposta. O corpo está, na verdade, em formato de string, que é Jason forward. Precisamos decodificar isso e transformá-lo em um formato de mapa. Uma vez que estamos retornando map string dynamic da função get. Então, no json dot decode certo, e aqui dentro, obteremos a resposta para o padrão, ok. Além disso, podemos escrever como resposta dinâmica Math String se o código de status não for 200. Isso significa que não conseguimos obter os dados da nossa API. Isso foi um problema. Houve algum problema de rede. Dessa vez, lançaremos uma exceção com alguma mensagem. Vamos ver. Status, status do ponto de resposta . Nós conversamos. Ok. Então, o que estamos fazendo aqui é obter os dados da nossa API usando um parâmetro de consulta personalizado. E se obtivermos os dados, dessa vez estaremos devolvendo-os em mapas em formato dinâmico. E se você não está recebendo o retorno, então, na verdade, somos uma exceção. Agora vamos examinar a seção de dados dentro nossas fontes de dados e dentro da busca da implementação remota da fonte de dados. Forneceremos o URL aqui e o parâmetro de consulta. Agora, para fazer isso, você precisa ir aqui e obter a chave da API pressionada no botão da tecla API do gate. Você precisa fornecer seu primeiro nome, seu endereço de e-mail e escolher uma senha. E enviado. Depois disso, você receberá a chave da API. Mas aqui vou apenas fazer login. Então, deixe-me entrar e eu mostrarei a você. Ok, eu tenho minha chave de API aqui. Acabei de copiar. Guarde-o em algum lugar seguro por enquanto, vamos criar uma nova pasta chamada strings start. Isso não é string, é strings. Cordas. E eu instalei a chave de API aqui com uma variável estática. Além disso. Eu ainda serei URLs também aqui. Então eu tenho um, tudo o que você adicionou, que é este. Eu copiaria este e a estequiometria. Ok. Agora vamos para nossa função de busca de notícias. Busque de dentro para fora de dados remotos para alguma limitação. E veja que esses URLs serão strings, API de pontos de tudo o que você é e por que o parâmetro de consulta será um mapa. E isso conterá cookies. Vamos verificar quais livros. Um deles será Q, o texto fonte. Se não tivermos uma espécie de passos, podemos simplesmente dar um texto concreto. Por exemplo, como linhas de cockpit. Ok, então o uso normal que teremos, será obtê-lo nas principais manchetes. Então, se copiarmos este e precisarmos colar o KPI da chave de API, você ainda não o fez. Todo o título que usaremos quando estivermos procurando por algumas notícias de todos os artigos. E as principais manchetes serão pesquisadas quando o, não houver texto dentro de nossa pesquisa. Ok? Então, o que podemos fazer isso, se o texto de pesquisa não for igual a nulo, esse tempo começa a partir de todos os artigos. Se nosso texto de pesquisa for igual a, igual a nulo, esse tempo começará a partir dos principais modelos. Este é o operador ternário, que estamos vendo que, se X for nulo, faça a primeira coisa após o ponto de interrogação. E se o texto de pesquisa não for igual a se start for nulo. Aquela coisa com a segunda coisa. Este é o operador ternário. Se o texto de pesquisa não for igual a nulo, faça a primeira coisa que está presente após o ponto de interrogação, que é strings, API tudo. E se o texto de pesquisa for igual, igual a nulo, então coloque o segundo, que talvez eu tenha falado longamente. Então, quando houver algumas dicas de pesquisa ao pesquisar algumas músicas do nosso tudo. E se não houver tais etapas , estamos apenas retornando o tópico. E dentro do nosso parâmetro de consulta cai. Então, escreveremos se o texto de pesquisa for igual, igual a nulo, dessa vez que não o fizermos, precisamos fornecer o país. Então, certo. Ao contrário da Índia. Ou podemos descobrir os EUA-Soviéticos. E se o texto de pesquisa não for igual a nulo, dessa vez, precisamos fornecer dentro ou tudo, se virmos, precisamos fornecer uma sugestão de que é o texto de pesquisa que ainda recebe Bitcoin, pode ser qualquer coisa. Então, escreveríamos cubo e será igual ao texto de pesquisa. E, independentemente disso, o texto fonte é nulo ou não, precisamos fornecer a chave da API, que é fornecida aqui também, que é fornecida aqui também, certo? Chave Api. A chave da API será exclusiva para cada usuário. E você precisa obtê-lo depois de fazer login ou se inscrever na música BI.com. Eu tenho meu rei do FBI e guardei nas cordas. Além disso. Então, vamos usar essa API Scott extrema. Ok, então implementamos nossos serviços dentro do arquivo ponto ponto do serviço da API. E usamos esse serviço em nosso arquivo de fontes de dados. Agora vem uma parte muito importante. Estamos chamando o serviço dentro do construído a partir da busca da fonte de dados remota. Em nosso vídeo do localizador de serviços, discutimos uma dica muito útil sobre como podemos registrar esses serviços em uma única função e chamá-los dentro do principal. E não precisamos nos preocupar em inicializar essas classes. Cada, vamos fazer. Primeiro, criaremos uma nova pasta chamada ou um novo arquivo dentro de nossa própria pasta chamada service. Serviços. Localize nossa escuridão escura. Aqui dentro importamos o pacote, escreveremos o final, pegamos. Sl. Sl significa que o localizador de serviço é igual a obter a instância. Faremos uma nova função chamada configurar serviços. Aqui registramos nossos serviços. O primeiro serviço que será registrado é o serviço de API, Justin Sterling. Todos os serviços são singletons. Então registra o serviço de API singleton. E aqui estaríamos fornecendo a implementação do serviço de API de cluster implementado. Registraremos bem as fontes de dados, então escreveríamos fetch from remote, ds. Do controle remoto, sim, eu sou. Agora podemos ver que está dizendo que existe um parâmetro aditivo k, então isso é necessário. Mas vamos para o nosso aqui. E agora podemos excluir este e obter o serviço de API de nossos serviços ESL localizados. É importante continuar. Podemos chamá-lo de serviço de API. E wallah. Não precisamos chamar o serviço de API dentro do nosso construtor. Podemos obtê-lo diretamente de um serviço. Maravilhoso. Vamos novamente para nossa pesquisa está localizado e registrado nosso repositório. Ligaremos para o relatório em lote. E registramos a implementação de ondulação de efeitos. Aqui também, não exigimos defeitos do corpo pois podemos obtê-lo de nosso serviço com qualquer um, Vamos entrar em nossa implementação de vegetais. Remova este e obtenha do nosso serviço ou melhor. Ok, ótimo. Agora, como temos relatórios adicionais de defeitos da implementação, também podemos acessar nossos casos de uso phi. Remova este e obtenha o repositório em nosso localizador de serviços. Agora, como discutimos em nosso vídeo do localizador de serviços, apenas dando a classe do localizador de serviços ou apenas escrevendo a função do localizador de serviços. Isso não vai funcionar. Precisamos de todas as funções dentro de p main.out fund. E para o, por chamar a função. Também precisamos dar a melhor inicialização do seguro vinculativo. Isso garantirá todas as coisas que eu inicializei antes de chamar a função na lacuna de Berlim. Agora vamos reconstruir a função que escrevemos muito bem. Vamos ver se tudo está funcionando bem ou não. Abrindo. Por enquanto, tudo está funcionando bem. Vamos recapitular o que fizemos. Implementamos nosso serviço de API aqui. Escrevemos os dados get usando o pacote HTTP. E nós também, nós também fizemos foi se o livro response.status é igual a 200, em seguida, retornar o corpo da resposta como uma resposta dinâmica máxima para o código do sitters não se opõe a 200, que significa que há algum erro ao obter os dados da API quando lançamos uma exceção. Então é isso para este vídeo. No próximo vídeo, vamos nos aprofundar na camada de apresentação. Então, obrigado por assistir. Vejo você na próxima. 10. Bloc com visão geral de gerenciamento de estado do Cubit: Olá e bem-vindo ao nono vídeo da nossa série de arquitetura flutter clean. Estamos criando um aplicativo inteiro usando arquitetura limpa. Neste vídeo, aprenderemos sobre a gestão do estado, que é bloqueada e cúbica. Neste vídeo, aprenderemos a gestão do estado usando um exemplo. E no próximo vídeo, implementaremos nossa gestão estadual dentro do nosso aplicativo. Portanto, antes de começar, precisamos adicionar dois pacotes. Um deles é o pacote de blocos. Vamos adicionar o pacote de blocos em nosso arquivo YAML de pontos específicos do Pub. E os outros pacotes flutuam bloco. Vamos adicionar o bloco de vibração também. Você também pode instalar uma extensão útil chamada block. Usando isso, você pode criar facilmente blocos em seu aplicativo. Deixe-me mostrar como. Basta ir para a pasta principal. Selecione a pasta onde você deseja criar o bloco ou o côvado. Aqui eu quero criar um novo côvado, então eu vou clicar no cubo e dar o nome. Digamos que eu vou nomear este em executado. Então eu posso ver que minha cúbica é, foi criada. Também nomearei esse côvado como texto sublinhado dois, mas agora também faremos uma nova página chamada texto DAG. Agora você não precisa criar a página de texto e detectar cúbico. Isso é apenas para mostrar um exemplo dentro do texto que vou importar um ponto material, ponto e um apátrida com ele. Página de texto. A página de texto conterá um andaime com nosso corpo. No centro. Ele terá um filho de botão elevado. O botão elevado assumirá pressionado. Vamos seguir, tenha uma função vazia aqui e uma criança deve ser texto. Ok? Agora vamos ao nosso texto para isso. Esta jarda cúbica é a cúbica real. E aqui estão as etapas. Vamos criar alguns novos estados. Esse é o estado inicial, que significa o estado que está presente quando o aplicativo está em execução. Se você for para o cubo, nós estamos, podemos ver que sempre que o cúbico foi criado, já estamos inicializando-o com o estado inicial. Então, dentro do nosso estado, faremos algumas notícias para novos estados. Um é o carregamento do texto e o outro é o texto. Dancei. Ok? Agora vamos criar uma nova função. Dentro da nossa função cúbica será mostrada uma nova função de texto. E nesta função, o que eu quero fazer é deixar-me primeiro ir para o nosso meio e mudar a página inicial para uma próxima página. O que eu realmente quero fazer é sempre que clico nesse botão, quero mostrar um indicador circular de progresso. E depois de algum tempo, eu quero mostrar aqui, preciso isso, que é, digamos, feito ou concluído. Vamos fazer isso. Então, inicialmente, vou emitir um novo estado, que é o estado de carregamento de texto. Depois de algum tempo, vamos esperar por 1 segundo. E depois de esperar 1 segundo, quero emitir o texto, dancei-o. Ok? Nossa função aqui está sendo feita. Vamos agora chamar essa função. Sempre que clicarmos no botão de clique, iremos para nossa página de texto. E aqui, em vez de pressionado, eu vou dar. Agora. Antes disso, também preciso importar os pacotes de blocos flutter. Em seguida, podemos chamar a função usando a leitura de ponto de contexto. E dentro de ler, vou nomear o côvado de onde vamos pegar a função ponto. Mostrar novo texto. Ok? Agora, o que eu quero fazer é criar um bloco aqui ou um construtor de blocos aqui. Então, em vez do texto, mostrarei uma vez o indicador circular de progresso e , em seguida, um texto que está dizendo que não. O que queremos mostrar em vez desse botão, quando clicamos no botão, queremos mostrar um indicador de progresso circular e depois alguma textura. Então, o que precisamos fazer é mudar o botão elevado, queremos um indicador de progresso circular e depois fazer isso. Vamos ver como vamos fazer isso. Vamos fazer isso usando um widget chamado construção de blocos. Então, vamos escrever aqui. Este construtor de blocos será de um côvado de texto. E o próximo estado dentro do construtor de blocos, chamaremos um construtor, o que exigirá duas coisas. Se virmos. Um é o contexto construído e o outro é o próximo estado. Então, vamos dar esses contextos e estados. Agora. Se o estado for fixo, inicial, não faça nada. E assim o botão, como era antes, se o estado estiver carregando texto, então não faça nada além de um indicador de progresso circular. Agora, se o texto for, se o estado não for texto inicial ou não estiver carregando texto, então se você for para o nosso texto e então ele tiver apenas um estado restante, esse é o texto em nosso else sempre será o texto downstate. Então, quando o estado for texto concluído, mostre um texto que é concluído. Agora, para usar o bloco, precisamos fornecer o bloco a um widget que é o pai dos textos com ele. Agora, se virmos que o pai da página de texto rejeitada é o widget do aplicativo de material. Portanto, precisamos fornecer nosso bloco, que é o texto úmido dentro de nossa métrica ou acima do widget de aplicativo de material. Então, como poderia fazer isso? Vamos ver. Vamos cortá-lo a partir daqui e usaremos um widget chamado bloco múltiplo. Fornecido. Aqui. Podemos ter vários fornecedores. Portanto, um provedor será um provedor de bloqueio. E vamos criá-lo usando um contexto, que retornará um côvado de texto. E a criança será nosso material agora. Ok? Agora, se reiniciarmos o nosso, vamos ver o que acontece. Ok? Assim, podemos ver que nosso botão está aqui. Vamos ver o que acontece quando clicamos nele. Clicamos no botão. Ele mostrou o indicador circular de progresso e, em seguida, os detalhes da empresa. Vamos fazer o atraso para quatro segundos e depois ver o aplicativo novamente. Ok? Assim, podemos ver quando clicamos no botão, o estado de carregamento do texto está sendo inicializado. E depois de quatro segundos, o texto no estado negativo foi inicializado. Então é assim que o bloco com cúbico funciona. Portanto, esse é o entendimento básico da gestão estadual que usaremos. No próximo vídeo, implementaremos a gestão estadual em nosso aplicativo, o que significa aplicativo Notícias. Então, obrigado por assistir e nos vemos no próximo. 11. Implementação de Bloc e Cubit em App: Olá e bem-vindo ao décimo vídeo de nossa arquitetura flutter clean que mostra onde estamos construindo um aplicativo inteiro usando a arquitetura pain. Neste vídeo, vamos incorporar nosso gerenciamento de estado de bloco e qubit em nosso aplicativo. Então, primeiro exclua os côvados de exemplo, que fizemos no vídeo anterior. Então, podemos fazer isso, tudo bem. Podemos excluir a página de texto. Agora. Este também fará isso. E em vez disso, forneceremos, forneceremos o côvado que será feito neste vídeo. E aqui estaremos escrevendo a página inicial. Em excluir as importações. Incrível. Vamos reiniciar o aplicativo. As crianças não podem estar vazias até agora, vamos apenas remover esse objeto. Ok? Agora faremos um novo Cupido. Iremos para a seção de apresentação e, dentro da pasta da apresentação, faremos uma nova chamada de côvado. Noticias. Então, como eu disse no último vídeo, você pode ter uma extensão muito útil chamada extensão de bloco, usando a qual você pode criar côvado facilmente, como você pode clicar com o botão direito aqui e criar um bloco de auditoria de côvado. Mas agora este é o côvado mais novo e o novo estado que chamarei de novo estúpido dobrado. Agora vamos para a nossa cúbica de notícias. Podemos ver que, por padrão, está tendo a etapa inicial das notícias. E dentro dos novos estados, temos um passo inicial de notícias. Teremos mais dois estados. O primeiro estado será notícia. Vamos pular para a inicial das notícias. O segundo estado será o carregamento de notícias, o terceiro estado será o editor de notícias. Agora, dentro da etapa inicial das notícias, teremos outra coisa chamada D, lista de informações de notícias. Portanto, nossa iniciativa de notícias conterá as notícias que serão exibidas aqui. Agora, nosso novo estado inicial conterá as notícias que serão exibidas aqui. Vamos colocar nosso analito inicial de notícias iniciaremos quando inicializarmos inicialmente as notícias com uma lista vazia. Vamos dar uma olhada na constante. E então escreveremos uma função chamada void fetch news function com o texto de pesquisa aqui. E então chamaremos nossa função a partir dos casos de uso, que é essa função fetch snooze função para que registrará esta dentro do nosso localizador de serviços. Então, digamos que registre isso. Caso de uso de nus esticados. Fetch sabe. Ok. Agora vamos para nossa nova habilidade, mas ponto ponto Phi. E aqui vamos receber o caso de uso do News da geladeira. Vamos importar a célula aqui. Esse é o localizador de serviços. E tudo bem, agora podemos usar esse objeto fetch News, use case dentro da nossa função fetch news. Então, vamos usar isso. Então, vamos escrever fetch News. Use o kickstart, busque notícias com o texto de pesquisa. Vamos ver o que isso está retornando. Está nos devolvendo um futuro, seja um fracasso ou uma notícia em uma lista de coisas. Então, vamos obter o resultado de que estamos usando await. Agora, estaremos obtendo apenas o quer depois da Terra. Então, vou escrever essas notícias finais. O resultado é igual a dois. E isso terá um tipo de dados de falha ou essa informação de notícias difíceis. Agora, temos o pacote tarts, que nos dá o tipo de dados, também nos dá uma função muito útil usando qual podemos segregar nossas coisas, o que faremos quando uma falha for obtida. E podemos segregar as coisas que faremos quando nossa lista de informações de notícias estivermos recebendo. Então, como podemos fazer isso? Podemos fazer isso usando a função completa que esquizo do DOD, certo? Obter resultado de notícias dot fold. E aqui podemos ver que existem duas funções. Uma é a função left que será invocada quando o resultado esquerdo for retornado. E uma função correta que será invocada quando o resultado correto for retornado. Portanto, se o resultado à esquerda tiver sido retornado, emitiremos o estado de erro de notícias. E se o direito tiver sido invocado, estará emitindo o estado inicial da notícia. Mas com as novidades. Uma vez que esta função retorna uma lista de informações de notícias quando o, quando não há erro. Portanto, este r também terá uma lista de museus para isso, L terá um fracasso. Ok? Agora, antes de fazer qualquer coisa, também precisamos emitir o estado de carregamento de notícias. Porque sempre que estamos buscando as notícias, primeiro ela mostrará a tela de carregamento e depois buscará as notícias. Depois de buscar as notícias, se houver uma falha, ela mostrará que o Dennett terá o estado de erro. E se não houver falha e a função tiver retornado a lista de informações de notícias , teremos o estado inicial da notícia com a música, com a lista de músicas para. Agora. Vamos usar essa função em nossa página inicial. Então, para isso, precisamos tornar nossa página inicial um widget com estado. Vamos fazer isso. E dentro da nossa página inicial, ele terá uma função init. Agora, a função init é uma função muito útil. Essa função só será chamada na primeira vez que a página for inicializada. Portanto, essa função só será chamada quando a página inicial for inicializada pela primeira vez. Também não éramos isso apenas quando a primeira vez que a página inicial, a nação inicializou, queremos chamar as notícias de busca ou essa função. Então, vamos fazer isso. Para isso, precisamos importar nosso pacote Better Block. E então escreveremos notícias de ponto de contexto, leitura, notícias, côvado, ponto fetch. E o texto da pesquisa será nulo. Como inicialmente, queremos apenas pesquisar os textos normais. Isso está nos dando um erro. A razão é que não fornecemos a cuveta de notícias em nosso ponto principal, ponto cinco. Então, vamos fazer isso. Nós até cortamos esse. Escreva um provedor de vários blocos aqui. Teremos alguns fornecedores ou uma lista de provedores. Podemos ter apenas uma lista de fornecedores ou até mesmo um único provedor. Estaremos criando um provedor de blocos. Por dentro do Create. Teremos uma função que retornará o novo desvio. E a criança será nosso material. Podemos importar a temperatura das notícias. Ok, agora terminamos. Vamos reconstruí-lo uma vez, reinicie o aplicativo. Ok? Agora podemos ver que nosso bloco está funcionando, mas precisamos fazer mais algumas alterações dentro da interface do usuário para que nosso bloco esteja conectado aos cúbicos. Então, sempre que houver uma mudança de estado, acordo com isso, a DUI também mudará. Então, para fazer isso, precisamos ir em nossa página inicial. Precisamos ir ao nosso ListView. Aqui dentro. Em vez do ListView fará um bloco de bloco. O construtor de blocos estará fora do côvado de notícias e do estado de notícias. Ele terá a função de construtor aqui, o que levará um contexto e o estado. Se o estado for notícia inicial, nada, mostre o ListView. E em vez da contagem de itens, agora usaremos o estado DOT. Comprimento do ponto de notícias, que estamos passando aqui. As novidades que são possivelmente, vamos mudar o nome dos movimentos R2. Ok? Portanto, as notícias que adicionarão passagem aqui dentro nosso novo estado inicial de notícias que estamos usando aqui. Portanto, sempre que o estado for novo veneziano, use as notícias fornecidas no estado inicial da notícia. Então, nós o escrevemos e eles simplesmente contam para reafirmar o comprimento do ponto da notícia. E tudo bem, por enquanto, que seja isso. E se o estado não for notícia inicial, se o estado estiver carregando notícias, dessa vez, ele retornará um centro com um indicador circular de progresso com uma cor de, digamos, se o estado não for notícia inicial, se o estado não for notícia e carregamento, então temos apenas mais um estado restante. Essa é a era das notícias. Dessa vez, o que podemos fazer é, por enquanto, mostraremos apenas um texto. Isso é um embrulho em uma frase. Ok, então terminamos com nosso construtor de blocos em nossa página inicial. Agora vamos para New scarred. O cartão de notícias é genérico para cada cartão de notícias. Esta é uma notícia geral Scott, que estamos mostrando em todos os cartões de notícias aqui. Mas precisamos ter informações específicas para cada jornal, que terá uma imagem única, um título exclusivo e assim por diante. Então, para fazer isso, precisamos passar as informações de notícias dentro de cada nova cicatriz. E de acordo com nossas novas informações, mudaremos a imagem ou a maré. Então, vamos fazer isso. Em vez deste URL, agora usaremos o URL da imagem do ponto de informações de notícias. Agora, à medida que acessamos nossas informações de notícias, podemos ver que o URL da imagem pode ser anulável. Podemos ver que isso é, isso pode ser o URL da imagem pode ser uma string ou pode ser feito. Também queremos verificar se o URL da imagem do ponto de informação de notícias não for igual a nulo, só então mostre a imagem. E também aqui podemos dar um sinal de explicação, que será especificamente durante isso, sim, se a imagem que você adicionou não for nula, então aqui também o adulto principal não pode ser nulo. Agora, aqui está o URL da imagem é nulo. Não mostre nada, apenas uma caixa de tamanho constante. Agora, vamos ao nosso título. Aqui. Mostrará o título do ponto de informação da notícia. Agora, aqui também podemos, sabemos que o título pode ser nulo ou uma string. Então, aqui também precisamos dizer que, se a notícia não for igual a nula, então o título do ponto de informação da notícia. E se for igual a mostrar um texto sem título. E precisamos remover a constante daqui e adicioná-las aqui. Desde antes, dissemos que a coisa toda era constante, mas agora isso não é constante. Ele mudará de acordo com as informações de notícias que você está passando. Agora. Também terminamos com nossa nova cicatriz. Vamos para a página de visualização de notícias. Aqui também, passaremos as informações de notícias. E agora o que precisamos fazer é definir nossa exibição de acordo com as informações de notícias que estamos recebendo. Então, primeiro de tudo, nós até mudamos o título para notícias no título do ponto da foto. Se não for igual a nulo, use as notícias na foto intitulada loose is given. E se for igual a nulo, não mostre nenhum título. Vamos remover a constante daqui e adicionar a constante por toda parte. Extrato. A imagem também mudará. Vamos alterá-lo para o URL da imagem do ponto de informações de notícias. E diremos que, se o URL da imagem do ponto de informação de notícias não for igual a nulo, use apenas o URL da imagem na rede de pontos de imagem. E se for igual a, igual a nulo, então tenha uma caixa de tamanho constante. Agora a dívida também temos que dar, vamos fazer uma função. Digamos que obtenha a data na data no formato DD, MILÍMETROS, AA. Esta é uma função que será criada, será constante a partir daqui. Vamos criar essa função foster. Esta função retornará null e escolherá uma data hora do nosso objeto news info. Então, o que retornaremos é datetime ponto d. Depois dessa barra, depois datetime ponto mês, depois uma barra, depois ponto datetime. Então, agora usando dados dentro da string, usando o cifrão e depois com chaves, isso é chamado de interpolação de string. Isso mostrará os dados dentro dessa string junto com a outra string que está presente aqui. Então, por exemplo, se você quiser mostrar o valor de 100 aqui, então alguma string. Você pode fazer assim. Vamos passar as informações de notícias dot datetime dentro nossos dados em uma função de formato DD MM AA. Então também precisamos dar o nome do autor aqui. Autor de notícias em food dot. O autor também pode ser nulo. Então, para isso, vamos verificar se o autor não é igual a nulo, então use apenas o ponto de informação de notícias de outra autoria, certo? Não. Autor. E o conteúdo também excluirá esse Lorem. texto Ipsum terá conteúdo de pontos de informações de notícias. O conteúdo também pode ser nulo. Portanto, se o conteúdo não for igual a nulo, use apenas o conteúdo. Outra coisa. Não mostre nenhuma rota local. Ok, acredito que terminamos com nossa página de visualização de notícias também. Vamos para nossa página inicial. E como adicionamos as informações de notícias aqui, precisamos adicioná-las em nossa página inicial, também dentro do nosso cartão de notícias. Também adicionamos as informações de notícias. Então, também dissemos que é parâmetro obrigatório, então precisamos adicioná-lo em nossa página inicial dentro do nosso cartão de notícias. Objeto. Vamos adicioná-lo. As informações das notícias são iguais às notícias do ponto do estado. Vamos remover a constante deles. Ok? Então, se vimos que o state dot news contém uma lista de informações de notícias. Assim, todas as informações de notícias que podemos obter usando notícias de ponto de estado com um índice. Agora, há boas notícias. Deus, estamos, podemos ver que temos um erro. O motivo é a página de visualização de notícias, precisamos fornecer as informações sobre as refeições. Então, terminamos aqui. Vamos reiniciar o aplicativo e cruzar os dedos. Deveria ser. Ok. Nosso indicador circular de progresso estava aparecendo e podemos ver que também podemos ver as notícias. Vamos abrir uma notícia. Tudo bem. Podemos ver que as notícias que estamos recebendo, a data, estamos recebendo os animais do autor, estamos recebendo o conteúdo também. Estamos conseguindo, estamos obtendo os otimistas do título. Vamos voltar e abrir outra notícia. Ok, aqui também, a mesma coisa. Ok. Agora, vamos verificar se nosso texto de pesquisa, o que está funcionando ou não. Pesquise na Apple. Nada está acontecendo com isso. O motivo é que não adicionamos nossa funcionalidade de pesquisa aqui. Então, vamos acrescentar isso. Precisamos ir à nossa apresentação dentro de nossas páginas. Precisamos ir para a página inicial. E dentro da nossa página inicial, precisamos adicionar um parâmetro on changed, que tomará a constante daqui. Vamos adicionar a constante nesses espaços. Agora, o que essa função onChange fará é sempre que estivermos mudando, vamos mudar o onchange para o próprio enviado. Então, sempre que, depois de escrever algo, digamos laranja. E depois disso, estamos enviando clicando neste botão. Estaremos pesquisando notícias relacionadas ao texto de pesquisa aqui, que é laranja e discutiremos. Então, vamos fazer isso. Como podemos fazer isso é chamando a nova função. Então, escreveremos contextos, ponto, leitura, notícias, côvado, notícias de busca de pontos, junto com os bastões de pesquisa que estamos dando aqui. E também precisamos especificar mais uma coisa. Mas vamos ver como está funcionando ou não. Vamos pesquisar uma moeda pequena. Ok, então nossa funcionalidade de pesquisa também está funcionando. Sempre que procuramos as notícias, era está nos mostrando algumas coisas boas. Vamos abrir as notícias. Ok, então isso está funcionando bem. Vamos pesquisar com outros nomes. Digamos que a Apple. O, The Apple News também é verdade. Vamos mergulhar em Mais um. Newton. Não é exatamente o Newton que você está esperando, mas tudo bem, vamos digitar no Google. Estamos pesquisando o mecanismo de pesquisa mais popular em nossa pesquisa. Mas vemos que nosso recurso de pesquisa também é o que. Mas se removermos todo o texto aqui e pressionarmos Enter, estamos recebendo um erro. Mas o que realmente deveria estar acontecendo é que, se não houver texto presente aqui, mostre o padrão. Portanto, também precisamos fazer isso se o ponto do texto de pesquisa for cortado. Aparar significa que mesmo que, mesmo que você tenha alguns, digamos espaços aqui, isso também será considerado como nada presente dentro de nossa parte de armazenamento. Então, introduzimos uma guarnição. Se nosso corte for igual, igual a nada, nenhum texto ou evitar texto. Dessa vez. Faça uma pesquisa e mostre os meios padrão. E as notícias padrão por padrão, quero dizer que o texto de pesquisa será nulo. E se não for esse o caso, então. Então, eles estão esticados. Vamos agora verificar se não há textos presentes em nossa barra de pesquisa. E então pressionamos Enter, devemos receber as notícias padrão e estamos obtendo o padrão. Mas se houver algum texto, então estamos obtendo as ferramentas de pesquisa. Ok? Então, tudo está funcionando agora, mas também precisamos mudar algumas coisas, alguns detalhes. As principais notícias devem ser mostradas quando estivermos mostrando as notícias padrão. Mas quando estamos apenas mostrando algumas buscas linchadas, dessa vez, as principais notícias devem ser pesquisadas. Então, vamos fazer isso. Para fazer isso, precisamos criar um novo estado, que é chamado de estado de pesquisa inicial de notícias. Agora, esse estado será invocado sempre que o texto de pesquisa não for igual a nulo. Então, escrevemos aqui. Se o texto da pesquisa não for igual a nulo, emita a pesquisa inicial de notícias. Estado. Outra coisa. Basta inicializar as iniciativas de notícias. Agora vamos para nossa página inicial. E agora aqui, se o estado for novo inicial, mostre o ListView, e se o estado for pesquisa inicial de notícias, esse tempo também mostrará essa disputa. Ok, agora vamos às nossas principais notícias e esta vamos mudar. Então, podemos embrulhar isso com um acúmulo de blocos. Portanto, essa é a coisa muito útil sobre o uso construtor de blocos que não precisamos alterar a página inteira ou reconstruir a página inteira. Sempre que houver uma mudança de estado, podemos simplesmente alterar o widget específico que queremos alterar. Essa é a beleza das declarações, certo? Contexto, estado. E se o estado for notícia inicial, esse tempo volta ao normal. Notícias principais. Caso contrário, se o estado for novo, pesquisa inicial, esse tempo mostrou a pesquisa para notícias, notícias para crédito. E se o estado não for nem inicial de notícias nem pesquisa inicial de notícias , retorne um orçamento vazio ou uma caixa de tamanho constante. Ok, vamos experimentar. Se tivéssemos em nossa tela inicial, quando havia um carregamento, ele não estava mostrando nenhum widget. Novamente, se inserirmos novas mostrando apenas o topo próximo a 0, quando as principais notícias estão mostrando, o cabeçalho é a notícia principal. E se for um nome de pesquisa, as notícias de pesquisa tiveram um problema. Ok, ótimo. Agora também, faremos algum tratamento de erros aqui. Vamos limpar tudo. Vamos comentar por enquanto. Vamos comentar essa parte por enquanto e emitir o estado de erro de notícias. Vamos ver o que está mostrando aqui. Vamos reiniciar o f. E quando há um estado de erro de notícias, estamos apenas mostrando que há um texto de erro na tela. O que devemos fazer quando houver um estado de erro de notícias é dar ao usuário um botão de recarga para que se houver um erro com a chamada do APN , possamos recarregar nosso e ele chamará a API mais uma vez. Então, vamos fazer isso. Agora. Se houver um erro, em vez de apenas o texto, queremos dar um botão de ícone. O botão do ícone assumirá um pressionado. Por enquanto, vamos dar a ele uma função vazia e um ícone. O ícone será, eu posso começar. Nós reproduzimos e isso deve ficar bem. E a cor será Deep Blue. O tamanho será, digamos, 24. E vamos dar uma constante aqui. E o que realmente queremos fazer com esse botão de recarga, queremos chamar novamente a função buscar notícias dentro de nossas notícias, boas notícias com o texto de pesquisa nulo. Então, se fizermos isso por enquanto, nada acontecerá porque acabamos de imitar um erro de notícias aqui. Mas se removermos o erro de notícias daqui, e se descomentarmos isso, e agora, se pressionarmos o botão Carregar, ele deve nos mostrar o normal, bom. Mas o padrão significa wallah assim que a notícia padrão. Se reiniciarmos o aplicativo repetidamente, testá-lo, vamos ver o que está acontecendo. Nossas notícias iniciais foram mostradas com o cabeçalho de notícias superior e a imagem é mostrada, o título está sendo mostrado. As fotos estão carregando. E se formos ao noticiário, podemos ver que o título está sendo exibido, as unidades estão sendo mostradas. A data está sendo mostrada quando foi publicada, o autor Naomi tissue e o conteúdo também estamos agora se pesquisarmos algum texto, pesquisa, alguma hora de notícias pesquisadas notícias também estão sendo mostradas com as notícias de busca dirigidas. E se não houver texto dentro do nosso campo de texto de pesquisa , a instalação padrão. Por isso, implementamos nosso bloco com gerenciamento de estado qubit dentro do nosso aplicativo. E nosso aplicativo é totalmente completo e funcional. Então, no próximo vídeo, falarei sobre a parte modular da arquitetura limpa. Veremos por que é modular e como podemos. Também mostrarei alterando um pacote muito importante que estamos usando. E mostrarei com que facilidade podemos alterar o pacote sem afetar outros códigos presentes aqui usando essa arquitetura limpa. Então, obrigado por assistir. Vejo você na próxima. 12. Teste de modularidade de arquitetura limpa: Olá e bem-vindo ao 11º vídeo e ao vídeo final de nossa série de arquitetura plana e limpa, onde estamos construindo um aplicativo inteiro usando arquitetura verde. Neste vídeo, testaremos a modularidade da arquitetura limpa. Desde o primeiro vídeo, fingi que arquitetura limpa é muito modular. Com isso, quis dizer que podemos facilmente mudar qualquer coisa em qualquer uma dessas seções sem afetar o código de outras sessões. Portanto, neste exemplo, alteraremos nosso pacote HTTP em nosso serviço de API para outro novo pacote atualizado. Vamos ver qual pacote usaremos. Usaremos um pacote chamado dy. Vamos para a biografia e adicionar o pacote DO em nosso arquivo YAML de ponto de especificação de pub. Adicionamos discagem em nosso arquivo YAML de ponto de especificação de lâmpada. E vamos analisar nossa pesquisa localizada e registrada. Registrou nosso diodo. Agora lembre-se de uma coisa. Você precisa se registrar antes do serviço da API. O motivo é que você usará o pacote de discagem em nosso serviço de API. Portanto, precisamos registrar a morte primeiro e depois registrar a superfície da API. Agora, apenas por esse motivo, estamos registrando nosso serviço de API antes da busca da fonte de dados remota. A razão é que estamos usando o serviço de API dentro de nossos peixes a partir de uma fonte de dados remota. Agora vamos ao nosso serviço de API e excluiremos. Essa linha. Escreverá a resposta final igual a dois. Antes disso, também precisamos pegar o diodo. Vamos importar nosso localizador de serviços. Agora vamos escrever a função de obtenção de ponto de diodo. Agora, a função get, vemos que ela pega o caminho e também leva três parâmetros. A parte será a URL aqui, e os parâmetros serão onde os pais, ok? E isso retorna um futuro de resposta. A resposta terá uma resposta a ela. Agora, o, isso será a resposta ponto da, da dados. Como estamos usando a resposta do descanso em forma de diapasão, tudo será salvo. Agora, vamos reiniciar nosso candidato. Ok, então estamos recebendo um erro. Vamos ver qual erro fomos criados. Se imprimirmos aqui, os dados de início da resposta. Podemos ver se, você sabe, response.data é impresso. Se imprimirmos o response.data aqui, vamos ver o que acontece. Ok? Então, este está sendo impresso. Portanto, nosso erro deve estar em algum lugar dentro de nossas fontes de dados. Tudo bem. Vamos ao nosso arquivo de fontes de dados. E dentro da nossa captura, vamos imprimir a edição. Assim, podemos ver que o HashMap interno ou uma dinâmica de string de mapa não é um subtipo de string. Isso está aparecendo porque, se formos ao nosso serviço de API, estamos usando JSONData chamado código dentro de nosso response.body dentro do nosso pacote HTTP. Isso nos dá uma versão neófita de cordas da coisa dinâmica da pedra do mapa. Mas aqui estamos obtendo diretamente os tipos dinâmicos máximos, então não precisamos usar esse. Para que possamos excluí-lo aqui. E se executarmos de novo, vamos ver o que acontece. Ok? Então, estamos obtendo nossos dados por algum minuto e ver se isso também está funcionando. Vamos pesquisar. Ok. Portanto, a funcionalidade de pesquisa também está funcionando. Essa é a facilidade com que podemos mudar as coisas em nossa arquitetura limpa sem mudar nada. Se você visse, só precisávamos alterar duas a três linhas em nosso serviço de API ponto, arquivo ponto. O resto, todo e qualquer arquivo estava dizendo que tem o mesmo código. Não precisávamos alterar nenhum outro arquivo, exceto o serviço da API. Então essa é a beleza da arquitetura limpa. Isso é tão útil que podemos facilmente mudar qualquer coisa sem alterar ou alterar outras lutas. Então é isso para este vídeo. Neste curso, fizemos um aplicativo inteiro do zero usando arquitetura limpa. Espero que você também consiga criar o aplicativo comigo. E obrigado por assistir a série inteira até o final.