Arquitectura limpia maestra en Flutter para principiantes | Rahul Agarwal | Skillshare
Buscar

Velocidad de reproducción


1.0x


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

Arquitectura limpia maestra en Flutter para principiantes

teacher avatar Rahul Agarwal, Flutter Developer & Trainer

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Lecciones en esta clase

    • 1.

      INTRODUCCIÓN AL CURSO

      0:53

    • 2.

      Resumen de una arquitectura limpia

      8:14

    • 3.

      UI

      45:36

    • 4.

      Entidades

      5:35

    • 5.

      Paquete de localizador de servicio

      5:52

    • 6.

      Usecases repositorios

      8:42

    • 7.

      Modelos

      12:08

    • 8.

      Fuentes de datos y repositorios

      16:03

    • 9.

      servicios

      17:57

    • 10.

      Bloque con una visión general de la gestión del estado de Cubit

      9:32

    • 11.

      Implementación de bloques y cubit en la aplicación

      33:28

    • 12.

      Prueba de la modularidad de la arquitectura limpia

      7:00

  • --
  • Nivel principiante
  • Nivel intermedio
  • Nivel avanzado
  • Todos los niveles

Generado por la comunidad

El nivel se determina según la opinión de la mayoría de los estudiantes que han dejado reseñas en esta clase. La recomendación del profesor o de la profesora se muestra hasta que se recopilen al menos 5 reseñas de estudiantes.

161

Estudiantes

--

Proyecto

Acerca de esta clase

Clean Architecture es el modelo para un sistema modular, que sigue estrictamente el principio de diseño llamado separación de preocupaciones. Más concretamente, este estilo de arquitectura se centra en dividir el software en capas, para simplificar el desarrollo y el mantenimiento del sistema en sí. Cuando las capas están bien separadas, las piezas individuales pueden ser reutilizadas, así como desarrolladas y actualizadas de forma independiente.

En este curso vas a hacer una aplicación completa desde cero con Clean Architecture y la gestión de estado de Bloc y Cubit. También incorporarás la API REST con dos paquetes diferentes Http y Dio. Y aprenderás sobre la inyección de dependencia y cómo hacerlo simple usando el paquete get_it. Aprenderás sobre la estructura de archivos de una aplicación del mundo real y cómo hacer tu código escalable y modular.

La arquitectura limpia dividirá el proyecto Flutter en 3 capas principales, a saber:

Capa de presentación

La capa de presentación consiste en el código para acceder a los datos de la aplicación desde un repositorio. Además, existe el código para la gestión estatal como proveedores, BLoC y así sucesivamente.

Capa de dominio

La capa de dominio es la más profunda en la arquitectura limpia. Esta capa contiene el código para aplicaciones de lógica de negocios, como entidades y casos de uso.

Capa de datos

La capa de datos se encuentra en la capa más externa. Esta capa consiste en código fuente de datos, como consumir API de Rest y acceso a la base de datos local, Firebase u otras fuentes. Además, en esta capa, generalmente existe el código de plataforma que genera la interfaz de usuario (widgets).

Conoce a tu profesor(a)

Teacher Profile Image

Rahul Agarwal

Flutter Developer & Trainer

Profesor(a)

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.

Ver perfil completo

Level: Intermediate

Valoración de la clase

¿Se cumplieron las expectativas?
    ¡Superadas!
  • 0%
  • 0%
  • Un poco
  • 0%
  • No realmente
  • 0%

¿Por qué unirse a Skillshare?

Mira las galardonadas Skillshare Originals

Cada clase tiene lecciones cortas y proyectos prácticos

Tu membresía apoya a los profesores de Skillshare

Aprende desde cualquier lugar

Ve clases sobre la marcha con la aplicación de Skillshare. Progresa en línea o descarga las clases para verlas en el avión, el metro o donde sea que aprendas mejor.

Transcripciones

1. INTRODUCCIÓN AL CURSO: Uno para hacer una aplicación del mundo real utilizando la arquitectura adecuada, separando la lógica de negocio y la pizarra. Entonces este curso es perfecto para ti. En este curso, estarás haciendo una aplicación completa desde cero usando arquitectura limpia con administración de bloques y estado cúbico. También estarás incorporando el resto API en tu aplicación usando dos paquetes diferentes, HTTP. Y también aprenderás sobre la inyección de dependencia usando el paquete getters. Y lo más importante, aprenderás a separar tu teléfono en tres capas diferentes, capas datos, dominio y presentación y hacer tu módulo. Mi nombre es. Y en este curso, tu instructor será engañado con ellos en seco. Espero que lo disfrutes. Entonces, sin perder más tiempo, inscribirte ahora y comencemos. 2. Resumen de una arquitectura limpia: Bienvenido al primer video de nuestro curso que se ondeó en arquitectura. En este video, vamos a estar aprendiendo sobre arquitecturas limpias. Entonces, antes de saltar a la arquitectura limpia, necesitamos saber por qué usar la arquitectura en primer lugar. Si tienes una app pequeña o mediana, digamos una app donde tienes que presionar algunos botones. Y en la interfaz de usuario, habrá alguna imagen mostrada o algún texto de visualización. Entonces no necesitas una arquitectura, ya que es un acto muy sencillo. Y la incorporación de una arquitectura en este tipo de aplicaciones estará en proceso de ajetreo y toma de tiempo. Pero digamos que tienes una aplicación muy grande donde no solo tú, sino muchos más desarrolladores están trabajando en un mismo proyecto. Por ejemplo, digamos que estás construyendo una app muy grande como Uber o una app muy grande. Zomato, esa cosa. No solo tú, sino muchos más desarrolladores están trabajando en un solo proyecto. Esa vez, tener una arquitectura adecuada no solo le ayuda a acelerar el desarrollo, sino que también ayuda a estandarizar un patrón de diseño en todo el equipo de desarrollo de aplicaciones. Además, tener una arquitectura estructurada muy adecuada nos ayuda a modular el código. Aquí viene una hermosa parte de la arquitectura limpia. arquitectura limpia ayuda a los desarrolladores de aplicaciones a modular el código. ¿ Qué quiero decir con modularización? Modularizar el código significa tener secciones separadas para cada conjunto independiente. Ahora bien, si quieres cambiar, por ejemplo, hay un servicio de backend que estás usando, digamos que dispara esto. Y más adelante quieres cambiarlo a un backend personalizado, luego modularizar la arquitectura. Puedes hacerlo muy fácilmente sin afectar a otras capas. Además, si estás usando, digamos, un paquete que está funcionando bien por ahora. Pero más adelante, quieres cambiar el paquete a un paquete diferente para la facilidad de tu uso, Andy, para el mejoramiento de la aplicación ese tiempo que tengas, puedes usar esta arquitectura modularizada para cambiar fácilmente algunos archivos. Y luego puedes volver a ejecutar la aplicación tal como estaba. Ahora, como ahora sabemos, esa arquitectura es necesaria por si acaso para hacer aplicaciones de tamaño mediano o grande. Entonces, ¿por qué deberíamos elegir una arquitectura limpia? Hay muchas más opciones arquitectónicas, como MVVM, MDD. Ver, ¿por qué deberíamos usar arquitecto limpio? Bueno, para entender eso, necesitamos conocer la estructura fundamental básica de la arquitectura limpia. arquitectura limpia separa el código en tres capas diferentes. Una es la capa de presentación, segunda es la capa de dominio. Tercero son los datos. La capa de presentación consiste en la interfaz de usuario y la lógica de presentación. La lógica de presentación es la gestión estatal. Por ejemplo, la administración estatal como bloqueo, bloque con cubit, proveedor, fiebre, olla, GetX, y así sucesivamente. La capa de dominio es más delgada, donde contendrá nuestra lógica de negocio principal de la aplicación. La capa de dominio consta de tres secciones. La sección de entidades, la sección de casos de uso y los repositorios lo contratan. Ahora entendamos un poco sobre cada una de estas secciones. La entidad es parte, contiene los objetos que usaremos muestran los datos en nuestra interfaz de usuario. Los casos de uso contendrán la lógica principal, por ejemplo, validación de contraseña y validación de correo electrónico. Y el contrato de repositorios contiene el contrato o la clase abstracta de donde obtendremos los datos. Ahora la capa de datos es la capa de donde obtendremos los datos de fuentes externas, como APIs o bases de datos, o incluso o falsas. La capa de datos consta de tres secciones. Repositorios, implementación, donde estaremos implementando los repositorios que estaban en el contrato de repositorios. Donde también está la sección del modelo y las fuentes de datos. Nada de modelos se extenderá desde las entidades. Las fuentes anti datos obtendrán los datos de las API o bases de datos o incluso de nuestra gente. Ahora, como estábamos antes cosa que arquitectura limpia ayuda a modularizar el código. También significa que todas y cada una de las secciones son secciones independientes, la capa de presentación, B, capa de dominio y los datos son todos independientes entre sí. Entonces, si cambiamos algo en la capa de datos, no debería afectar a la capa de presentación. Es capa de dominio. De igual manera, si cambiamos algo en la presentación que no debería afectar a la capa de dominio y a los datos ahí. Ahora, dado que nuestra aplicación está teniendo capas separadas para la interfaz de usuario y la lógica, también ayuda a probar el código. Escribir pruebas unitarias para el, específicamente para las lógicas. Y escribir widget para DUI se hará muy fácilmente. Antes de saltar a la parte de codificación de este curso, veamos primero lo que realmente va a hacer para aprender la arquitectura limpia. Entonces estaremos haciendo esta aplicación que muestra novedades. Y vamos a estar usando una API de noticias o API, que es una API de código abierto. Ahora, cuando hagamos clic en esta noticia, se abrirá una nueva página donde podremos ver el resto de las necesidades. Además, podemos buscar algunas nuevas, digamos, en realidad no mostré la noticia que se busca. Ahora vamos a crear una nueva aplicación. Estará nombrando la aplicación de noticias app, ¿verdad? Y abriremos la aplicación en código VS. Bien. Ahora veamos la estructura de archivos. Primero, tendremos una carpeta llamada features. En la app que mostramos. Sólo hay una característica que está mostrando las noticias, ¿verdad? Por lo que la nueva característica dentro este reportaje de noticias del espectáculo tendrá tres secciones. Primero, sección de presentación. En segundo lugar, la sección de dominio. En tercer lugar, la recolección de datos. Ahora, aparte de las características, también tendrá un archivo core. Ahora el contenido del archivo core no solo se utilizará en una o dos características, sino que a lo largo del solicitante deberá. Una carpeta será constante. Otra carpeta serán los fracasos y los éxitos llegarán a esta parte más adelante en el curso. Otro serán los servicios. Estos son servicios externos que vamos a estar usando todos, digamos paquetes. Entonces esta es la estructura básica de carpetas. En el siguiente video, comenzaremos con la interfaz de usuario de la aplicación. Así que gracias por ver. Te veremos en la siguiente. 4. Entidades: Bienvenido al tercer video de nuestra serie de arquitectura flutter clean, donde estamos haciendo una aplicación completa usando la arquitectura limpia. En este video, estaremos caminando por la capa de dominio. Y en la capa de dominio, como vimos, tenemos tres secciones. Entidades, casos de uso y repositorio es contrato. Entonces en este video, vamos a estar echando un vistazo en la parte NTD. Entonces, antes de saltar al código, veamos exactamente cuáles son los datos sobre los que va a estar haciendo la entidad. Para que podamos obtener los datos en noticias api.org. Entonces si vas a news api.org, ahí podrás obtener la documentación, estará iniciando sesión y obteniendo la clave API más adelante en la sección de datos. Pero por ahora, vamos a ver en qué tipo de datos vamos a estar trabajando. Así que vaya a documentos, documentación, y luego haga clic en todo. Entonces esta es una API, y esta API nos da, cada vez que hacemos una solicitud get, esta API nos da un dato json. Se requerirá el nombre del autor, el título, el autor es un formato de cadena. Como puedes ver, el titín también está en formato string. Y también necesitamos la URL de la imagen, resulta en formato string. Y publicado en también está en formato string. Esta es la fecha y hora. El contenido también está en formato de cadena. Bien, Ahora hagamos nuestra entidad. Entonces entraremos en la sección Características. Y dentro de la sección de dominio haremos una nueva carpeta llamada entities. Dentro de las entidades hará una nueva entidad llamada News info dot, dot hará una clase conocida como news info. Y primero tomará una cadena de título. El segundo será una cadena de alterados. tercero será cadena de imagen que agregaste antes será una cadena de contenido. Y el quinto sería el tipo de estática pública. Ahora, agreguemos todo dentro de nuestro constructor. Ahora, excepto datetime. Todo puede ser anulable. Por ejemplo, un artículo de noticias puede tener un título, o a veces incluso puede no tener un título. Por lo general, cada tipo de noticias a cada artículo de noticias debería tener un título, pero puede haber algún error en la base de datos sobre tal vez la parte posterior la persona que está escribiendo el artículo de noticias puede tener olvidóagregar el título. Entonces tenemos que gustarnos considerar estos casos de borde. Entonces tenemos que hacer que el título sea nulo. También el autor también puede ser anulable para que también imageURL pueda o no estar presente. Para que también el contenido también pueda o no estar presente. Para que también nos den, pero se conservará datetime porque cada vez que se publique una noticia, tiene que estar presente. Entonces aparte de esto, aparte de datetime, no necesitamos hacer nada más requerido. La palabra clave requerida significa que cada vez que estamos llamando a la información de noticias, necesitamos agregar la fecha y hora. Ahora bien, ¿qué son exactamente los tipos anulables? Por ejemplo, si tenemos una cadena de, digamos nombre, y aquí le doy un nombre de RAM. Específicamente estamos diciendo oscuridad ahí. La variable name está tomando un tipo de datos de cadena y el valor de la variable name siempre será una cadena y nunca puede ser variable nula. Pero si lo asignamos como cadena con un signo de interrogación, entonces le estamos diciendo a dark que la variable name puede ser una cadena o puede ser none. Por ejemplo, el nombre también puede ser no. Esto también funcionará. Por lo que terminamos con la entidad es parte de nuestra aplicación. En el siguiente video, estaremos aprendiendo sobre un paquete muy importante que vamos a estar usando, que es el localizador de servicios o el paquete de conseguirlo. Así que gracias por ver este video. Nos vemos en la siguiente. 5. Paquete de localizador de servicio: Hola y bienvenidos al cuarto video de la serie flutter clean architecture, donde estamos haciendo una app completa usando arquitectura limpia. En este video, estaremos aprendiendo sobre un paquete muy importante llamado el paquete get it. Ahora bien, ¿qué es lo que este paquete consigue que nos ayude a encajar antes saber que necesitamos saber qué es exactamente la inyección de dependencia? Entonces, ¿qué es exactamente la inyección de dependencia? Veamos un ejemplo. Entonces haremos un nuevo archivo. No es necesario hacer este archivo. Este archivo será solo para este video. Podría ser DIE ejemplo punto, punto. Y aquí estamos importando nuestro paquete material dot dot. Y vamos a estar haciendo algunos widgets de lista de omisión. Primero hagamos esto, luego te lo explicaré. Bien. Entonces como puedes ver, este es un botón ficticio, que lleva un botón elevado. Y puedes ver que nuestra caja ficticio depende de nuestro botón ficticio. También. Podemos ver que tenemos un botón ficticio, que es un botón elevado. Tenemos una caja ficticio, que depende del botón determinante. Tenemos una tarjeta ficticio, que depende de la caja ficticio, que de nuevo depende del botón ficticio. Y tenemos nuestra página ficticio, que depende de la tarjeta ficticio, que depende de la caja ficticio, y que depende del botón ficticio. Ahora bien, si tenemos, digamos una clase de información de botón que almacena la información del botón. Por ejemplo, digamos x aquí. Y si queremos pasar esto aquí, para que podamos usar este de aquí. Entonces ahora tenemos que pasar esta información de botón en todos estos widgets. Veamos cómo pasamos en nuestro botón ficticio en su totalidad, en nuestra caja ficticio. Ahora, tenemos que pasar la información del botón en nuestras tarjetas ficticias para que podamos usarlo en nuestra caja ficticio. Ahora como estamos usando el botón info en nuestra tarjeta ficticio, también necesitamos pasarla en nuestra página ficticio. Entonces vimos que estamos usando solo el botón info en nuestro botón ficticio. Pero como todos estos son dependientes, por lo que necesitamos pasar nuestra información de botón en la parte superior. Entonces para evitar este problema, viene D, consíguelo paquete. Ahora para acceder a esto, también necesitamos llamar específicamente a nuestra función de servicios de configuración en el archivo punto punto principal. Entonces para hacer eso, primero, tenemos que darle su primer factor vinculante que asegure inicializado. Lo que hace este es inicializar las cosas que se necesitan para las plataformas nativas que se requieren en nuestro iOS y Android construyanlas plataformas nativas que se requieren en nuestro iOS y Androidantes de ejecutar cualquier cosa en la aplicación. Ahora vamos a estar llamando a los servicios de configuración, y ahora ya terminamos. Entonces esto fue para este video. En el siguiente video, estaremos usando el paquete get it en la parte Casos de uso y repositorios. Y también necesitamos el localizador de servicios por ahora puedes eliminarlo, estará creando estos en el siguiente video. Así que gracias por ver. Nos vemos en la siguiente. 6. Usecases repositorios: Hola y bienvenidos al quinto video de nuestro curso de arquitectura flutter clean, donde estamos construyendo una aplicación completa usando la arquitectura flutter clean. En el video de hoy, estaremos aprendiendo sobre casos de uso y repolarizar y repositorios en la sección de dominio. Así que vamos a nuestras Características. Y dentro del dominio, vamos a crear una nueva carpeta llamada casos de uso. Y vamos a crear otra carpeta llamada Repositorios. Dentro de los casos de uso, haremos un nuevo archivo llamado fetch News. Punto. Dot creará una nueva clase llamada Fetch news. Y dentro de la clase, escribiremos una función llamada fetch news. Antes de eso, me gustaría hablar un paquete que se llama paquete puntos. Primero veamos que se necesitará el paquete de puntos blancos. Vamos a pop dot diff y busquemos puntos. Importemos este paquete en nuestro proyecto. Vamos a un archivo YAML de punto de especificaciones de pub. Ahora, normalmente cuando estamos obteniendo algo o obteniendo algo o de una función, normalmente podemos devolver solo un único tipo de datos. Por ejemplo, si tenemos un futuro de noticias info y me refiero a buscar noticias. Por lo que esta función sólo puede devolver información de noticias. Pero puede haber un caso en el que de nuestro back-end no estemos recibiendo algunas noticias y adelante, pero estamos recibiendo un error. Para que esa vez lo que queremos hacer no se devuelva la noticia en su totalidad, sino que devuelva un fracaso. ¿ Cómo podemos hacer eso? Podemoshacer eso usando puntos. Entonces, primero importemos puntos. Y usando esto arranca, podemos hacer es que podemos crear un ya sea. Con cualquiera podemos volver a los tipos de datos. Digamos que uno es int y el otro es string. Ahora bien, lo que en realidad queremos devolver es un fracaso. Y hay lista de noticias info. Ahora, vamos a crear esta clase de fracaso. Y el fallo se utilizará en toda nuestra app. Entonces para eso, necesitamos crearlo en el código. Ya hemos creado un archivo llamado fracasos y éxitos. Dentro de aquí crearemos un nuevo archivo llamado fallas punto, punto. Creamos una clase abstracta. Fracaso. un mensaje de cadena que contendrá el mensaje de falla si hay alguno. Ahora vamos a crear una nueva falla llamada Fetch. Obtener video, que extenderá el fallo. Y dentro de aquí haremos un constructor constante. ¿Cuál falla? Y como estamos extendiendo el fracaso, tenemos que pasar el mensaje en este súper. Entonces ahora podemos regresar, podemos eliminar esta. Ahora podemos devolver el fracaso de búsqueda aquí. Si importamos los Phineas. ¿ Bien? Ahora esta es la capa de dominio. No queremos escribir ningún negocio, ninguna lógica de datos dentro de nuestro dominio. El dominio consistirá únicamente en la lógica de negocio, como contraseña, validación, validación de correo electrónico, etc. etc. así que para tat, para conectar la capa de datos con la capa de dominio, necesitamos usar repositorios. Ahora bien, ¿cómo podemos usar eso? Vamos a nuestros repositorios y creamos una nueva república. En primer lugar, tenemos que cambiar el nombre de las fake news. Noticias falsas. Casos de uso, caso de uso, para que podamos segregar que es un caso de uso. Ahora dentro de nuestros repositorios haremos un nuevo archivo llamado Fetch repo contract dot, dot. Ahora bien, como se trata de un contrato, ésta será sólo una clase abstracta. ¿ Qué entendemos por clase abstracta? Por ejemplo, estás manejando un auto. Estás girando el volante, el volante en dirección izquierda. El auto va en dirección izquierda. Estás mirando dado en la dirección correcta, el auto va en la dirección correcta. Sabes que al dirigir el volante, el auto irá a la izquierda o a la derecha. Pero ¿sabes qué es lo que hace el trabajo interno del intestino no sabes? Entonces las clases abstractas son así. Nos va a dar funciones que van a hacer el trabajo. Pero no necesitamos saber qué es exactamente, cómo es exactamente la función, es el trabajo realizado en la función va a crear una clase abstracta fuera del ventrículo fetch. Aquí vamos a tener una función de futuro ya sea fracaso. Pero vamos a dejar de nuevo ZoomInfo. No. Podemos ir a nuestros casos de uso e importar la Fed. ¿ Debo poner aquí? Bien, voy a llamar al polo vegetal aquí. Ahora. Ahora solo podemos devolver aquí las noticias fetch repo dot fetch. Así que terminamos con nuestro caso de uso. Y qué estamos hechos con nuestro repositorio. Pero también estamos teniendo una función de búsqueda aquí. Entonces el solo hecho de tener las noticias del PECC no va a funcionar. También necesitamos rosar para la funcionalidad de búsqueda. Por ejemplo, siempre que estés buscando algún texto, esa vez que entró, lo que necesitamos es regresar, buscamos textos, noticias aquí. Entonces para hacer eso, también necesitamos pasar otro campo llamado texto de búsqueda. Ahora bien, esto puede ser nulo. Buscamos texto se puede hacer cuando sea nulo, solo mostrará las noticias normales. Y cuando el texto de búsqueda no sea nulo, ese tiempo mostrará las noticias de búsqueda. Ahora también necesitamos agregarlo en nuestros casos de uso. Aquí también agregaremos una cadena de texto de búsqueda. ¿Bien? Ahora ya terminamos. Enel siguiente video. Allí estaremos trabajando en los datos. Así que gracias por ver. Nos vemos en la siguiente. 7. Modelos: Hola y bienvenidos al sexto video de nuestra serie de arquitectura flutter clean, donde estamos haciendo una aplicación completa usando la arquitectura limpia. En esta sección, vamos a iniciar la capa de datos. Y dentro de los datos habrá comenzando con los modelos. Entonces, primero vamos a crear una carpeta en la carpeta de datos, modelos de fallas. Dentro de los modelos, vamos a crear un nuevo modelo llamado News info model punto, punto. Y vamos a crear una clase llamada News info model, que extenderá la información de noticias. Ahora, necesitas hacer un constructor de clase modal y ser super super función. Ahora veamos qué está pidiendo la súper función. Es pedir una DateTime es obligatorio. El nombre del autor, el contenido, imagen que tenías un detectado. Sabíamos que el título ImageURL content y el autor son todos cadenas y el datetime, datetime time. Pero los datos que vamos a obtener serán en formato JSON. Todo. Tendremos un tipo de datos diferente. Entonces veamos primero qué tipo de datos será feliz. Entonces tenemos que ir a news api.org, ir a documentación. Dentro de la documentación, vaya a todo. Y vamos a comprobar cuál es el tipo de datos de nuestros datos que estamos obteniendo de nuestras noticias api.org. Apl es una cadena, lo cual está bien. El título también es una cadena, lo cual está bien. Eres suficiente. La imagen también es una cadena. Publicamos eso, que es el DateTime. También está en cadena, lo cual es indeseable. Pero para destacar, el contenido también está en Calle. Bien, entonces ahora sabemos qué tipos de datos estamos obteniendo de nuestra API. Entonces escribamos aquí. Cuando se escribe. Primero necesitamos el título, luego el nombre del autor, luego la URL de la imagen, el contenido y los datos. Dentro de este súper pondrás el título, ¿título? Dado que el título en nuestra información de noticias también es una cadena que es anulable. Y aquí también el título es una cadena que es maleable. Entonces está bien. Y nuestro autor dentro de nuestra información de noticias es una cadena que es anulable. Aquí también es una cadena que es anulable. Así que sólo podemos pasarlo. Nuestra URL de imagen también es una cadena que es anulable. URL de imagen de héroe, que es una cadena que es anulable. Simplemente lo pasamos aquí. Y nuestro contenido también es el mismo ya que puedes ver ahora nuestra información de noticias, gesticulando, que es anulable y héroes, por lo que es una cadena. El datetime, sin embargo, dentro de nuestra información de noticias, es una fecha y hora que no es anulable. Pero en nuestro modelo news info, lo hemos establecido en una cadena que no está nivelada. La razón es que los datos que estamos obteniendo también es una cadena. Y estamos esperando que en algunos casos esto pueda ser un nulo, así que tenemos que encargarnos de eso. Entonces lo que podemos hacer aquí es hacer una función llamada Obtener fecha, hora. En formato de fecha y hora. Estamos escribiendo una función con. Entonces vamos a quitar la constante aquí. Tomemos una función estática y que tendrá un tipo de retorno de datetime con el mismo nombre. Y aquí también pasaremos una cadena de datetime, que no es más que ésta. Pasemos aquí esta corriente. Ahora. En primer lugar, diremos si el DateTime es igual, igual a nulo, entonces no hacer nada. Simplemente devuelva una fecha y hora del punto de fecha y hora actual. Ahora podemos obtener la función actual datetime, datetime dot now. Y si el DateTime no es nulo, entonces ¿qué hacer? Entonces hay una función muy útil de la fecha que nos permite analizar cadena a datatype datetime. Veamos cómo podemos hacer eso. Escribiremos la última vez. Datetime, formato datetime porque hasta la fecha y hora dot trípodes, usando datetime. Ahora bien, los trípodes sí. Lo que hace el trípodes es intentar convertir la cadena date time, que es esta, en un tipo de datos datetime. También aquí, podemos simplemente dar un no anulable, lo que significa que aquí la fecha y hora nunca puede ser nula. La razón es que ya hemos comprobado si el tiempo es nulo, entonces devolveremos Time dot ahora. Así que dentro de la otra, la fecha y hora nunca puede ser nula. Entonces podemos dar este signo de exclamación. Y la mecánica dice específicamente que dentro de la otra, la fecha y hora no será nula. Además, los trípodes devuelven la fecha y hora, pero que es anulable. Ahora, ¿por qué es anulable? Si, digamos que trata de analizar. No necesitamos dar específicamente el signo de exclamación aquí ya que ya estamos comprobando si el DateTime no está aquí. Ahora, por qué la función de trípodes de punto datetime devuelve una fecha y hora que es anulable. La razón es si trípodes intenta pasar el formato datetime o la cadena datetime a un tipo de datos datetime. Pero digamos que no logra convertir eso. Digamos que tenemos una cadena que es algo hola. Ahora bien, este hola no puede ser, este hola no se puede convertir a una fecha y hora. Datetime se puede convertir, digamos que algo como esto se puede convertir, convertir a una fecha y hora, pero hola no se puede convertir. Entonces, ¿qué sucede cuando nos estamos dando algunos textos que no se pueden convertir a una fecha y hora, simplemente devuelve un valor nulo. Cambiemos el hola para depender. Ahora bien, si el formato datetime, datetime es igual, igual a nulo, entonces también devolveremos el punto datetime. Ahora. Ahora bien, esto significa que intentó analizar la fecha y hora, que está en formato de cadena, a una fecha y hora que está en formato de fecha y hora, pero no pudo. Entonces esa es la razón por la que estamos devolviendo la fechahora de ese tiempo presente. Pero si no es nulo, si DateTime no es nulo, entonces queremos decir que ha anulado palabras. Si es así, ha podido analizar los datos que están en formato de cadena a la hora de edición, que está en formato de fecha y hora. Para que esa vez no hagamos más que regresar. Bien, entonces esta está hecha. Ahora, necesitamos crear otro método, que es un método muy útil. Estaremos creando un método de mapa de trombos. Vamos a crear, y después voy a explicar. Ahora lo que hace este método es esa primera semana, qué tipo de datos estamos obteniendo. Aquí, estamos obteniendo un dato en el formato JSON. O podemos decir que está en un formato de mapa, que es una cadena, que es nuestra t. y el valor es dinámico, lo que significa que puede ser una cadena. Puede ser, se puede hacer, puede ser cualquier cosa. Dinámico significa que puede ser string, puede ser, puede ser cualquier tipo de datos o política nula. Para convertir este mapa en un museo para maqueta, necesitamos una función y esa función es de. Ahora. Tenemos que decir esto específicamente como un hecho. Ahora, expliqué en el video del localizador de servicios, ¿qué es una fábrica y qué es un singleton? Singleton. Lainstancia es un singleton es donde estamos usando la misma instancia en toda la aplicación. Pero en un método de fábrica. Lo que se hace es crear una nueva instancia de este objeto cada vez que estamos llamando. Entonces, cuando, cada vez que vamos a llamar a un método from map en nuestra app, esa vez creará una nueva instancia de modelo de news info. Digamos que estamos llamando desde el mapa cinco veces en nuestra app. Por lo que se crearán cinco nuevas instancias de noticias y para módem. Pero si se trataba de un singleton, entonces incluso si se recuerda de cinco veces, solo estará creando una sola instancia. ¿ Bien? Ahora también tenemos que dar los datos aquí, así se mapeará el título. Y si podemos ver aquí, solo necesitamos mapear aquí estos valores. El título aquí, sólo podemos copiarlo aquí. Y del mapa con el título, se mapeará al autor. Y si lo comprobamos aquí, el autor es este autor. Para que podamos copiar éste y pegarlo aquí. La URL de la imagen será mapa y URL de imagen. Url demasiado. Copiaremos este y lo pegaremos aquí. Se mapea el contenido. Vamos a comprobarlo aquí. Estecontenido y la fecha-hora que se publica acto fecha con este tema, este. Y ahora hemos terminado con las novedades en para model.fit del método map, que convierte la cadena de mapa noticias bidireccionales dinámicas. Y para el Señor. Así que gracias por ver este video. En el siguiente video, estaremos profundizando en la sección de fuentes de datos y repositorios. Graciaspor ver. Nos vemos en la siguiente. 8. Fuentes de datos y repositorios: Hola y bienvenidos al séptimo video de nuestra serie de arquitectura aplanada cuando estamos haciendo una aplicación completa usando arquitectura lean. En este video, vamos a hablar sobre las fuentes de datos y repositorios en la sección de datos. Entonces primero vamos a nuestro archivo de datos y vamos crear una nueva carpeta llamada Repositorios. Dentro de los repositorios se realizará un nuevo archivo llamado Fetch report. En IMP, lo que significa implementación punto, punto hará una nueva clase llamada cual reporte IMP, que implementará dicho repositorio. Ahora, también necesitamos, ya que estamos implementando el repositorio fetch, cual estaba presente en la capa de dominio. Así que tenemos que anular esta función dentro del repositorio recuperado IMP. Por sobreescribir, simplemente no puedes hacer una cosa. Haga clic aquí, presione Control y puntos, y cree, y toque aquí, cree uno que falta sobre sobrescribir. Automáticamente creará la función. Ahora no queremos lanzar un error aquí, así que eliminemos esto. Dentrode esta función. Estaremos llamando a las fuentes de datos. Entonces antes de eso, necesitamos hacer la fuente de datos. Así que vamos a crear una nueva carpeta dentro del archivo de datos llamada fuentes de datos. Y dentro de la fuente de datos se creará un nuevo archivo llamado desde ds remotos. Ds significa nombres de fuentes de datos que el, como dice el nombre, estamos recuperando los datos de la fuente de datos remota, que es una API externa. Así que lo nombramos fetch de múltiples fuentes. Vamos a crear una clase abstracta a partir de una fuente de datos remota. Dentro de la clase abstracta, tendremos un futuro que devolverá una lista de noticias. Modelo. El nombre será buscar noticias. Y también aquí estaremos incorporando la funcionalidad de búsqueda utilizando el texto de búsqueda. En el último video, expliqué si el texto de búsqueda era nulo, entonces noticias normales cuando visual y reinicia textos se perdió ninguno. Después las herramientas de búsqueda en bushel. Ahora dentro del uso fetching, lo que tenemos que hacer es llamar a un servicio externo, como el servicio HTTP o todo el servicio, mediante el cual estaremos obteniendo los datos de nuestra API externa. Entonces hagámoslo. En primer lugar, publicaremos antes de hacer un mapa de cadena dinámico. Este contendrá los datos que nos sean dados desde la API. Para hacer eso, necesitamos hacer el servicio. Pero en este video, no vamos a hacer el servicio, así que solo haremos el contrato del servicio. Entonces dentro de la carpeta core, tenemos una carpeta services services. Y dentro de la carpeta services haremos un nuevo archivo llamado HTTP, o digamos API que iniciamos ya que estamos obteniendo los datos de las APIs. Entonces estamos escribiendo APIs. Si no está hecho. Vamos a crear este servicio API. Por favor, haga un servicio API de clase abstracta. Y dentro del servicio API se hará una nueva carpeta. Future string Dynamic get data. Ahora podemos llamar a éste. Aquí. Lo que podemos hacer es hacer que el servicio API. Dado que esta es una clase abstracta, también necesitamos implementar esta en una clase separada. Vamos a crear el vaso. Protección de vidrio de floración remota me estoy dando hasta la condición que implementa desde soporte remoto ¿cuál es la función? Y dentro de aquí, aplicamos probablemente el servicio API. Bien, ahora hemos llamado al servicio API, y aquí llamaremos a la función get data en nuestra superficie API, ¿verdad? No extremo. Dinámica es igual a dos. O podemos decir que los datos son iguales a tal vez comenzar, obtener diferentes. También tenemos que esperar aquí, ya que esto devuelve un futuro mapas y dinámicos. Y como estamos usando nuestra silla, necesitamos hacer esta función. Bien, entonces estamos obteniendo los datos, pero qué datos realmente estamos obteniendo, vayamos a news api.org. documentación de Insight irá a cada través de los datos que estamos obteniendo de la API es un mapa. Y dentro del mapa, cuáles son los datos reales que queremos son estos artículos. Estos artículos contienen una lista de mapas. Entonces déjame primero codificar y luego lo haré. Entonces dentro de los datos, obteniendo una lista, llamémoslo lista de artículos. Podemos ver aquí que esto es, si asumimos que todo esto son los datos, entonces dentro de los datos, si obtenemos los artículos, los artículos contendrán una lista. Ahora bien, esta es una lista de mapas, pero los mapas dentro de este y la demanda en el corazón son un poco diferentes. Entonces para eso, lo que podemos hacer es hacer una nueva lista fuera de mapa, cadena, lista dinámica. Realmente no inicialicé a una lista vacía. Y iteramos a través de todos los elementos dentro de esta lista y convertimos cada elemento a una dinámica de cadena de mapa. Hagámoslo. Entonces lo llamaríamos mapa. Será igual a enumerar. Y diremos que este tipo es como mapa dinámico. Ahora agregaremos este mapa dentro de nuestra lista de mapas. Mapa completamente abastecido en. Bien. Ahora lo que podemos hacer es hacer una nueva lista de modelo de noticias info. Vamos a inicializarlo con una lista vacía. Y ahora atravesaremos todos los elementos de la lista de mapas. Convertiremos cada uno de la lista de mapas a cada uno de los mapas dentro del mapa, este museo mañana. Hagámoslo. Ahora. Vamos a utilizar el método de mapa fuerte que creamos en la sección del modelo. Lo llamaremos como perder a Phil Martin del mapa. Y el mapa será cada uno de los ítems dentro de D mapas. Ahora agregaremos el modelo de vendedor de noticias dentro de la lista de noticias y luego regresaremos. Bien, hecho aquí. Pero digamos que aquí está ocurriendo algún error. Digamos que nuestra función get data muestra alguna excepción. Entonces tenemos que coger esas excepciones aquí. Entonces lo que podemos hacer es copiar todo este código y pegarlo dentro de un bloque try catch. Entonces, si obtenemos algún error, lanzaremos una excepción. La excepción puede ser cualquier extracción. Pero lo que realmente queremos hacer es hacer excepciones personalizadas. Entonces para hacer eso, necesitamos ir a fracasos y éxitos, hacer un nuevo archivo llamado excepcional stark dark. Y crearemos una excepción personalizada. Dicha excepción implementa excepción. Esta excepción aquí. Es un plus dado por dark y tiene un constructor de fábrica. Entonces como vimos en los fracasos, estábamos extendiendo el fracaso, pero éste, no podemos hacerlo aquí porque no podemos extender una clase. Solo tenemos un constructor de fábrica, así que necesitamos implementarlo. Así que vamos a crear la excepción fetch construida aquí. ¿ Bien? Ahora podemos lanzar esta excepción. Se puede escribir excepción. Vamos a darle un mensaje también para empezar. Y vamos a ponerlo abierto. Así que terminamos con la función fetch news dentro nuestra implementación de fetch from remote data source. Más. Llamemos a esta función dentro de nuestro repositorio. Implementación. Volverá. Primero. Aquí conseguiremos la clase. Pero desde una fuente de datos remota. Ahora podemos usar esta. Buscó. Dice que esto devuelve un valor de futuras noticias de lista en formato que no puede tener un método ya que esta función lo devuelve, ya sea una falla o una lista usando. Entonces lo que tenemos que hacer es devolverlo así, ¿verdad? ¿ Bien? Entonces, ¿qué está pasando aquí? Estamos diciendo que desde la función fetch nice, return, devuelve un futuro de ya sea fracaso o lista de noticias info. Entonces estamos diciendo que esta función devolverá el lado derecho del valor cualquiera, lo que significa que el cualquiera tiene dos valores, ya sea falla, todas estas cosas se mueven a esta función, devolverá el lado derecho de los artículos que aparecen en la lista. ¿ Bien? Pero también vimos que las fuentes de datos pasan por error aquí o excepción aquí. Entonces también necesitamos atrapar la excepción en nuestro repositorio. Entonces podemos hacer eso probando catch block. Pero también vimos que estamos lanzando una excepción personalizada de sección de proyecto. Para que podamos atrapar la excepción del cliente en la excepción de campo. Y ahora podemos lanzar un fracaso también. Entonces volveremos a la izquierda. Que falla con un mensaje E punto mensaje. Esta E no es más que un objeto de excepción de búsqueda. También necesitamos devolver la cancelación de sus datos para dichas noticias. Entonces ahora hemos terminado con la implementación del repositorio, terminamos con las fuentes de datos. Vamos a recapitular una vez más. Hicimos, implementamos el reporte de fetch en clase de implementación a nivel científico. Luego revisamos las fuentes de datos e hicimos la fuente de datos para hacer el diagnóstico. Hicimos un resumen de costos de servicio API, que estaremos implementando en el siguiente video. Y luego cambiamos los tipos de datos para ser requeridos. Tipos de datos desde la dinámica del equipo de Maps hasta el museo para el modelo, y luego devuelven las noticias o la excepción de búsqueda de tres. Y luego dentro del repositorio se usa otro bloque try-catch donde si no hubiera error, devolveríamos el derecho del fallo, que es list, news info y all exception. Detectaremos la excepción que se devolvió dentro de nuestras fuentes de datos. Aquí. Estamos cogiendo eso y luego regresando el lado izquierdo de la, que es un fracaso, que se va a buscar. Entonces eso es todo para este video. En el siguiente video, estaremos profundizando en los servicios. Así que gracias por ver. Nos vemos en la siguiente. 9. servicios: Hola y bienvenidos al octavo video de la serie Flutter clean architecture, donde estamos haciendo una app completa usando una arquitectura más limpia. En este video, vamos a hablar de la parte de servicios. Entonces primero, iremos a la sección de código. Y dentro de los servicios, ya hemos realizado una clase abstracta llamada API service, que nos da el, que tiene una función, Get Data, que devuelve una futura dinámica de cadena de mapa. Así que vamos a implementar la superficie API aquí. Además de servicio BI IMP. Imp es términos de implementación que permanecerán si el servicio BI. Ahora agregaremos la función aquí y la anularemos. Aquí, estaremos usando un paquete y obtendremos datos de nuestra API externa. Y el paquete se llama HTTP. Entonces para eso, vamos a pasar. Y aquí vamos a escribir HTTP. Vamos a conseguir el paquete. Entonces al hacer esto, podemos copiar el nombre del paquete. Y aquí vamos básicamente a empaquetar dentro de los buscadores vectoriales. Ahora vamos a importar el paquete en nuestro servicio API. Y diremos que importantes HTTPS, HTP, HTTP. Podemos obtener los datos de nuestro HTTP y cómo de nuestra API. Y como podemos hacer esto es que hay una función útil llamada HTTP GET. Y esta función get, obtendremos los datos requeridos de nuestra API externa de esta. Entonces lo que tenemos que hacer es dar, primero veamos qué toma esta función get. La función get toma un URI, como puedes ver aquí. Y obtienes función también toma encabezados, pero también requerirá parámetros de consulta también. Como podemos ver. Esta es la API principal que estará proporcionando los q iguales a Bitcoin. La clave Api es igual a F a través de una clave API va a GPI. Guarde esto a nuestros parámetros de consulta que también necesitemos agregarlo aquí. Entonces veamos cómo vamos a hacer eso. Bien, así que primero agreguemos la URL para eso. Tenemos que proporcionar la URL aquí, ¿verdad? URL de streaming, y la agregaremos aquí dentro también. También estás, como puedes ver, que estamos necesitando parámetros de consulta. Entonces tendremos otro mapa. Cuerda, dinámica. Padres listos. Tenemosque agregarlo aquí. ¿ Bien? Ahora la URL no es una URL de cadena real, URI. Necesitamos analizar la cadena, la agregas de cualquier manera. Podemos hacer esto usando tu eres pensé caminos. Y para dar los parámetros de consulta de Kusto, necesitamos llamar a una función replace. Y aquí podemos agregar los parámetros usando dos partículas grasas. ¿ Bien? Entonces ahora estamos obteniendo los datos de nuestro instinto. Almacenemos los datos en alguna parte. Para hacer eso, necesitamos hacer la función en una función sinc. Y el resultado aquí, tendríamos respuesta final igual a http.get. Veamos qué devuelve esto. Devuelve una respuesta. Escríbalo aquí. Bien, Ahora bien, si el código de estado de respuesta es igual, es igual a 200, esto significa que habíamos obtenido con éxito, hemos obtenido con éxito los datos de la API. Entonces ahora podemos devolver los datos aquí, devolver cuerpo de respuesta. El cuerpo está en realidad en formato de cadena, que es Jason adelante. Tenemos que decodificar esto y convertirlo en un formato de mapa. Ya que estamos devolviendo map string dynamic desde la función get. Así que en la derecha json punto decodificar, y dentro de aquí, vamos a obtener la respuesta por defecto, bien. Además, podemos escribir como respuesta dinámica de cadena matemática si el código de estado no es 200. Esto significa que no pudimos obtener los datos de nuestra API. Eso fue algún problema. Hubo algún problema de red. Esa vez vamos a lanzar una excepción con algún mensaje. A ver. Estado, estado de punto de respuesta . Hablamos. Bien. Entonces, lo que estamos haciendo aquí es que estamos obteniendo los datos de nuestra API usando un parámetro de consulta personalizado. Y si conseguimos los datos, esa vez los estamos devolviendo en mapas a en formato dinámico. Y si no estás obteniendo la devolución, entonces en realidad hacemos una excepción. Ahora pasemos por la sección de datos dentro nuestras fuentes de datos y dentro la implementación de fetch from remote data source. Daremos la URL aquí y el parámetro de consulta. Ahora, para hacer eso, necesitas ir aquí y obtener la clave API se presiona el botón de la tecla API de puerta. Necesitas dar tu nombre, tu dirección de correo electrónico y elegir una contraseña. Y presentado. Después de eso, obtendrás la clave API. Pero aquí sólo voy a estar iniciando sesión. Entonces déjame iniciar sesión y luego te lo mostraré. Bien, aquí tengo mi clave API. Yo sólo lo copio. Guárdalo en algún lugar seguro por ahora, hagamos que comience una nueva carpeta llamada cadenas. Esto no es cuerda, son cuerdas. Cuerdas. E instalé la clave API aquí con una variable estática. También. Seguiré siendo URLs también aquí. Entonces tengo uno, todo lo que agregaste, que es este. Yo copiaría éste y estequiometría. Bien. Ahora vamos a nuestra función de buscar noticias. De adentro hacia afuera, obtenga datos remotos para alguna limitación. Y mira esas URL serán cadenas, punto API de todo lo que eres y por qué el parámetro de consulta será un mapa. Y esto contendrá cookies. Vamos a revisar qué libros. Uno será Q, el texto fuente. Si no tenemos una especie de pasos, sólo podemos darle un texto concreto. Por ejemplo, como líneas de cabina. Bien, entonces el uso normal que vamos a conseguir, será obtenerlo de los principales titulares. Entonces, si copiamos este y necesitamos pegar el KPI de clave API, aún no lo habías hecho. Todo el titular lo usaremos cuando busquemos algunas noticias de todos los artículos. Y los titulares principales estarán buscando cuando el, no hay texto dentro de nuestra búsqueda. ¿ Bien? Entonces qué podemos hacer esto, si el texto de búsqueda no es igual a nulo, ese tiempo parte de todos los artículos. Si nuestro texto de búsqueda es igual, igual a nulo, ese tiempo comienza desde las plantillas superiores. Este es el operador ternario, que estamos viendo que si X es nulo, haga lo primero después del signo de interrogación. Y si el texto de búsqueda no es igual a si start es nulo. Esa cosa con la segunda cosa. Este es el operador ternario. Si el texto de búsqueda no es igual a nulo, entonces haga lo primero que esté presente después del signo de interrogación, que es cadenas, API todo. Y si el texto de búsqueda es igual, igual a nulo, entonces pon el segundo, que es tal vez hablé largamente. Entonces cuando hay algunos consejos de búsqueda a la hora de investigar algo de música de nuestro todo. Y si no hay tales pasos, entonces sólo estamos regresando el tema. Y dentro de nuestro parámetro de consulta cae. Entonces vamos a escribir si el texto de búsqueda es igual, igual a nulo, esa vez no lo hacemos, necesitamos proporcionar el país. Así que en la derecha. Contrario a la India. O podemos averiguarlo estadounidense-soviético. Y si el texto de búsqueda no es igual a nulo, esa vez, necesitamos proporcionar dentro o todo si vemos, necesitamos proporcionar una señal que es el texto de búsqueda aún se le da Bitcoin, puede ser cualquier cosa. Entonces escribiríamos cubo y será igual a buscar texto. Y sin importar, el texto fuente es nulo o no, necesitamos proporcionar la clave API, que se da aquí también, que se da aquí también, ¿verdad? Clave Api. La clave API será única para todos y cada uno de los usuarios. Y necesitas obtenerlo después de iniciar sesión o registrarte en la música BI.com. Tengo a mi Rey del FBI y lo he guardado en las cuerdas. Más. Entonces usemos esa API extrema de Scott. Bien, así que hemos implementado nuestros servicios dentro del API service dot file. Y hemos utilizado este servicio en nuestro archivo de fuentes de datos. Ahora viene una parte muy importante. Estamos llamando al servicio dentro del construido a partir de fetch de la fuente de datos remota. En nuestro video localizador de servicios, discutimos un consejo muy útil sobre cómo podemos registrar estos servicios en una sola función y llamarlo dentro de la principal. Y no necesitamos preocuparnos por inicializar estas clases. Cada, Hagámoslo. Primero, estaremos creando una nueva carpeta llamada o un nuevo archivo dentro de nuestra propia carpeta llamada service. Servicios. Localiza nuestro oscuro oscuro. Dentro de aquí importamos el paquete, escribiremos final, consígalo. Sl. Sl significa localizador de servicios es igual para obtenerlo instancia. Haremos una nueva función llamada set up services. Aquí registramos nuestros servicios. El primer servicio que se registrará es el servicio API, Justin Sterling. Todos los servicios son singletons. Así registra el servicio API singleton. Y aquí estaríamos dando la implementación implementada del servicio API de Cluster. Registraremos bien las fuentes de datos, así que escribiríamos fetch from remote, ds. Desde remoto, sí, lo soy. Ahora podemos ver que está diciendo que hay un parámetro aditivo k, Entonces esto se requiere. Pero vayamos a nuestro aquí. Y ahora podemos eliminar este y obtener el servicio API de nuestros servicios de ESL ubicados. Importante proceder. Podemos llamarlo servicio API. Y wallah. No necesitamos llamar al servicio API dentro de nuestro constructor. Podemos obtenerlo directamente de un servicio. Maravilloso. Volvamos a ir a nuestra encuesta se encuentra y se registra nuestro repositorio. Llamaremos reporte por lotes. Y registramos efectos de implementación de ondulación. Aquí también, no requerimos defectos del cuerpo es ya que podemos obtenerlo de nuestro servicio con cualquiera de ellos, entremos dentro de nuestra implementación vegetal. Retire este y consígalo de nuestro servicio o mejor. Bien, genial. Ahora, como tenemos reporte de defectos adicionales de implementación, también podemos ir a nuestros casos de uso phi. Elimine este y obtenga el repositorio de nuestro localizador de servicios. Ahora, como comentamos en nuestro video de localizador de servicios, simplemente dando la clase de localizador de servicios o simplemente escribiendo la función de localizador de servicios. No va a funcionar. Necesitamos a todas las funciones dentro de p main.out fondo. Y para el, por llamar a la función. También necesitamos dar el mejor seguro vinculante inicializar. Esto asegurará todas las cosas que he inicializado antes de llamar a la función en brecha de Berlín. Ahora vamos a reconstruir la función que hemos escrito mucho bien. A ver si todo está funcionando bien o no. Apertura. Por ahora, todo está funcionando bien. Vamos a recapitular lo que hicimos. Implementamos nuestro servicio API aquí. Escribimos los datos get de usar el paquete HTTP. Y también, también lo hicimos fue si el libro de respuesta.status es igual a 200, luego devolvemos el cuerpo de respuesta como una respuesta dinámica máxima para el código sitters no se opone a 200, que significa que es algún error al obtener los datos de la API esa vez que lanzamos una excepción. Entonces eso es todo para este video. En el siguiente video, nos sumergiremos profundamente en la capa de presentación. Así que gracias por ver. Nos vemos en la siguiente. 10. Bloque con una visión general de la gestión del estado de Cubit: Hola y bienvenidos al noveno video de nuestra serie flutter clean architecture. Estamos haciendo una aplicación completa usando una arquitectura limpia. En este video, estaremos aprendiendo sobre la gestión estatal, que está bloqueada y cúbica. En este video, estaremos aprendiendo la gestión estatal usando un ejemplo. Y en el siguiente video, estaremos implementando nuestra gestión estatal dentro de nuestra app. Entonces antes de comenzar, necesitamos agregar dos paquetes. Uno es el paquete de bloques. Agreguemos el paquete de bloques en nuestro archivo Pub spec dot YAML. Y los otros paquetes revolotean bloque. Agreguemos también el bloque aleteo. También puede instalar una extensión práctica llamada block. Usando esto, puedes crear fácilmente bloques en tu aplicación. Déjame mostrarte cómo. Sólo tienes que ir a la carpeta principal. Selecciona la carpeta donde quieres crear el bloque o el cubit. Aquí quiero crear unos codos nuevos, así que voy a hacer clic en el cubo y darle el nombre. Digamos que voy a estar nombrando a éste al ejecutarlo. Para que pueda ver mi cúbico es, ha sido creado. También nombraré este cubit como texto subrayado dos, pero ahora también vamos a hacer una nueva página llamada texto DAG. Ahora no tienes que hacer la página de texto y detecta cúbico. Esto es sólo por mostrarte un ejemplo dentro del texto el cual voy a importar un punto material, punto y un apátrida con él. Página de texto. La página de texto contendrá un andamio con nuestro cuerpo. En el centro. Tendrá un hijo de botón elevado. El botón elevado tomará pulsado. Vamos a seguir, tener una función vacía aquí y un niño debe ser texto. ¿ Bien? Ahora vayamos a nuestro texto a ello. Esta yarda cúbica es la cúbica real. Y aquí están los pasos. Hagamos algunos estados nuevos. Este es el estado inicial, lo que significa el estado que está presente cuando la aplicación se está ejecutando. Si vas a cubicarlo, estamos, podemos ver que cada vez que se ha creado el cúbico, ya lo estamos inicializando con el estado inicial. Entonces dentro de nuestro estado haremos algunas noticias a nuevos estados. Una es la carga de texto y otra es el texto. Lo bailé. ¿ Bien? Ahora hagamos una nueva función. Dentro de nuestra función cúbica se mostrará nueva función de texto. Y en esta función, lo que quiero hacer es dejarme primero ir a nuestra media y cambiar la página principal a una página siguiente. Lo que realmente quiero hacer es que cada vez que haga clic en este botón, quiero mostrar un indicador de progreso circular. Y después de algún tiempo, quiero mostrar aquí, se necesita eso, es decir, digamos hecho o terminado. Hagámoslo. Entonces inicialmente voy a emitir un nuevo estado, que es el estado de carga de texto. Después de algún tiempo, esperemos 1 segundo. Y después están esperando 1 segundo, quiero emitir el texto, bailarlo. ¿ Bien? Nuestra función aquí se está haciendo. Llamemos ahora a esta función. Siempre que hagamos clic en el botón click, iremos a nuestra página de texto. Y aquí en vez de en prensado, se lo voy a dar. Ahora. Antes de eso, necesito importar también los paquetes de bloque flutter. Entonces podemos llamar a la función usando context dot read. Y dentro de leer, voy a estar nombrando el cubit de donde vamos a tomar la función punto. Mostrar nuevo texto. ¿Bien? Ahora lo que quiero hacer es crear un bloque aquí o un constructor de bloques aquí. Para que en vez del texto, voy a estar mostrando una vez el indicador circular de progreso y luego un texto que está diciendo que no. Lo que queremos mostrar en lugar de este botón, cuando hacemos clic en el botón, queremos mostrar un indicador de progreso circular y luego algo de textura. Entonces lo que tenemos que hacer es que tenemos que cambiar el botón elevado, quiere un indicador de progreso circular y luego hacerlo es. Veamos cómo vamos a hacer eso. Vamos a hacer eso usando un widget llamado construcción de bloques. Así que vamos a escribirlo aquí. Este constructor de bloques será de un cubit de texto. Y siguiente estado dentro del constructor de bloques, llamaremos constructor, que tomará dos cosas. Si vemos. Uno es el contexto construido y otro es el siguiente estado. Entonces vamos a dar esos contextos y estados. Ahora. Si el estado es fijo, inicial, no haga nada. Y así el botón, como lo era antes, si el estado es carga de texto, entonces no haga más que un indicador circular de progreso. Ahora bien, si el texto es, si el estado no es texto inicial o no carga de texto, entonces si vas a nuestro texto y luego solo le queda un estado, ese es el texto en nuestro otro siempre será el texto downstate. Entonces, cuando el estado esté hecho texto, mostrar un texto que sea el completado. Ahora para usar el bloque, necesitamos proporcionar el bloque a un widget que es el padre de los textos con él. Ahora bien, si vemos el padre de la página de texto rechazar es el widget de material app. Entonces necesitamos proporcionar nuestro bloque, que es el texto húmedo dentro de nuestra métrica o por encima de nuestro widget de aplicación de material. Entonces, ¿cómo podría hacerlo? A ver. Lo cortaremos desde aquí, y estaremos usando un widget llamado multiblock. Proporcionado. Aquí. Podemos tener múltiples proveedores. Por lo que un proveedor será proveedor de bloque. Y lo crearemos usando un contexto, que devolverá un cubit de texto. Y el niño será nuestro material ahora. ¿ Bien? Ahora si reiniciamos nuestro, veamos qué pasa. ¿ Bien? Entonces podemos ver que nuestro botón está aquí. Veamos qué pasa cuando hacemos clic en él. Hacemos clic en el botón. Mostró el indicador circular de progreso y luego los detalles de la empresa. Hagamos el retraso a cuatro segundos y luego volvamos a ver la aplicación. ¿ Bien? Entonces podemos ver una vez que estamos haciendo clic en el botón, se está inicializando el estado de carga de texto. Y después de cuatro segundos, el texto downstate ha sido inicializado. Entonces así es como funciona el bloque con cúbico. Entonces esta es la comprensión básica de la gestión estatal que vamos a utilizar. En el siguiente video, estaremos implementando la gestión estatal en nuestra aplicación, lo que significa la aplicación Noticias. Así que gracias por ver y nos vemos en la siguiente. 11. Implementación de bloques y cubit en la aplicación: Hola y bienvenidos al décimo video de nuestra arquitectura flutter clean ve dónde estamos construyendo una aplicación completa usando la arquitectura pain. En este video, vamos a incorporar nuestra gestión de estado de bloque y qubit a nuestra app. Entonces primero borra los codos de ejemplo, que hicimos en el video anterior. Entonces podemos hacerlo está bien. Podemos eliminar la página de texto. Ahora. Este también lo hará. Y en lugar de eso, vamos a proporcionar, estará proporcionando el cubit que se va a hacer en este video. Y aquí estaremos escribiendo la página principal. En eliminar las importaciones. Impresionante. Reiniciemos la aplicación. Los niños no pueden estar vacíos hasta ahora, simplemente eliminaremos este objeto. ¿ Bien? Ahora vamos a estar haciendo un nuevo Cupido. Iremos a la sección de presentación, y dentro de la carpeta de presentación estaremos haciendo una nueva llamada de cubitos. Noticias. Entonces como te dije en el último video, puedes tener una extensión muy útil llamada extensión de bloque, usando la cual puedes crear cubit fácilmente, como puedes hacer clic derecho aquí y crear un bloque de auditoría de cubitos. Pero ahora este es el cubit más y el nuevo estado voy a nombrar a este doblado nuevo estúpido. Ahora vamos a nuestras noticias cúbicas. Podemos ver que es por defecto que está teniendo la noticia paso inicial. Y dentro de los nuevos estados, tenemos un paso inicial de noticias. Tendremos dos estados más. El primer estado será noticia. Vamos a saltarlo a la inicial de noticias. El segundo estado será Carga de noticias, el tercer estado será Editor de Noticias. Ahora, dentro del paso inicial de noticias, tendremos otra cosa llamada D, lista de noticias info. Por lo que nuestra iniciativa de noticias contendrá las noticias que se van a mostrar aquí. Ahora, nuestro nuevo estado inicial contendrá las noticias que se van a mostrar aquí. Pongamos nuestro analito inicial de noticias que iniciaremos cuando inicialicemos inicialmente las noticias con una lista vacía. Veamos la constante. Y luego estaremos escribiendo una función llamada void fetch news function con el texto de búsqueda aquí. Y luego estaremos llamando a nuestra función desde los casos de uso, que es esta función fetch snooze function para eso estará registrando esta dentro de nuestro localizador de servicios. Entonces digamos que registra esto. Caso de uso de desnudos elásticos. Fetch sabe. Bien. Ahora vamos a nuestra nueva habilidad, pero punto punto Phi. Y aquí vamos a estar consiguiendo la nevera Novedades caso de uso. Importemos la celda aquí. Esoes localizador de servicios. Y bien, ahora podemos usar este fetch News, use case object dentro de nuestra función fetch news. Entonces usemos eso. Entonces escribiremos fetch News. Usa kickstart, busca noticias con el texto de búsqueda. Veamos a qué está regresando esto. Nos está devolviendo un futuro, ya sea fracaso o noticia en una lista de cosas. Así que vamos a obtener el resultado de que estamos usando esperar. Ahora, vamos a estar consiguiendo justo el ya sea después de la Tierra. Entonces escribiré definitiva tal noticia. El resultado es igual a dos. Y esto tendrá un tipo de datos de ya sea fracaso o esta dura información de noticias. Ahora, tenemos el paquete tarts, que nos da el tipo de datos, también nos da una función muy útil usando cual podemos segregar nuestras cosas, lo que estaremos haciendo cuando se consiga una falla. Y podemos segregar las cosas que vamos a hacer cuando nuestra lista de información de noticias estemos recibiendo. Entonces, ¿cómo podemos hacerlo? Podemos hacerlo usando la función completa que el DOD schizo, ¿verdad? Obtener el resultado de noticias pliegue de punto. Y aquí podemos ver que hay dos funciones. Una es la función left que se invocará cuando se haya devuelto el resultado izquierdo. Y una función correcta que se invocará cuando se haya devuelto el resultado correcto. Entonces, si se ha devuelto el resultado izquierdo, emitiremos el estado de error de noticias. Y si se ha invocado el derecho, estará emitiendo el estado inicial noticioso. Pero con la noticia. Dado que esta función devuelve una lista de noticias info cuando el, cuando no hay error. Por lo que esta r también tendrá una lista de museo para esto, L tendrá un fracaso. ¿ Bien? Ahora, antes de hacer nada, también necesitamos emitir el estado de carga de noticias. Porque cada vez que vayamos a buscar las noticias, primero mostrará la pantalla de carga y luego va a buscar las noticias. Después de ir a buscar la noticia, si hay un fallo, entonces mostrará que el Dennett tendrá el estado de error. Y si no hay falla y la función ha devuelto la lista de noticias info, entonces tendremos el estado inicial de noticias con la música, con la lista de música para. Ahora. Usemos esta función en nuestra página de inicio. Entonces para eso, necesitamos hacer nuestra página de inicio un widget con estado. Hagamos eso. Y dentro de nuestra página de inicio, tendrá una función init. Ahora bien, la función init es una función muy útil. Esta función sólo se llamará la primera vez que se haya inicializado la página. Por lo que esta función sólo se llamará cuando la primera vez que se haya inicializado la página principal. No estábamos también eso sólo cuando la primera vez que la página de inicio, la nación se inicializó, queremos llamar a las noticias fetch o a esta función. Entonces hagámoslo. Para eso necesitamos importar nuestro paquete Better Block. Y luego vamos a escribir contexto punto, leer, noticias, cubit, punto buscar noticias. Y el texto de búsqueda será nulo. Desde un principio solo queremos buscar los textos normales. Esto nos está dando un error. La razón es que no hemos proporcionado la cubeta de noticias en nuestro punto principal, punto cinco. Entonces hagámoslo. Incluso cortamos este. Escribe un proveedor multibloque aquí. Tendremos algunos proveedores o lista de proveedores. Podemos tener solo lista de proveedores o incluso un solo proveedor. Estaremos creando proveedor de bloques. Dentro del Create. Tendremos una función que estará devolviendo el nuevo sesgo. Y el niño será nuestro material. Podemos importar la temperatura de las noticias. Bien, ahora ya terminamos. Vamos a reconstruirlo una vez, reinicie la aplicación. ¿ Bien? Ahora podemos ver que nuestro bloque está funcionando, pero necesitamos hacer algunos cambios más de adentro hacia afuera en la interfaz de usuario para que nuestro bloque esté conectado con los cubics. Entonces siempre que haya un cambio de estado, según eso, el DUI también cambiará. Entonces, para hacer eso, tenemos que ir en nuestra página de inicio. Tenemos que ir a nuestro ListView. Aquí adentro. En lugar del ListView hará un bloque de bloque. El constructor de bloques estará fuera de News cubit y news state. Tomará función constructor aquí, que tomará un contexto y el estado. Si el estado es noticia inicial, nada, mostrar el ListView. Y en lugar de contar artículos, ahora usaremos el DOT estatal. Noticias longitud punto, que estamos pasando por aquí. Las noticias que son posiblemente, cambiemos el nombre de los movimientos R2. ¿ Bien? Entonces las noticias que agregarán pasando aquí dentro nuestra nueva noticia inicial estado que estamos usando aquí. Entonces siempre que el estado sea nuevo veneciano, use las noticias que se proporcionan en el estado inicial de noticias. Entonces lo escribimos y simplemente cuentan van a reafirmar esa longitud de punto de noticias. Y bien, por ahora , que sea esto. Y si el estado no es noticia inicial, si el estado es noticia cargando, esa vez, devolverá un centro con un indicador circular de progreso con un color de, digamos, si el estado no es noticia inicial, si el estado no es noticia y cargando, entonces sólo nos queda un estado más. Esa es la era de las noticias. Esa vez lo que podemos hacer es por ahora, solo mostraremos un texto. Eso es un envolverlo en una oración. Bien, así que terminamos con nuestro constructor de bloques en nuestra página de inicio. Ahora vamos a New scarred. La cartilla de noticias es un genérico para cada carnet de noticias. Esta es una noticia general Scott, que estamos mostrando en todas las tarjetas de noticias aquí. Pero necesitamos tener información específica para todos y cada uno de los periódicos, que tendrán una imagen única, un título único, y así sucesivamente. Entonces, para hacer eso, necesitamos pasar la información de noticias dentro de todas y cada una de las nuevas cicatrices. Y según nuestra nueva información, estaremos cambiando el panorama o la marea. Entonces hagámoslo. En lugar de esta URL ahora usaremos news info dot image URL. Ahora, a medida que vamos a nuestra información de noticias, podemos ver que la URL de la imagen puede ser anulable. Podemos ver que esto es, esta puede ser la URL de la imagen puede ser una cadena o se puede hacer. También queremos comprobar que si la URL de la imagen de punto info de noticias no es igual a nula, solo entonces mostrar la imagen. Y también aquí podemos dar una señal explicativa, que será específicamente durante eso, sí, si la imagen que agregaste no es nula, entonces aquí también el adulto mayor no puede ser nulo. Ahora, aquí está la URL de la imagen es nula. No mostrar nada, solo una caja de tamaño constante. Ahora, vayamos a nuestro título. Aquí. Mostrará el título del punto info de noticias. Ahora aquí también podemos, sabemos que el título puede ser nulo o una cadena. Entonces aquí también tenemos que decir que si la noticia no es igual a nula, entonces la noticia info dot title. Y si es igual mostrar un texto sin título. Y tenemos que quitar la constante de aquí y agregar las de aquí. Desde antes dijimos que todo era constante, pero ahora esto no es constante. Cambiará de acuerdo a la información de noticias que estés pasando. Ahora. También terminamos con nuestras nuevas cicatrices. Vamos a la página de vista de noticias. Aquí también, estaremos pasando la información de noticias. Y ahora lo que tenemos que hacer es configurar nuestra exhibición de acuerdo con la información de noticias que estamos recibiendo. Entonces antes que nada, incluso cambiamos el título a noticias en photo dot title. Si no es igual a nulo, entonces usa la noticia en foto titulada suelta se da. Y si es igual a nulo, entonces no mostrar ningún título. Eliminemos la constante de aquí y agreguemos la constante a lo largo. Extracto. La imagen también cambiará. Lo cambiaremos a news info dot image URL. Y diremos que si la URL de la imagen de punto info de noticias no es igual a nula, entonces solo usa la URL de la imagen en la red de puntos de imagen. Y si es igual, igual a nulo, entonces tener una caja de tamaño constante. Ahora la deuda también tenemos que dar, hagamos una función. Digamos Obtener fecha en fecha en formato DD, MM, YY. Esta es una función que va a estar creando, será constante desde aquí. Vamos a crear esta función foster. Esta función devolverá null y elegirá una fecha, hora de nuestro objeto de información de noticias. Entonces lo que volveremos es datetime punto d. Después de esa barra diagonal hacia adelante, luego datetime punto mes, luego una barra diagonal hacia adelante, luego punto datetime. Entonces ahora usando datos dentro de la cadena, usando el signo de dólar y luego con llaves, esto se llama interpolación de cadena. Esto mostrará los datos dentro esta cadena junto con la otra cadena que está presente aquí. Entonces por ejemplo, si quieres mostrar el valor de 100 aquí, entonces alguna cadena. Puedes hacerlo así. Pasemos el punto de información de noticias datetime dentro nuestros datos en una función de formato DD MM YY. Entonces también tenemos que dar el nombre del autor aquí. Noticias en la comida punto autor. El autor también puede ser nulo. Entonces para eso comprobaremos si el autor no es igual a nulo, entonces solo usaremos el punto de información de noticias del autor más, ¿verdad? No. Autor. Y el contenido también estará borrando este Lorem. Ipsum text tendrá noticias info dot content. El contenido será, también puede ser nulo. Entonces, si el contenido no es igual a nulo, entonces solo usa el contenido. De lo contrario. No mostrar ruta local. Bien, creo que hemos terminado con nuestra página de vista de noticias también. Vayamos a nuestra página de inicio. Y como agregamos aquí la información de noticias, necesitamos agregarlas en nuestra página de inicio, también dentro de nuestra cartilla de noticias. También agregamos la información de noticias. Entonces también dijimos que se requiere parámetro, por lo que necesitamos agregarlo en nuestra página de inicio dentro de nuestra cartilla de noticias. Objeto. Vamos a agregarlo. La información de noticias es igual a las noticias del punto estatal. Eliminemos la constante de ellos. ¿ Bien? Entonces si vimos que el estado punto noticias contiene una lista de noticias info. Entonces todas y cada una de las noticias que podemos obtener usando noticias de punto estatal con un índice. Ahora hay buenas noticias. Dios, estamos, podemos ver que tenemos un error. La razón es la página de vista de noticias, necesitamos proporcionar la información de comidas. Entonces ya terminamos aquí. Reiniciemos la aplicación y crucemos los dedos. Debería serlo. Bien. Nuestro indicador circular de progreso estaba mostrando y podemos ver que también podemos ver la noticia. Abramos una noticia. Eso está bien. Podemos ver que las noticias que estamos recibiendo, la fecha, estamos recibiendo los animales de autor, estamos recibiendo el contenido también. Estamos consiguiendo, estamos consiguiendo los optimistas del título. Volvamos y abramos otra noticia. Bien, aquí también, lo mismo. Bien. Ahora, vamos a comprobar si nuestro texto de búsqueda, lo que está funcionando o no. Buscar en Apple. No le está pasando nada. La razón es que no hemos agregado nuestra funcionalidad de búsqueda aquí. Entonces agreguemos eso. Tenemos que ir a nuestra presentación dentro de nuestras páginas. Tenemos que ir a la página principal. Y dentro de nuestra página de inicio, necesitamos agregar un parámetro on changed, que tomará la constante de aquí. Vamos a sumar la constante en estos espacios. Ahora bien, lo que hará esta función onChange es siempre que estemos cambiando, Cambiemos el onchange a propio enviado. Entonces siempre que, después de escribir algo, digamos naranja. Y después de eso, estamos enviando haciendo clic en este botón. Estaremos buscando noticias relacionadas con el texto de búsqueda aquí, que es naranja y discutiremos. Entonces hagámoslo. Cómo podemos hacer eso es llamando a la nueva función. Entonces escribiremos contextos, punto, lectura, noticias, cubit, punto fetch noticias, junto con los palos de búsqueda que estamos dando aquí. Y también necesitamos especificar una cosa más. Pero veamos cómo está funcionando o no. Busquemos un poco de moneda. Bien, entonces nuestra funcionalidad de búsqueda también está funcionando. Siempre que buscábamos las noticias, era nos está mostrando algo agradable. Abramos la noticia. Bien, así que eso está funcionando bien. Busquemos con algunos otros nombres. Digamos Apple. El, The Apple News también es cierto. Vamos a bucear en Uno más. Newton. No es el Newton exacto que esperas, pero bien, vamos a escribir Google. Estamos buscando el buscador más popular en nuestra búsqueda. Pero vemos que nuestra función de búsqueda también es lo que. Pero si eliminamos todo el texto aquí y luego presionamos Enter, estamos recibiendo un error. Pero lo que realmente debería estar sucediendo es que si no hay texto presente aquí, mostrar el valor por defecto. Por lo que también tenemos que hacer eso si el texto de búsqueda recorte de punto. Recortar significa incluso si, aunque tengas algunos, digamos espacios aquí, esto también se considerará como nada presente dentro de nuestra parte de almacenamiento. Por lo que introducimos un recorte. Si nuestro recorte es igual, no equivale a nada, no hay texto o evitar texto. Esa vez. Tener una búsqueda y mostrar los medios predeterminados. Y las noticias por defecto por defecto, quiero decir que el texto de búsqueda será nulo. Y si ese no es el caso, entonces. Entonces estos se estiran. Veamosahora si no hay textos presentes dentro de nuestra barra de búsqueda. Y luego presionamos Enter, deberíamos obtener la noticia por defecto y estamos obteniendo la predeterminada. Pero si hay algún texto, entonces estamos obteniendo las herramientas de búsqueda. ¿ Bien? Entonces todo está funcionando ahora, pero necesitamos cambiar también algunas cosas, pocos detalles. La noticia principal es que se debe mostrar cuando estamos mostrando las noticias por defecto. Pero cuando apenas estamos mostrando alguna búsqueda linchada, esa vez, se deben buscar las principales noticias . Entonces hagámoslo. Para hacer eso, necesitamos hacer un nuevo estado, que se llama el estado de búsqueda inicial de noticias. Ahora bien, este estado será invocado siempre que el texto de búsqueda no sea igual a nulo. Entonceslo escribimos aquí. Si el texto de búsqueda no es igual a nulo, emitir la búsqueda inicial de noticias. Estado. De lo contrario. Simplemente inicializar las iniciativas noticiosas. Ahora vamos a nuestra página de inicio. Y ahora aquí, si el estado es nuevo inicial, mostrar el ListView, y si el estado es búsqueda inicial de noticias, esa vez también muestran esta disputa. Bien, ahora vayamos a nuestras principales noticias y esta vamos a cambiar. Entonces podemos envolver esto con una acumulación de bloques. Entonces esto es lo muy útil de usar block builder que no necesitamos cambiar toda la página o reconstruir toda la página. Siempre que haya un cambio de estado, podemos simplemente cambiar el widget en particular que queremos cambiar. Esta es la belleza de las declaraciones, ¿verdad? Contexto, estado. Y si el estado es noticia inicial, ese tiempo vuelve a la normalidad. Noticias principales. De lo contrario si el estado es nuevo, búsqueda inicial, esa vez mostró la búsqueda a noticias, noticias a crédito. Y si el estado no es ni inicial de noticias ni de búsqueda inicial de noticias, entonces devuelva un presupuesto vacío o una caja de tamaño constante. Bien, vamos a probarlo. Si teníamos en nuestra pantalla inicial, cuando había una carga, no mostraba ningún widget. Nuevamente, si entramos a novae solo mostrando la parte superior cerca de 0, cuando las noticias principales están mostrando el encabezado es noticia principal. Y si se trata de un nombre de búsqueda, las noticias de búsqueda tenían un problema. Bien, genial. Ahora también, vamos a estar haciendo algún manejo de errores aquí. Vamos a limpiarlo todo. Comentemos por ahora. Comentemos esta parte por ahora y emitamos el estado de error noticioso. Veamos qué se está mostrando aquí. Reiniciemos la f. y cuando haya un estado de error de noticias, solo estamos mostrando que hay un texto de error en la pantalla. Lo que deberíamos estar haciendo cuando hay un estado de error de noticias es que debemos darle al usuario un botón de recarga para que si hay un error con la llamada del APN, entonces podamos recargar nuestro app y llamará a la API una vez más. Entonces hagámoslo. Ahora. Si hay un error, entonces en lugar de solo el texto, queremos darle un botón de icono. El botón del icono tomará un encendido presionado. Démosle por ahora una función vacía y un icono. El icono será, puedo empezar. Rejugamos y esto debería estar bien. Y el color de la misma será Deep Blue. El tamaño será, digamos 24. Y vamos a darle una constante aquí. Y lo que realmente queremos hacer con este botón de recarga, queremos volver a llamar a la función fetch news dentro de nuestras noticias, buenas noticias con el texto de búsqueda nulo. Entonces, si hacemos esto por ahora, no va a pasar nada porque aquí acabamos de imitar un error de noticias. Pero si eliminamos el error de noticias de aquí, y si descomentamos esto, y ahora, si presionamos el botón Cargar, debería mostrarnos lo normal, bonito. Pero el default significa wallah tan pronto como el default news. Si reiniciamos la app una y otra vez, pruébalo, veamos qué está pasando. Nuestra noticia inicial se ha mostrado con el encabezado de noticias superior y se muestra la imagen, se muestra el encabezado. Las fotos se están cargando. Y si vamos a una noticia, podemos ver que se está mostrando el título, se están mostrando las unidades. Se está mostrando la fecha cuando se publicó, el autor Naomi tejido y el contenido también estamos ahora si buscamos algún texto, buscamos, algunas noticias hora buscada noticias también se están mostrando con las noticias de búsqueda encabezadas. Y si no hay texto dentro de nuestro campo de texto de búsqueda, entonces la instalación por defecto. Así que hemos implementado nuestro bloque con gestión de estado qubit dentro de nuestra app. Y nuestra app es completamente completa y funcional. Entonces en el siguiente video, voy a estar hablando la parte modular de la arquitectura limpia. Estaremos viendo por qué es modular y cómo podemos. También voy a estar mostrando cambiando un paquete muy importante que lo estamos usando. Y voy a estar mostrando con qué facilidad podemos cambiar el paquete sin afectar a otros códigos presentes aquí usando esta arquitectura limpia. Así que gracias por ver. Nos vemos en la siguiente. 12. Prueba de la modularidad de la arquitectura limpia: Hola y bienvenidos al undécimo video y al video final de nuestra serie aplanada de arquitectura limpia, donde estamos construyendo una aplicación completa usando arquitectura verde. En este video, estaremos probando la modularidad de la arquitectura limpia. Desde el primer video, tengo fingiendo que la arquitectura limpia es muy modular. Con eso, quise decir que podemos cambiar fácilmente cualquier cosa en cualquiera de estos apartados sin afectar el código de otras sesiones. Entonces en este ejemplo, vamos a cambiar nuestro paquete HTTP en nuestro servicio API a algún otro paquete nuevo actualizado. Veamos qué paquete vamos a usar. Estaremos usando un paquete llamado dy. Vamos a la biografía y agreguemos el paquete DO en nuestro archivo Pub spec dot YAML. Hemos agregado dial en nuestro archivo YAML de punto de especificaciones de bombilla. Y vamos a pasar por nuestra encuesta se localiza y se registra. Registró nuestro diodo. Ahora recuerda una cosa. Es necesario registrarse antes del servicio API. La razón es que usarás el paquete de marcación en nuestro servicio API. Entonces necesitamos registrar morir primero y luego tenemos que registrar la superficie API. Ahora solo por esa razón, estamos registrando nuestro servicio API antes de la obtención de la fuente de datos remota. La razón es que estamos utilizando el servicio API dentro de nuestros peces desde una fuente de datos remota. Ahora vamos a nuestro servicio API y vamos a estar borrando. Esta línea. Escribirá la respuesta final es igual a dos. Antes de eso, también necesitamos obtener el diodo. Importemos nuestro localizador de servicios. Ahora vamos a escribir diodo punto get función. Ahora la función get, vemos que toma la ruta y toma tres parámetros también. La parte será la URL aquí, y los parámetros serán donde los padres, ¿bien? Y devuelve un futuro de respuesta. La respuesta tendrá una respuesta a ello. Ahora bien, el, esto será respuesta punto da, da datos. Ya que estamos usando la respuesta del descanso en forma de diapasón, todo se salvará. Ahora, reiniciemos a nuestro aspirante. Bien, entonces estamos recibiendo un error. Veamos qué error somos creados. Si imprimimos aquí, datos de inicio de respuesta. Podemosver si, ya sabes, se imprime respuesta.data. Si imprimimos la respuesta.data aquí, veamos qué pasa. ¿ Bien? Entonces esta se está imprimiendo. Entonces nuestro error debe estar en algún lugar dentro de nuestras fuentes de datos. Bien. Vamos a nuestro archivo de fuentes de datos. Y dentro de nuestra captura, vamos a imprimir la edición. Entonces podemos ver que HashMap interno o una dinámica de cadena de mapa no es un subtipo de cadena. Esto se está mostrando porque si vamos a nuestro servicio API, estamos usando JSONData llamado el código dentro de nuestro response.body dentro de nuestro paquete HTTP. Nos da una versión neófita de cuerda de la cosa dinámica de la piedra del mapa. Pero aquí estamos obteniendo directamente los tipos dinámicos máximos, por lo que no necesitamos usar este. Entonces podemos borrarlo aquí. Y si lo volvemos a ejecutar, veamos qué pasa. ¿Bien? Entonces estamos obteniendo nuestros datos o algún minuto y ver si eso también está funcionando. Vamos a buscar. Bien. Por lo que la funcionalidad de búsqueda también está funcionando. Esta es la facilidad con la que podemos cambiar las cosas en nuestra arquitectura limpia sin cambiar nada. Si viste, solo tuvimos que cambiar dos a tres líneas en nuestro servicio API dot, dot file. El resto, todos y cada uno de los archivos decía están teniendo el mismo código. No tuvimos que cambiar ningún otro archivo excepto el servicio API. Entonces esta es la belleza de la arquitectura limpia. Esto es tan útil que podemos cambiar fácilmente cualquier cosa sin cambiar ni alterar otras peleas. Entonces eso es todo para este video. En este curso, realizamos una aplicación completa desde cero usando arquitectura limpia. Espero que también seas capaz de construir la aplicación conmigo. Y gracias por ver toda la serie hasta el final.