Master Clean Architecture in Flutter | Rahul Agarwal | Skillshare
Suchen

Playback-Geschwindigkeit


1.0x


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

Master Clean Architecture in Flutter

teacher avatar Rahul Agarwal, Flutter Developer & Trainer

Schau dir diesen Kurs und Tausende anderer Kurse an

Erhalte unbegrenzten Zugang zu allen Kursen
Lerne von Branchenführern, Ikonen und erfahrenen Experten
Wähle aus einer Vielzahl von Themen, wie Illustration, Design, Fotografie, Animation und mehr

Schau dir diesen Kurs und Tausende anderer Kurse an

Erhalte unbegrenzten Zugang zu allen Kursen
Lerne von Branchenführern, Ikonen und erfahrenen Experten
Wähle aus einer Vielzahl von Themen, wie Illustration, Design, Fotografie, Animation und mehr

Einheiten dieses Kurses

    • 1.

      KURSEINFÜHRUNG

      0:53

    • 2.

      Clean Architecture Übersicht

      8:14

    • 3.

      UI

      45:36

    • 4.

      Entities

      5:35

    • 5.

      Service Locator Package

      5:52

    • 6.

      Usecases und Repositorien

      8:42

    • 7.

      Modelle

      12:08

    • 8.

      Datenquellen und Repositories

      16:03

    • 9.

      Dienstleistungen

      17:57

    • 10.

      Bloc mit Cubit State Management Übersicht

      9:32

    • 11.

      Bloc und Cubit Implementierung in der App

      33:28

    • 12.

      Testen der Modularität der sauberen Architektur

      7:00

  • --
  • Anfänger-Niveau
  • Fortgeschrittenes Niveau
  • Fortgeschrittenes Niveau
  • Jedes Niveau

Von der Community generiert

Das Niveau wird anhand der mehrheitlichen Meinung der Teilnehmer:innen bestimmt, die diesen Kurs bewertet haben. Bis das Feedback von mindestens 5 Teilnehmer:innen eingegangen ist, wird die Empfehlung der Kursleiter:innen angezeigt.

161

Teilnehmer:innen

--

Projekt

Über diesen Kurs

Clean Architecture ist der Grundsatz für ein modulares System, das dem Designprinzip „Trennung von Anliegen“ strikt folgt. Genauer gesagt, konzentriert sich dieser Architekturstil darauf, Software in Ebenen zu teilen, um die Entwicklung und Wartung des Systems selbst zu vereinfachen. Wenn Schichten gut getrennt sind, können einzelne Stücke wiederverwendet und unabhängig entwickelt und aktualisiert werden.

In diesem Kurs machst du eine ganze Anwendung von Grund auf mit Clean Architecture und Bloc und Cubit State Management. Du kannst auch REST API mit zwei verschiedenen Paketen Http und Dio einbauen. Und du lernst mehr über Dependency Injection und wie du es mit get_it einfach machst. Du lernst die Dateistruktur einer echten Welt Anwendung und wie du deinen Code skalierbar und modular gestalten kannst.

Die saubere Architektur teilt das Flutter in 3 Hauptschichten auf, nämlich:

Präsentationsschicht

Die Präsentationsschicht besteht aus dem Code, um die Daten der App aus einem Repository zu erhalten. Außerdem gibt es den Code für das State Management wie Provider, BLoC und so weiter.

Domain

Die Domain-Ebene ist die tiefste in der sauberen Architektur. Diese Ebene enthält den Code für business wie Entitäten und Use Cases.

Datenschicht

Die Datenschicht befindet sich auf der äußersten Ebene. Diese Schicht besteht aus data wie z.B. Consume Rest API, Zugriff auf die lokale Datenbank, Firebase oder andere Quellen. Außerdem gibt es auf dieser Ebene normalerweise den layer, der die Benutzeroberfläche (Widgets) aufbaut.

Triff deine:n Kursleiter:in

Teacher Profile Image

Rahul Agarwal

Flutter Developer & Trainer

Kursleiter:in

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.

Vollständiges Profil ansehen

Level: Intermediate

Kursbewertung

Erwartungen erfüllt?
    Voll und ganz!
  • 0%
  • Ja
  • 0%
  • Teils teils
  • 0%
  • Eher nicht
  • 0%

Warum lohnt sich eine Mitgliedschaft bei Skillshare?

Nimm an prämierten Skillshare Original-Kursen teil

Jeder Kurs setzt sich aus kurzen Einheiten und praktischen Übungsprojekten zusammen

Mit deiner Mitgliedschaft unterstützt du die Kursleiter:innen auf Skillshare

Lerne von überall aus

Ob auf dem Weg zur Arbeit, zur Uni oder im Flieger - streame oder lade Kurse herunter mit der Skillshare-App und lerne, wo auch immer du möchtest.

Transkripte

1. KURSEINFÜHRUNG: Eine, um eine reale Anwendung mit der richtigen Architektur die Geschäftslogik und das Whiteboard zu trennen. Dann ist dieser Kurs perfekt für dich. In diesem Kurs erstellen Sie eine komplette Anwendung von Grund auf neu, indem Sie eine saubere Architektur mit Block- und kubischer Zustandsverwaltung verwenden. Sie werden auch die Rest-API mithilfe von zwei verschiedenen Paketen, HTTP, in Ihre Anwendung integrieren . Und Sie werden auch etwas über Dependency Injection mit dem Paket getters lernen. Und vor allem lernen Sie, wie Sie Ihr Telefon in drei verschiedene Ebenen, Daten-, Domänen- und Präsentationsebenen unterteilen und Ihr Modul erstellen. Ich heiße. Und in diesem Kurs wird Ihr Lehrer sie trocken ausgetrickst. Ich hoffe es wird euch gefallen. Also, ohne weitere Zeit zu verschwenden, sich jetzt an und lassen Sie uns loslegen. 2. Clean Architecture Übersicht: Willkommen zum ersten Video unseres Kurses, das in der Architektur flattert. In diesem Video werden wir etwas über saubere Architekturen lernen . Bevor wir uns also mit sauberer Architektur befassen, müssen wir wissen, warum Architektur überhaupt verwenden sollten. Wenn Sie eine kleine oder mittlere App haben, sagen wir eine App, bei der Sie einige Tasten drücken müssen. Und in der Benutzeroberfläche wird ein Bild oder ein Anzeigetext angezeigt. Dann brauchst du keine Architektur, da es eine sehr einfache Handlung ist. Und die Integration einer Architektur in diese Art von App wird ein schwieriger und zeitaufwändiger Prozess sein. Aber nehmen wir an, Sie haben eine sehr große Anwendung, in der nicht nur Sie, sondern viele weitere Entwickler am selben Projekt arbeiten. Nehmen wir zum Beispiel an, Sie erstellen sehr große Apps wie Uber oder eine sehr große App. Zomato, das Ding. Nicht nur Sie, sondern viele weitere Entwickler arbeiten an einem einzigen Projekt. dieser Zeit hilft Ihnen eine richtige Architektur nicht nur dabei, die Entwicklung zu beschleunigen, sondern hilft auch, ein Entwurfsmuster im gesamten Anwendungsentwicklungsteam zu standardisieren ein Entwurfsmuster im gesamten . Eine sehr gut strukturierte Architektur hilft uns auch , den Code zu modularisieren. Hier kommt ein wunderschöner Teil der sauberen Architektur. Eine saubere Architektur hilft den Anwendungsentwicklern , den Code zu modularisieren. Was meine ich mit Modularisierung? Modularisierung des Codes bedeutet, separate Abschnitte für jede unabhängige Menge zu haben . Wenn Sie zum Beispiel ändern möchten, dass es einen Backend-Dienst gibt, den Sie verwenden, sagen wir, feuern Sie diesen aus. Und später möchten Sie es in ein benutzerdefiniertes Backend ändern und dann die Architektur modularisieren. Sie können dies sehr einfach tun, ohne andere Ebenen zu beeinflussen. Auch, wenn Sie beispielsweise ein Paket verwenden, das vorerst einwandfrei funktioniert. Aber später möchten Sie das Paket für die Benutzerfreundlichkeit in ein anderes Paket ändern , Andy, zur Verbesserung der Anwendung in dieser Zeit können Sie diese modularisierte Architektur verwenden, können Sie diese modularisierte Architektur verwenden um einfach ein paar Dateien ändern. Und dann können Sie die Anwendung wieder so ausführen, wie sie war. Wie wir jetzt wissen, wird diese Architektur für Anwendungen mittlerer oder großer Größe benötigt . Warum sollten wir uns also für eine saubere Architektur entscheiden? Es gibt viele weitere architektonische Optionen wie MVVM, MDD. Siehst du, warum sollten wir Clean Architect verwenden? Um das zu verstehen, müssen wir die grundlegende Struktur einer sauberen Architektur kennen . Eine saubere Architektur unterteilt den Code in drei verschiedene Ebenen. Eine ist die Präsentationsschicht, zweite ist die Domänenschicht. Drittens sind die Daten. Präsentationsschicht besteht aus der Benutzeroberfläche und der Präsentationslogik. Die Darstellungslogik ist die staatliche Verwaltung. Zum Beispiel staatliche Verwaltung wie Block, Block mit Cubit, Provider, Fieber, Pot, GetX und so weiter. Die Domainschicht ist dünner, wo unsere Hauptgeschäftslogik der App enthalten wird. Die Domänenschicht besteht aus drei Abschnitten. Der Abschnitt „Entitäten“, der Abschnitt „Anwendungsfälle“ und die Repositorys schließen solche Verträge ab. Lassen Sie uns nun ein wenig über jeden dieser Abschnitte erfahren. Die Entität ist Teil, enthält die Objekte, die wir verwenden werden , um die Daten in unserer Benutzeroberfläche zu präsentieren. Die Anwendungsfälle enthalten die Hauptlogik, zum Beispiel die Überprüfung des Passworts und die Validierung von E-Mails. Und der Repository-Vertrag enthält den Vertrag oder die abstrakte Klasse , von der wir die Daten beziehen. Jetzt ist die Datenschicht die Ebene, von der wir die Daten aus externen Quellen wie APIs oder Datenbanken beziehen, oder sogar oder falsch. Die Datenschicht besteht aus drei Abschnitten. Repositorys, Implementierung, bei der wir die Repositorys implementieren werden , die im Repository-Vertrag enthalten waren. Hier sind es auch der Abschnitt des Modells und die Datenquellen. Keine Modelle werden sich von den Entitäten aus erstrecken. Anti-Datenquellen holen die Daten von APIs oder Datenbanken oder sogar von unseren Leuten ab. Nun, wie wir es früher waren, hilft eine saubere Architektur, den Code zu modularisieren. Dies bedeutet auch, dass jeder Abschnitt ein unabhängiger Abschnitt ist, die Darstellungsschicht, B, Domänenschicht und die Daten voneinander unabhängig sind. Wenn wir also etwas in der Datenschicht ändern, sollte dies die Präsentationsebene nicht beeinflussen. Es ist Domänenschicht. Wenn wir etwas in der Präsentation ändern, sollte dies keine Auswirkungen auf die Domänenschicht und die Daten dort haben. Da unsere App nun separate Ebenen für die Benutzeroberfläche und die Logik hat, hilft sie auch beim Testen des Codes. Schreiben von Komponententests für die, speziell für die Logiken. Und das Schreiben von Widgets für DUIs wird sehr einfach erledigt. Bevor wir uns mit dem Coding-Teil dieses Kurses befassen, wollen wir uns zunächst ansehen, was das Erlernen der sauberen Architektur tatsächlich bedeuten wird . Also werden wir diese Anwendung machen, die Neuigkeiten anzeigt. Und wir werden eine News- oder API verwenden, bei der es sich um eine Open-Source-API handelt. Wenn wir jetzt auf diese Nachricht klicken, wird eine neue Seite geöffnet auf der wir den Rest der Bedürfnisse sehen können. Außerdem können wir nach neuen suchen, sagen wir, ich habe die gesuchten Nachrichten nicht wirklich angezeigt. Lassen Sie uns nun eine neue Anwendung erstellen. Werde die App für Anwendungsnachrichten benennen, richtig? Und wir öffnen die Anwendung im VS-Code. Okay. Sehen wir uns nun die Dateistruktur an. Zuerst haben wir einen Ordner namens Features. In der App, die wir gezeigt haben. Es gibt nur eine Funktion, die die Nachrichten anzeigt , oder? Die neue Funktion in dieser Nachrichtenfunktion wird also drei Abschnitte haben. Zuerst der Abschnitt „Präsentation“. An zweiter Stelle steht der Domain-Bereich. Drittens ist die Datenerhebung. Jetzt, abgesehen von den Funktionen, wird es auch eine Core-Datei geben. Jetzt wird der Inhalt der Kerndatei nicht nur in einem oder zwei Funktionen verwendet, sondern sollte im gesamten Antragsteller verwendet werden. Ein Ordner ist konstant. Ein weiterer Ordner wird Fehler enthalten und Erfolge werden später im Kurs zu diesem Teil kommen. Ein weiterer wird der Service sein. Dies sind externe Dienste, die wir alle nutzen werden, sagen wir Pakete. Das ist also die grundlegende Ordnerstruktur. Im nächsten Video beginnen wir mit der Benutzeroberfläche der Anwendung. Also danke fürs Zuschauen. Wir sehen uns in der nächsten. 4. Entities: Willkommen zum dritten Video unserer Serie „Flutter Clean Architecture“, in dem wir eine komplette App mit der sauberen Architektur erstellen . In diesem Video werden wir durch die Domainebene gehen. Und in der Domänenschicht haben wir, wie wir gesehen haben, drei Abschnitte. Entitäten, Anwendungsfälle und Repository sind vertraglich festgelegt. In diesem Video werden wir uns also den NTD-Teil ansehen. Bevor wir also in den Code springen, wollen wir genau sehen welchen Daten die Entität erstellt wird. So können wir die Daten in news api.org abrufen. Wenn du also auf news api.org gehst, kannst du dort die Dokumentation bekommen, dich einloggen und den API-Schlüssel später im Datenbereich bekommen . Aber jetzt schauen wir uns an, an welchen Daten wir arbeiten werden. Gehen Sie also zu Dokumenten, Dokumentation und klicken Sie dann auf alles. Das ist also eine API, und diese API gibt uns, wann immer wir eine Get-Anfrage stellen, diese API uns JSON-Daten. Benötigt den Autorennamen, den Titel, der Autor ist ein String-Format. Wie Sie sehen können, ist das Titin auch im String-Format. Und wir brauchen auch die URL des Bildes, Ergebnisse im String-Format. Und veröffentlicht bei ist auch im String-Format. Dies ist das Datum und die Uhrzeit. Der Inhalt ist ebenfalls im String-Format. Okay, jetzt machen wir unsere Entität. Also gehen wir in den Abschnitt Funktionen. Und innerhalb des Domain-Bereichs erstellen wir einen neuen Ordner namens Entitäten. Innerhalb der Entitäten wird eine neue Entität namens News info dot erstellt, Punkt wird eine Klasse erstellen, die als News Info bekannt ist. Und zuerst braucht es eine Reihe von Titeln. Die zweite wird eine Reihe von Änderungen sein. Das dritte ist eine Zeichenfolge von Bildern, die Sie zuvor hinzugefügt haben, ist eine Zeichenfolge von Inhalten. Und die fünfte wäre die Art von öffentlicher Statik. Jetzt fügen wir alles in unserem Konstruktor hinzu. Jetzt, außer Datetime. Alles kann nullfähig sein. Beispielsweise kann ein Nachrichtenartikel einen Titel oder manchmal sogar keinen Titel haben. Normalerweise sollte jeder Nachrichtentyp zu jedem Nachrichtenartikel einen Titel haben, aber es kann einen Fehler in der Datenbank geben , vielleicht auf der Rückseite der Person, die den Nachrichtenartikel schreibt , möglicherweise habe vergessen, den Titel hinzuzufügen. Also müssen wir diese Randfälle gerne in Betracht ziehen. Also müssen wir den Titel nullfähig machen. Der Autor kann auch nullfähig sein, sodass auch imageURL vorhanden sein kann oder nicht. So dass auch Inhalte vorhanden sein können oder nicht. Damit auch wir gegeben werden, aber die Datetime bleibt erhalten denn wann immer eine Nachricht veröffentlicht wird, muss sie vorhanden sein. Abgesehen davon müssen wir, abgesehen von Datetime, nichts anderes erforderlich machen. Das erforderliche Schlüsselwort bedeutet wir jedes Mal, wenn wir die Nachrichteninformationen aufrufen, die Datetime hinzufügen müssen. Nun, was genau sind die nullbaren Typen? Zum Beispiel, wenn wir eine Zeichenfolge von, sagen wir Namen, haben und ich hier einen RAM-Namen gebe. Wir sagen dort ausdrücklich Dark. Die Namensvariable nimmt einen Datentyp einer Zeichenfolge und der Wert der Namensvariablen immer eine Zeichenfolge und kann niemals eine Nullvariable sein. Aber wenn wir es als String mit einem Fragezeichen zuweisen, dann sagen wir Dark, dass die Namensvariable eine Zeichenkette oder keine sein kann. Zum Beispiel kann der Name auch nicht sein. Das wird auch funktionieren. Wir sind also fertig mit der Entität, die Teil unserer Bewerbung ist. Im nächsten Video werden wir etwas über ein sehr wichtiges Paket erfahren , das wir verwenden werden, nämlich den Service Locator oder das Get it-Paket. Also danke, dass du dir dieses Video angesehen hast. Wir sehen uns im nächsten. 5. Service Locator Package: Hallo und willkommen zum vierten Video der Serie Flutter Clean Architecture, in dem wir eine komplette App mit sauberer Architektur erstellen . In diesem Video lernen wir ein sehr wichtiges Paket namens Get it package kennen. Nun, was hilft uns dieses Get it-Paket bei der Anpassung, bevor wissen, dass wir wissen müssen, was genau Dependency Injection ist. Was genau ist Dependency Injection? Sehen wir uns ein Beispiel an. Also machen wir eine neue Datei. Sie müssen diese Datei nicht erstellen. Diese Datei ist nur für dieses Video gedacht. Es könnte DIE Beispiel dot, dot sein. Und hier importieren wir unser Material Dot Dot Paket. Und wir werden einige Skip-List-Widgets erstellen. Machen wir das zuerst, dann erkläre ich es. Okay. Wie Sie sehen können, handelt es sich um einen Dummy-Button , für den es einen erhöhten Knopf braucht. Und Sie können sehen , dass unsere Schnullerbox auf unseren Schnullerknopf angewiesen ist. Auch. Wir können sehen, dass wir einen Dummy-Knopf haben , der ein erhöhter Knopf ist. Wir haben eine Dummy-Box, die vom Bestimmungsknopf abhängt. Wir haben eine Dummy-Karte, die von der Schnullerbox abhängig ist, die wiederum vom Dummy-Button abhängig ist. Und wir haben unsere Dummy-Seite, die von der Dummy-Karte abhängig ist, die von der Dummy-Box abhängig ist und die vom Dummy-Button abhängig ist. Wenn wir nun eine Klasse von Schaltflächeninformationen haben eine Klasse von , die die Informationen der Schaltfläche speichert. Sagen wir zum Beispiel x hier. Und wenn wir das hier weitergeben wollen, damit wir dieses hier verwenden können. Jetzt müssen wir diese Schaltflächeninformationen in all diesen Widgets übergeben . Mal sehen, wie wir unseren Dummy-Button vollständig in unserer Schnullerbox eingegeben haben. Jetzt müssen wir die Button-Informationen in unseren Dummy-Karten weitergeben , damit wir sie in unserer Dummy-Box verwenden können. Da wir jetzt die Button-Info in unserer Dummy-Karte verwenden, müssen wir sie auch auf unserer Dummy-Seite übergeben. Wir haben also gesehen, dass wir nur die Button-Informationen in unserem Dummy-Button verwenden . Aber da all dies abhängig ist, müssen wir unsere Button-Informationen ganz oben weitergeben. Um dieses Problem zu vermeiden, kommt D, hol es Paket. Um darauf zugreifen zu können, müssen wir auch speziell unsere Setup-Services-Funktion in der Hauptpunktdatei aufrufen . Dazu müssen wir zuerst seine erste Faktorbindung geben, müssen wir zuerst seine erste Faktorbindung geben, die sicherstellt, dass sie initialisiert wird. Dieser initialisiert die Dinge, die für die Erstellung der nativen Plattformen , die in unserem iOS und Android erforderlich sind, benötigt initialisiert die Dinge, die für die Erstellung nativen Plattformen , die in unserem iOS und Android erforderlich sind unserem iOS und Android werden, bevor etwas in der App ausgeführt wird. Jetzt rufen wir die Setup-Dienste und jetzt sind wir fertig. Also das war es für dieses Video. Im nächsten Video werden wir das Paket Get it im Teil Use Cases und Repositorys verwenden. Und wir brauchen auch den Service Locator, für den Sie ihn jetzt löschen können, werden diese im nächsten Video erstellen. Also danke fürs Zuschauen. Wir sehen uns in der nächsten. 6. Usecases und Repositorien: Hallo und willkommen zum fünften Video unseres Flutter Clean Architecture-Kurses, in dem wir eine komplette App mit der flutter clean-Architektur erstellen. Im heutigen Video werden wir im Domain-Bereich etwas über Anwendungsfälle und Repolarisierung und Repositorys lernen Anwendungsfälle und Repolarisierung und . Gehen wir also zu unseren Funktionen. Und innerhalb der Domain erstellen wir einen neuen Ordner namens Use Cases. Und lass uns einen weiteren Ordner namens Repositories erstellen. Innerhalb der Anwendungsfälle erstellen wir eine neue Datei namens fetch News. Punkt. Dot wird eine neue Klasse namens Fetch News erstellen. Und innerhalb der Klasse schreiben wir eine Funktion namens fetch news. Vorher möchte ich über ein Paket sprechen , das Dots-Paket genannt wird. Lassen Sie uns zuerst sehen, dass das Paket mit weißen Punkten benötigt wird. Gehen wir zu Pop Dot Diff und suchen nach Punkten. Lassen Sie uns dieses Paket in unser Projekt importieren. Gehen wir zu einer YAML-Datei mit Pub-Spezifikation. Wenn wir jetzt etwas abrufen oder etwas oder von einer Funktion abrufen, können wir normalerweise nur einen einzelnen Datentyp zurückgeben. Zum Beispiel, wenn wir eine Zukunft mit Nachrichteninformationen haben und ich sage „Nachrichten abrufen“. Diese Funktion kann also nur Nachrichteninformationen zurückgeben. Aber es könnte einen Fall geben, in dem wir von unserem Backend aus keine Neuigkeiten und so weiter erhalten, aber wir bekommen einen Fehler. Also dieses Mal wollen wir nicht die Nachrichten vollständig zurückgeben, sondern einen Fehler zurückgeben. Wie können wir das machen? Wir können das mit Punkten machen. Also lasst uns zuerst Punkte importieren. Und mit diesen Starts können wir entweder ein Beides erstellen. Mit beiden können wir zu Datentypen zurückkehren. Nehmen wir an, einer ist int und der andere ist string. Was wir eigentlich zurückgeben wollen, ist ein Fehlschlag. Und gibt es eine Liste von Nachrichteninformationen. Lassen Sie uns nun diese Fehlerklasse erstellen. Und der Fehler wird in unserer gesamten App verwendet. Dafür müssen wir es also im Code erstellen. Wir haben bereits eine Datei namens Fehler und Erfolge erstellt . Hier erstellen wir eine neue Datei namens Failures dot, dot. Wir erstellen eine abstrakte Klasse. Misserfolg. Es wird eine String-Nachricht geben, die die Fehlermeldung enthält, falls vorhanden. Jetzt erstellen wir einen neuen Fehler namens Fetch. Holen Sie sich das Video, wodurch der Fehler verlängert wird. Und hier drinnen werden wir einen ständigen Konstruktor erstellen. Welcher Misserfolg? Und da wir den Fehler verlängern, müssen wir die Nachricht in diesem Super weitergeben. Jetzt können wir zurückkehren, wir können diesen löschen. Jetzt können wir den Abruffehler hier zurückgeben. Wenn wir die Phineas importieren. Okay? Das ist jetzt der Domain-Layer. Wir wollen kein Geschäft, keine Datenlogik innerhalb unserer Domain schreiben . Die Domain darf nur aus der Geschäftslogik wie Passwort, Validierung, E-Mail-Validierung usw. usw. bestehen wie Passwort, Validierung, E-Mail-Validierung usw. usw. . Um also die Datenschicht mit der Domänenschicht zu verbinden, müssen wir Repositorys verwenden. Nun, wie können wir das nutzen? Gehen wir zu unseren Repositorys und gründen eine neue Republik. Zuallererst müssen wir den Namen von Fake News ändern. Gefälschte Nachrichten. Anwendungsfälle, Anwendungsfälle, damit wir trennen können, ob es sich um einen Anwendungsfall handelt. Jetzt wird in unseren Repositorys eine neue Datei namens Fetch Repo Contract Punkt, Punkt erstellt. Da es sich um einen Vertrag handelt, wird dies nur eine abstrakte Klasse sein. Was meinen wir mit abstrakter Klasse? Sie fahren zum Beispiel ein Auto. Sie drehen das Rad, Lenkrad in die linke Richtung. Das Auto fährt in die linke Richtung. Du starrst gegeben in die richtige Richtung, das Auto fährt in die richtige Richtung. Sie wissen, dass das Auto durch Lenken des Rads nach links oder rechts fährt. Aber weißt du, was das innere Funktionieren des Darms bedeutet , weißt du nicht? Abstrakte Klassen sind also einfach so. Es wird uns Funktionen geben, mit denen wir die Arbeit erledigen können. Aber wir müssen nicht genau wissen, wie genau die Funktion ist, ist die Arbeit, die in der Funktion erledigt wird eine abstrakte Klasse aus dem Fetch-Ventrikel erstellen aus . Hier werden wir eine Funktion des zukünftigen Scheiterns haben. Aber lass uns das neue ZoomInfo beenden. Nein. Wir können zu unseren Anwendungsfällen gehen und die Fed importieren. Soll ich hier hinstellen? Ordnung, ich nenne das The Vegetal Pol hier. Jetzt. Jetzt können wir einfach die Fetch Repo Dot Fetch News hier zurückgeben. Wir sind also fertig mit unserem Anwendungsfall. Und was haben wir mit unserem Repository gemacht? Aber wir haben hier auch eine Suchfunktion. wird also nicht funktionieren, nur die PECC-Nachrichten zu haben. Wir müssen auch für die Suchfunktion einen Link erstellen. Wenn Sie beispielsweise nach einem Text suchen , zu dem er ihn eingegeben hat, müssen wir zurückkehren Wir suchen hier nach Texten und Nachrichten. Dazu müssen wir auch ein anderes Feld namens Suchtext übergeben . Das kann jetzt null sein. Wir suchen Text kann gemacht werden, wenn er null ist, zeigt nur die normalen Nachrichten an. Und wenn der Suchtext nicht Null ist, zeigt diese Zeit die Suchnachrichten an. Jetzt müssen wir es auch in unseren Anwendungsfällen hinzufügen. Hier fügen wir auch eine Zeichenfolge mit Suchtext hinzu. Okay? Jetzt sind wir fertig. Im nächsten Video. Wir werden dort an den Daten arbeiten. Also danke fürs Zuschauen. Wir sehen uns in der nächsten. 7. Modelle: Hallo und willkommen zum sechsten Video unserer Serie „Flutter Clean Architecture“, in dem wir eine komplette App mit der sauberen Architektur erstellen . In diesem Abschnitt werden wir die Datenschicht starten. Und innerhalb der Daten wird es mit den Modellen beginnen. Erstellen wir zunächst einen Ordner im Datenordner, Fehlermodelle. Lassen Sie uns innerhalb der Modelle ein neues Modell namens News Info model dot, dot erstellen . Und lassen Sie uns eine Klasse namens News-Info-Modell erstellen, die die Nachrichteninformationen erweitert. Jetzt müssen Sie einen Konstruktor der Modalklasse erstellen und super funktional sein. Lassen Sie uns nun sehen, was die Superfunktion verlangt. Es ist obligatorisch, nach einer DateTime zu fragen. Der Name des Autors, der Inhalt, das Bild, das Sie entdeckt haben. Wir wussten, dass der Titel ImageURL-Inhalt und der Autor alle Zeichenfolgen sind und Datetime, Datetime Time. Aber die Daten, die wir erhalten werden, werden im JSON-Format sein. Alles. Wir werden einen anderen Datentyp haben. Lassen Sie uns zuerst sehen, welcher Datentyp glücklich sein wird. Also müssen wir zu news api.org gehen, zur Dokumentation gehen. Gehen Sie in der Dokumentation zu allem. Und lassen Sie uns überprüfen, was der Datentyp unserer Daten ist , den wir von unserer News-api.org erhalten. Apl ist ein String, was okay ist. Titel ist auch eine Zeichenfolge, was in Ordnung ist. Du bist genug. Das Bild ist auch ein String. Wir haben das veröffentlicht, das ist die DateTime. Es ist auch in einer Zeichenfolge, was unerwünscht ist. Bemerkenswert ist aber, dass der Inhalt auch in Street ist. Okay, jetzt wissen wir, welche Datentypen wir von unserer API erhalten. Also lass uns hier schreiben. Beim Schreiben. Zuerst benötigen wir den Titel, dann den Namen des Autors, dann die Bild-URL, den Inhalt und die Daten. In diesem Super wirst du den Titel und den Titel festlegen? Da der Titel in unseren Nachrichteninformationen auch eine Zeichenfolge ist, die nullwertfähig ist. Und auch hier ist der Titel eine Zeichenfolge, die formbar ist. Also ist es okay. Und unser Autor in unseren Nachrichteninformationen ist eine Zeichenfolge, die nullwertfähig ist. Auch hier ist es ein String , der nullfähig ist. Also können wir es einfach bestehen. Unsere Bild-URL ist ebenfalls eine Zeichenfolge, die nullwertfähig ist. Hero-Bild-URL, eine Zeichenfolge, die nullwertfähig ist. Wir geben es einfach hier weiter. Und unser Inhalt ist auch der gleiche, wie Sie jetzt unsere Nachrichteninformationen sehen können, Gestik, die nullbar sind, und Helden, also ist es eine Zeichenfolge. Die Datum/Uhrzeit in unseren Nachrichteninformationen ist jedoch eine Datum/Uhrzeit, die nicht nullwertfähig ist. Aber in unserem News-Info-Modell haben wir es auf eine Zeichenfolge gesetzt , die nicht eben ist. Der Grund dafür ist, dass die Daten , die wir erhalten, auch eine Zeichenfolge sind. Und wir erwarten, dass dies in einigen Fällen eine Null sein kann, also müssen wir uns darum kümmern. Was wir hier tun können, ist eine Funktion namens Get date, time zu erstellen . Im Datum-Uhrzeit-Format. Wir schreiben eine Funktion mit. Dann entfernen wir die Konstante hier. Nehmen wir eine statische Funktion , die einen Rückgabetyp von datetime mit demselben Namen haben wird . Und auch hier werden wir eine Zeichenfolge von Datetime übergeben, die nichts anderes als diese ist. Lass uns diesen Stream hier weitergeben. Jetzt. Zuerst werden wir sagen, wenn die DateTime gleich ist, gleich null ist, dann tun wir nichts. Geben Sie einfach eine Datum/Uhrzeit des aktuellen Datums- und Zeitpunkts zurück . Jetzt können wir die aktuelle Funktion datetime, datetime dot jetzt abrufen. Und wenn die DateTime nicht null ist, was ist dann zu tun? Dann gibt es eine sehr nützliche Funktion des Datums, mit der wir die Zeichenkette in den Datetime-Datentyp analysieren können. Mal sehen, wie wir das machen können. Wir schreiben das letzte Mal. Datetime, Datetime-Format aufgrund von Datums-Zeitpunkt-Stativen, Datetime. Jetzt tun es Stative. Stative versuchen, die Zeichenfolge date time, die diese ist , in einen Datetime-Datentyp zu konvertieren . Auch hier können wir einfach nicht nullable angeben, was bedeutet, dass hier die Datetime niemals null sein kann. Der Grund dafür ist, dass wir bereits überprüft haben , ob die Zeit Null ist, dann werden wir jetzt Time Dot zurückgeben. In der anderen kann die Datetime also niemals null sein. Also können wir dieses Ausrufezeichen geben. Und Mechaniker sagen ausdrücklich, dass innerhalb des anderen die Datetime nicht null sein wird. Außerdem geben die Stative das Datum und die Uhrzeit zurück, die jedoch nullwertfähig ist. Warum ist es nun nullfähig? Wenn, sagen wir, es versucht zu analysieren. Wir müssen das Ausrufezeichen hier nicht ausdrücklich angeben , da wir bereits prüfen, ob die DateTime nicht hier ist. Warum gibt die Funktion datetime dot tripods eine Datum/Uhrzeit zurück , die nullwertfähig ist? Der Grund dafür ist , dass Stative versuchen , das Datetime-Format oder die Datetime-Zeichenfolge an einen Datetime-Datentyp zu übergeben . Aber nehmen wir an, es kann das nicht konvertieren. Nehmen wir an, wir haben eine Zeichenfolge , die etwas Hallo ist. Nun, dieses Hallo kann nicht sein, dieses Hallo kann nicht in eine Datetime konvertiert werden. Datetime kann konvertiert werden, sagen wir, so etwas kann konvertiert, in eine Datetime konvertiert werden, aber hello kann nicht konvertiert werden. Was passiert also , wenn wir uns einige Texte geben , die nicht in eine Datetime konvertiert werden können, es gibt nur einen Nullwert zurück. Lass uns das Hallo in abhängig ändern. Nun, wenn das Format datetime, datetime gleich null ist, dann geben wir auch den Datetime-Punkt zurück. Jetzt. Das bedeutet nun, dass versucht wurde, die Datetime, die im String-Format vorliegt, auf eine Datetime im Datetime-Format zu analysieren, aber es konnte nicht. Das ist der Grund, warum wir das Datum und die Uhrzeit dieser aktuellen Zeit zurückgeben . Aber wenn es nicht null ist, wenn DateTime nicht null ist, dann meinen wir, dass es Wörter analysiert hat. Wenn dies der Fall ist, konnte es die Daten im Zeichenfolgenformat in Edit time analysieren , das im Datetime-Format vorliegt. Mal tun wir also nichts anderes als zurückgekehrt. Okay, also dieser ist fertig. Jetzt müssen wir eine andere Methode erstellen, die eine sehr hilfreiche Methode ist. Wir werden eine Thrombus-Map-Methode erstellen. Lass uns kreieren und dann werde ich es erklären. Was diese Methode nun macht, ist in der ersten Woche, welche Art von Daten wir bekommen. Hier erhalten wir Daten im JSON-Format. Oder wir können sagen, dass es sich um ein Kartenformat handelt, bei dem es sich um eine Zeichenfolge handelt, die unser t ist. Und der Wert ist dynamisch, was bedeutet, dass es sich um eine Zeichenfolge handeln kann. Es kann sein, es kann getan werden, es kann alles sein. Dynamisch bedeutet, dass es sich um eine Zeichenfolge handeln kann, es kann sich um einen beliebigen Datentyp oder eine Nullrichtlinie handeln. Um diese Karte in ein Museum für Modell umzuwandeln, benötigen wir eine Funktion und diese Funktion stammt von. Jetzt. Wir müssen dies ausdrücklich als Tatsache bezeichnen. Nun habe ich im Service Locator-Video erklärt, was ist eine Fabrik und was ist ein Singleton? Singleton. Instanz ist ein Singleton , bei dem wir dieselbe Instanz in der gesamten App verwenden . Aber in einer Fabrikmethode. Was getan wird, ist, dass bei jedem Aufruf eine neue Instanz dieses Objekts erstellt wird. Wann immer wir also eine from-map-Methode in unserer App aufrufen , wird dieses Mal eine neue Instanz des News-Info-Modells erstellt . Nehmen wir an, wir rufen in unserer App fünfmal von der Karte aus an. Also werden fünf neue Instanzen von Nachrichten und für Modem erstellt. Aber wenn es ein Singleton war, wird, selbst wenn es fünf Mal zurückgerufen wird, nur eine einzige Instanz erstellt. Okay? Jetzt müssen wir auch die Daten hier angeben, damit der Titel zugeordnet wird. Und wenn wir hier sehen können, müssen wir nur diese Werte hier abbilden. Den Titel hier können wir einfach hier kopieren. Und von der Karte mit dem Titel wird der Autor abgebildet. Und wenn wir es hier überprüfen, ist der Autor dieser Autor. Also können wir diesen kopieren und hier einfügen. Die Bild-URL ist eine Map- und Bild-URL. Url zu viel. Wir werden diesen kopieren und hier einfügen. Der Inhalt ist zugeordnet. Lass es uns hier nachschauen. Dieser Inhalt und die Uhrzeit, zu der veröffentlicht wird , beziehen sich auf dieses Thema, dieses. Und jetzt sind wir fertig mit den Nachrichten in for model.fit von der Map-Methode, die die dynamischen bidirektionalen Nachrichten der Kartenzeichenfolge konvertiert. Und für Herrn. Also danke, dass du dir dieses Video angesehen hast. Im nächsten Video werden wir tief in den Bereich Datenquellen und Repositorys eintauchen den Bereich Datenquellen und . Danke fürs Zuschauen. Wir sehen uns in der nächsten. 8. Datenquellen und Repositories: Hallo und willkommen zum siebten Video unserer Serie „Flatented Architecture“, in dem wir eine gesamte Anwendung mit Lean Architecture erstellen. In diesem Video werden wir über die Datenquellen und Repositorys im Datenbereich sprechen . Gehen wir also zuerst zu unserer Datendatei und erstellen einen neuen Ordner namens Repositories. In den Repositorys wird eine neue Datei namens Fetch-Bericht erstellt. In IMP, was Implementierungspunkt bedeutet, wird dot eine neue Klasse namens Which Report IMP erstellen, die ein solches Repo implementiert. Jetzt müssen wir das auch tun, da wir das Fetch-Repo implementieren, das in der Domänenschicht vorhanden war. Also müssen wir diese Funktion innerhalb des abgerufenen Repo-IMP überschreiben . Zum Außerkraftsetzen kann man einfach eine Sache nicht tun. Klicken Sie hier, drücken Sie Strg und Punkte und erstellen Sie ein fehlendes Überschreiben und tippen Sie hier darauf . Funktion wird automatisch erstellt. Jetzt wollen wir hier keinen Fehler auslösen, also löschen wir das. In dieser Funktion. Wir werden die Datenquellen aufrufen. Vorher müssen wir also die Datenquelle erstellen. Lassen Sie uns also einen neuen Ordner in der Datendatei erstellen , der als Datenquellen bezeichnet wird. Und innerhalb der Datenquelle wird eine neue Datei erstellt von Remote ds aufgerufen wird. Ds bedeutet Datenquellennamen als die, wie der Name schon sagt, wir holen die Daten von der Remote-Datenquelle ab, bei der es sich um eine externe API handelt. Also nannten wir es fetch aus mehreren Quellen. Lassen Sie uns eine abstrakte Klasse aus einer Remote-Datenquelle erstellen. Innerhalb der abstrakten Klasse werden wir eine Zukunft haben , die eine Liste mit Nachrichteninformationen zurückgeben wird . Modell. Der Name wird Fetch News sein. Und auch hier werden wir die Suchfunktion mithilfe des Suchtextes integrieren . Im letzten Video erklärte ich, ob der Suchtext null war, dann normale Nachrichten, wenn visuell und es neu startet Texte gingen keine verloren. Dann die Suchwerkzeuge in Scheffel. In der Verwendung des Abrufs müssen wir nun einen externen Dienst aufrufen, z. B. den HTTP-Dienst oder den gesamten Dienst, mit dem wir die Daten von unserer externen API abrufen müssen wir nun einen externen Dienst aufrufen, z. B. den HTTP-Dienst oder den gesamten Dienst, mit dem wir . Also lass uns das machen. Zunächst werden wir posten, bevor wir eine Karte der Zeichenkette dynamisch erstellen . Dies enthält die Daten , die uns von der API zur Verfügung gestellt werden. das zu tun, müssen wir den Service machen. Aber in diesem Video werden wir den Service nicht machen, also werden wir nur den Vertrag des Dienstes abschließen. Innerhalb des Kernordners haben wir also einen Dienste-Dienste-Ordner. Und innerhalb des Dienste-Ordners erstellen wir eine neue Datei namens HTTP oder sagen wir API, oder sagen wir API die wir gestartet haben, seit wir die Daten von APIs erhalten. Also schreiben wir APIs. Wenn es nicht erledigt ist. Lassen Sie uns diesen API-Dienst erstellen. Bitte erstellen Sie einen abstrakten Klassen-API-Dienst. Und innerhalb des API-Dienstes wird ein neuer Ordner erstellt. Zukünftige Zeichenfolge Dynamische Daten abrufen. Jetzt können wir das hier nennen. Hier. Was wir tun können, ist den API-Service zu erstellen. Da es sich um eine abstrakte Klasse handelt, müssen wir diese auch in einer separaten Klasse implementieren. Lass uns das Glas herstellen. Glasschutz vor Fernblühen gebe ich mir bis zu dem Zustand , der von Remote Support implementiert , was ist die Funktion? Und hier drinnen haben wir wahrscheinlich den API-Service durchgesetzt. Okay, jetzt haben wir den API-Service aufgerufen, und hier rufen wir die Funktion zum Abrufen von Daten in unserer API-Oberfläche auf, oder? Nicht extrem. Dynamisch ist gleich zwei. Oder wir können sagen, dass Daten gleich sind, um vielleicht anzufangen, anders zu werden. Auch wir müssen hier warten, da dies eine zukünftige Karte und Dynamik zurückgibt. Und da wir unseren Stuhl benutzen, müssen wir diese Funktion übernehmen. Okay, wir bekommen also die Daten, aber welche Daten wir tatsächlich bekommen, lass uns zu news api.org gehen. Insight-Dokumentation wird zu allen Daten gehen Die Insight-Dokumentation wird zu allen Daten gehen, die wir von der API erhalten, sind eine Karte. Und innerhalb der Karte, was die eigentlichen Daten sind, die wir wollen, sind diese Artikel. Diese Artikel enthalten eine Liste von Karten. Also lass mich zuerst programmieren und dann werde ich es tun. Also innerhalb der Daten, eine Liste zu bekommen, nennen wir es Liste von Artikeln. Wir können hier sehen, dass dies der Fall ist, wenn wir davon ausgehen, dass das Ganze die Daten sind, dann enthalten die Artikel innerhalb der Daten , wenn wir die Artikel erhalten , eine Liste. Nun, das ist eine Liste von Karten, aber die Karten in dieser und die Nachfrage im Herzen sind ein bisschen anders. Dafür können wir also eine neue Liste außerhalb der Map, Zeichenkette, dynamischer Liste erstellen. Ich habe nicht wirklich auf eine leere Liste initialisiert. Und wir durchlaufen alle Elemente in dieser Liste und konvertieren jedes Element in eine dynamische Kartenzeichenfolge. Lass uns das machen. Also würden wir es Map nennen. Es wird gleich der Liste sein. Und wir werden sagen, dass dieser Typ genauso kartendynamisch ist. Jetzt fügen wir diese Map in unsere Kartenliste ein. Karte voll bestückt bei. Okay. Jetzt können wir eine neue Liste von Nachrichten-Info-Modellen erstellen. Initialisieren wir es mit einer leeren Liste. Und jetzt werden wir alle Elemente in der Kartenliste durchqueren. Wir werden morgen jede Kartenliste in jede der Karten innerhalb der Karte konvertieren , dieses Museum. Lass uns das machen. Jetzt. Wir werden die Strong Map-Methode verwenden , die wir im Modellabschnitt erstellt haben. Wir nennen es als Verlust von Phil Martin von der Karte. Und die Map wird jedes der Elemente innerhalb von D-Maps sein. Jetzt fügen wir das Newsvendor-Modell in die News-Liste ein und kehren dann zurück. Okay, hier fertig. Aber nehmen wir an, hier ist ein Fehler aufgetreten. Nehmen wir an, unsere Funktion zum Abrufen von Daten zeigt einige Ausnahmen. Also müssen wir diese Ausnahmen hier auffangen. Was wir also tun können, ist gesamten Code zu kopieren und in einen try-catch-Block einzufügen. Wenn wir also einen Fehler bekommen, werden wir eine Ausnahme auslösen. Die Ausnahme kann jede Extraktion sein. Aber was wir eigentlich tun wollen, ist benutzerdefinierte Ausnahmen zu machen. das zu tun, müssen wir zu Misserfolgen und Erfolgen gehen und eine neue Datei namens Exceptional Stark Dark erstellen. Und wir erstellen eine benutzerdefinierte Ausnahme. Eine solche Ausnahme implementiert eine Ausnahme. Diese Ausnahme hier. Er ist ein Plus von Dark und es hat einen Fabrikbauer. Wie wir bei Fehlern gesehen haben, haben wir den Fehler verlängert, aber bei diesem können wir es hier nicht tun, weil wir eine Klasse nicht erweitern können. Wir haben nur einen Fabrikbauer, also müssen wir ihn implementieren. Erstellen wir also die hier erstellte Fetch-Ausnahme. Okay? Jetzt können wir diese Ausnahme auslösen. Sie können eine Ausnahme schreiben. Lassen Sie uns auch eine Nachricht geben, um loszulegen. Und lass es uns öffnen. Wir sind also fertig mit der Funktion zum Abrufen von Nachrichten in unserer Implementierung vom Abrufen von Remote-Datenquellen. Plus. Rufen wir diese Funktion innerhalb unseres Repositorys auf. Umsetzung. Werde zurückkehren. Zuerst. Wir kriegen den Kurs hier. Aber aus einer Remote-Datenquelle. Jetzt können wir diesen benutzen. Gesucht. Es besagt, dass dies einen Wert zukünftiger Listennachrichten in einem Format zurückgibt , das keine Methode haben kann , da diese Funktion es zurückgibt, entweder ein Fehler oder eine Liste mit. Was wir also tun müssen, ist es so zurückzugeben, oder? Okay? Was passiert also hier? Wir sagen, dass, da die Funktion fetch nice, return , eine Zukunft mit entweder einem Fehler oder einer Liste von Nachrichteninformationen zurückgibt . Wir sagen also, dass diese Funktion die rechte Seite des beiden Werts zurückgeben wird , was bedeutet, dass einer der beiden zwei Werte hat, entweder ein Fehler, all dieses Zeug bewegt sich in diese Funktion, gibt die rechte Seite der aufgelisteten Artikel zurück. Okay? Wir haben aber auch gesehen, dass die Datenquellen hier irrtümlich oder hier eine Ausnahme sind. Also müssen wir auch die Ausnahme in unserem Repository abfangen. Also können wir das tun, indem wir Catch Block ausprobieren. Aber wir haben auch gesehen, dass wir eine benutzerdefinierte Ausnahme des Projektabschnitts werfen. So können wir die Kundenausnahme bei der Pitch-Ausnahme erkennen . Und jetzt können wir auch einen Misserfolg auslösen. Also kehren wir links zurück. Welcher Fehler bei einer E-Punkt-Meldung. Dieses E ist nichts anderes als ein Objekt der fetch-Ausnahme. Wir müssen auch die Abschreibung Ihrer Daten für solche Nachrichten zurückgeben . Jetzt sind wir mit der Repository-Implementierung fertig, wir sind fertig mit den Datenquellen. Lassen Sie uns noch einmal zusammenfassen. Wir haben den Fetch-Bericht in der Implementierungsklasse den Fetch-Bericht in der auf wissenschaftlicher Ebene erstellt und implementiert. Wir haben dann die Datenquellen durchgesehen und die Datenquelle für die Diagnose erstellt. Wir haben eine Zusammenfassung der API-Servicekosten erstellt, die wir im nächsten Video implementieren werden. Und dann ändern wir die erforderlichen Datentypen. Datentypen von Maps Team Dynamic zu Museum for Model und geben dann die News- oder Three Fetch-Ausnahme zurück. Und dann haben wir innerhalb des Projektarchivs einen weiteren Try-Catch-Block verwendet, in dem wir, wenn es keinen Fehler gab , das Recht des Fehlers zurückgeben würden, nämlich Liste, Nachrichteninformationen und alle Ausnahmen. Wir werden die Ausnahme abfangen, die in unseren Datenquellen zurückgegeben wurde . Hier. Wir fangen das auf und geben dann die linke Seite des zurück, was ein Fehler ist, der abgerufen wird. Das war's also für dieses Video. Im nächsten Video werden wir uns eingehend mit den Dienstleistungen befassen. Also danke fürs Zuschauen. Wir sehen uns in der nächsten. 9. Dienstleistungen: Hallo und willkommen zum achten Video der Flutter Clean Architecture-Serie, in der wir eine ganze App mit sauberer Architektur erstellen . In diesem Video werden wir über den Teil der Dienste sprechen . Also gehen wir zuerst zum Code-Abschnitt. Und innerhalb der Dienste haben wir bereits eine abstrakte Klasse namens API-Service erstellt , die uns die gibt, die eine Funktion hat, Get Data, die eine zukünftige Kartenzeichenfolge dynamisch zurückgibt. Implementieren wir also die API-Oberfläche hier. Plus BI-Dienst IMP. Imp ist eine Implementierungsbedingung , die beim BI-Service erhalten bleibt. Jetzt fügen wir die Funktion hier hinzu und überschreiben sie. Hier werden wir ein Paket verwenden und Daten von unserer externen API abrufen. Und das Paket heißt HTTP. Also lass uns das durchgehen. Und hier werden wir HTTP schreiben. Wir holen das Paket. Auf diese Weise können wir den Paketnamen kopieren. Und hier werden wir im Grunde genommen den I-Lookups-Vektor verpacken. Jetzt werden wir das Paket in unseren API-Service importieren. Und wir werden sagen, dass wichtige HTTPS, HTP, HTTP. Wir können die Daten von unserem HTTP und wie von unserer API erhalten. Und wie wir das machen können, ist, dass es eine nützliche Funktion namens HTTP GET gibt. Und mit dieser Get-Funktion erhalten wir die erforderlichen Daten von unserer externen API dieser. Was wir also tun müssen, ist zu geben, lass uns zuerst sehen, was diese get-Funktion benötigt. Die Funktion get nimmt einen URI entgegen, wie Sie hier sehen können. Und Sie erhalten die Funktion nimmt auch Header, benötigt aber auch Abfrageparameter . Wie wir sehen können. Dies ist die Haupt-API , die das Q gleich Bitcoin bereitstellen wird. Der API-Schlüssel entspricht F über einen API-Schlüssel geht an GPI. Behalten Sie dies in unseren Abfrageparametern , damit wir es auch hier hinzufügen müssen . Mal sehen, wie wir das machen werden. Okay, also lasst uns zuerst die URL dafür hinzufügen. Wir müssen die URL hier angeben, richtig? Streaming-URL, und wir werden sie auch hier hinzufügen. Wie Sie sehen, benötigen wir auch Abfrageparameter. Also haben wir noch eine Karte. Zeichenfolge, Dynamik. Bereit Eltern. Wir müssen es hier hinzufügen. Okay? Jetzt ist die URL keine tatsächliche String-URL, URI. Wir müssen die Zeichenkette analysieren, du fügst sie auf irgendeine Weise hinzu. Wir können das mit Hilfe von dir machen. Ich dachte Pfade. Und um die Kusto-Abfrageparameter zu geben, müssen wir eine Ersetzungsfunktion aufrufen. Und hier können wir die Parameter mit zwei Fettpartikeln hinzufügen . Okay? Jetzt holen wir die Daten aus unserem Bauch. Speichern wir die Daten irgendwo. das zu tun, müssen wir die Funktion bei einer sinc-Funktion machen . Und das Ergebnis hier, wir hätten die endgültige Antwort gleich http.get. Mal sehen, was das zurückbringt. Es gibt eine Antwort zurück. Schreib es hier. Okay, wenn der Antwortstatuscode gleich 200 ist, bedeutet dies, dass wir erfolgreich die Daten von der API erhalten haben. Jetzt können wir die Daten hier zurückgeben und den Antworttext zurückgeben. Der Körper ist eigentlich im String-Format, was Jason Forward ist. Wir müssen das entschlüsseln und in ein Kartenformat umwandeln. Da wir Map String Dynamic von der get-Funktion zurückgeben . Also in der rechten JSON-Punkt-Decodierung und hier drinnen erhalten wir die Antwort für Standard, okay. Außerdem können wir als dynamische Antwort von Math String schreiben , wenn der Statuscode nicht 200 ist. Dies bedeutet, dass wir die Daten nicht von unserer API erhalten konnten . Das war ein Problem. Es gab ein Netzwerkproblem. Dieses Mal werden wir eine Ausnahme mit einer Nachricht auslösen. Mal sehen. Status, Status des Antwortpunktes . Wir haben uns unterhalten. Okay. wir hier tun, ist, dass wir die Daten von unserer API mithilfe eines benutzerdefinierten Abfrageparameters abrufen. Und wenn wir die Daten haben , geben wir sie diesmal in Karten im dynamischen Format zurück . Und wenn Sie die Rendite nicht erhalten, dann nehmen wir tatsächlich eine Ausnahme. Lassen Sie uns nun den Datenabschnitt innerhalb unserer Datenquellen und innerhalb der Implementierung des Abrufs aus Remote-Datenquellen durchgehen. Wir geben hier die URL und den Abfrageparameter an. Nun, um das zu tun, müssen Sie hier gehen und den API-Schlüssel auf die Gate-API-Tastentaste drücken. Sie müssen Ihren Vornamen Ihre E-Mail-Adresse angeben und ein Passwort wählen. Und eingereicht. Danach erhalten Sie den API-Schlüssel. Aber hier melde ich mich einfach an. Also lass mich einloggen und dann zeige ich es dir. Okay, ich habe meinen API-Schlüssel hier. Ich kopiere es einfach. Bewahren Sie es vorerst an einem sicheren Ort Lassen Sie uns einen neuen Ordner namens Strings Start erstellen. Das ist kein String, es sind Strings. Zeichenketten. Und ich habe den API-Schlüssel hier mit einer statischen Variablen installiert. Auch. Ich werde auch hier weiterhin URLs sein. Also ich habe eins, alles, was du hinzugefügt hast, und das ist dieses. Ich würde diesen und die Stöchiometrie kopieren. Okay. Gehen wir nun zu unserer Funktion zum Abrufen von Nachrichten. Inside Out-Abruf von Remote-Daten für einige Einschränkungen. Und schauen Sie sich diese URLs sind Zeichenfolgen, Punkt-API von allem, was Sie sind und warum der Abfrageparameter eine Map sein wird. Und das wird Cookies enthalten. Schauen wir nach, welche Bücher. Einer wird Q sein, der Quelltext. Wenn wir keine Art von Schritten haben , können wir ihm einfach einen konkreten Text geben. Zum Beispiel wie Cockpitlinien. Okay, also der normale Gebrauch , den wir bekommen werden, wird darin bestehen, es aus den Top-Schlagzeilen zu bekommen. Wenn wir diesen kopieren und den API-Schlüssel-KPI einfügen müssen, haben Sie dies noch nicht getan. Alles, was wir verwenden werden, wenn wir nach Neuigkeiten aus allen Artikeln suchen. Und Top-Überschriften werden gesucht, wenn das, Es gibt keinen Text in unserer Suche. Okay? Was wir also tun können, wenn der Suchtext nicht gleich Null ist, beginnt diese Zeit bei allen Artikeln. Wenn unser Suchtext gleich Null ist, beginnt diese Zeit bei den obersten Vorlagen. Dies ist der ternäre Operator, bei dem wir sehen , dass, wenn X Null ist, das erste nach dem Fragezeichen tun. Und wenn der Suchtext nicht gleich ist, wenn start null ist. Das Ding mit der zweiten Sache. Dies ist der ternäre Operator. Wenn der Suchtext nicht gleich Null ist, dann tun Sie das erste, was nach dem Fragezeichen vorhanden ist, nämlich Strings, API alles. Und wenn Suchtext gleich Null ist, dann setze den zweiten, was ich vielleicht ausführlich besprochen habe. Also, wenn es einige Suchtipps gibt, wenn man Musik aus unserem Alles recherchiert. Und wenn es solche Schritte nicht gibt, geben wir das Thema nur zurück. Und in unseren Abfrageparameter fällt. Also werden wir schreiben, wenn der Suchtext gleich Null ist , wenn wir das nicht tun, müssen wir das Land angeben. Also richtig. Im Gegensatz zu Indien. Oder wir finden es US-sowjetisch heraus. Und wenn der Suchtext nicht gleich Null ist, müssen wir dieses Mal innen oder alles angeben, wenn wir sehen, müssen wir einen Hinweis angeben, der der Suchtext ist, aber Bitcoin erhält, es kann alles sein. Also würden wir Würfel schreiben und es wird gleich Suchtext sein. Und unabhängig davon, ob der Quelltext null ist oder nicht, wir müssen den API-Schlüssel angeben , der auch hier angegeben ist , oder? API-Schlüssel. Der API-Schlüssel ist für jeden einzelnen Benutzer eindeutig. Und Sie müssen es erhalten, nachdem Sie sich bei music BI.com angemeldet oder registriert haben. Ich habe meinen FBI King und ich habe ihn in den Strings aufbewahrt. Plus. Verwenden wir also diese extreme Scott-API. Okay, also haben wir unsere Dienste in der Punkt-Punkt-Datei des API-Dienstes implementiert . Und wir haben diesen Dienst in unserer Datenquellendatei verwendet. Jetzt kommt ein sehr wichtiger Teil. Wir rufen den Dienst innerhalb der aus dem Abrufen aus der Ferne erstellten Datenquelle auf. In unserem Service Locator-Video haben wir einen sehr nützlichen Tipp besprochen, wie wir diese Dienste in einer einzigen Funktion registrieren und innerhalb der Hauptfunktion aufrufen können diese Dienste in einer einzigen Funktion registrieren . Und wir müssen uns keine Gedanken über die Initialisierung dieser Klassen machen. Jeder, lass es uns tun. Zuerst erstellen wir einen neuen Ordner namens oder eine neue Datei in unserem eigenen Ordner namens Service. Dienstleistungen. Finde unsere dunkle Dunkelheit. Hier drinnen importieren wir das Paket , schreiben final, holen es. Sl. Sl bedeutet, dass Service Locator gleich ist, um seine Instanz zu erhalten. Wir werden eine neue Funktion namens Dienste einrichten erstellen. Hier haben wir unsere Dienste registriert. Der erste Dienst, der registriert wird, ist der API-Dienst Justin Sterling. Alle Dienste sind Singletons. Registriert also den Singleton-API-Dienst. Und hier würden wir die implementierte Cluster-API-Dienstimplementierung geben . Wir werden die Datenquellen gut registrieren, also schreiben wir fetch from remote, ds. Aus der Ferne, ja, das bin ich. Jetzt können wir sehen, dass es einen additiven Parameter k gibt , also das ist erforderlich. Aber lass uns zu unserem hier gehen. Und jetzt können wir diesen löschen und den API-Service von unseren ESL-Diensten abrufen. Es ist wichtig fortzufahren. Wir können es API-Service nennen. Und Wallah. Wir müssen den API-Service in unserem Konstruktor nicht aufrufen . Wir können es direkt von einem Service bekommen. Wunderbar. Lass uns nochmal zu unserer Umfrage gehen und unser Repository registriert haben. Wir rufen Batch Report auf. Und wir haben die Implementierung von Effekten registriert. Auch hier benötigen wir keine Defekte am Körper da wir es auch von unserem Service bekommen können Lass uns in unsere Gemüseverarbeitung gehen. Entfernen Sie diesen und holen Sie ihn von unserem Service oder besser. Okay, großartig. Da wir jetzt zusätzliche Fehlerberichte aus der Implementierung haben , können wir auch zu unseren Anwendungsfällen phi gehen. Entfernen Sie diesen und holen Sie sich das Repo von unserem Service Locator. Nun, wie wir in unserem Service Locator-Video besprochen haben, indem wir einfach die Service Locator-Klasse angeben oder einfach die Service Locator-Funktion schreiben. Es wird nicht funktionieren. Wir brauchen alle Funktionen innerhalb von p main.out Fund. Und für den, für den Aufruf der Funktion. Wir müssen auch die verbindlichere Versicherung initialisieren. Dadurch wird sichergestellt, dass all die Dinge, die ich initialisiert habe , bevor ich die Funktion in Berlin aufgerufen habe, eine Lücke Lassen Sie uns nun die Funktion neu aufbauen die wir viel Gutes geschrieben haben. Mal sehen, ob alles gut funktioniert oder nicht. Eröffnung. Im Moment funktioniert alles gut. Lass uns noch einmal zusammenfassen, was wir getan haben. Wir haben unseren API-Service hier implementiert. Wir haben die Daten aus der Verwendung des HTTP-Pakets geschrieben. Und wir haben es auch getan, wenn das response.status-Buch gleich 200 ist, dann geben wir wenn das response.status-Buch gleich 200 ist, den Antworttext zurück, da eine maximale dynamische Antwort für Sitter Code nicht im Gegensatz zu 200 ist, was bedeutet, dass es sich um einen Fehler beim Abrufen der Daten von der API , wenn wir eine Ausnahme auslösen. Das war's also für dieses Video. Im nächsten Video werden wir tief in die Präsentationsebene eintauchen. Also danke fürs Zuschauen. Wir sehen uns in der nächsten. 10. Bloc mit Cubit State Management Übersicht: Hallo und willkommen zum neunten Video unserer Serie Flutter Clean Architecture. Wir erstellen eine komplette App mit einer sauberen Architektur. In diesem Video erfahren wir etwas über das staatliche Management, das blockiert und kubisch ist. In diesem Video lernen wir die Staatsverwaltung anhand eines Beispiels kennen. Und im nächsten Video werden wir unser State Management in unserer App implementieren. Bevor wir beginnen, müssen wir also zwei Pakete hinzufügen. Eines ist das Blockpaket. Lassen Sie uns das Blockpaket in unsere YAML-Datei Pub Spec Dot einfügen. Und die anderen Pakete flattern bloß. Lassen Sie uns auch den Flatterblock hinzufügen. Sie können auch eine praktische Erweiterung namens Block installieren. Auf diese Weise können Sie ganz einfach Blöcke in Ihrer Anwendung erstellen. Lass mich dir zeigen wie. Gehe einfach in den Hauptordner. Wählen Sie den Ordner aus , in dem Sie den Block oder Cubit erstellen möchten . Hier möchte ich einen neuen Cubits anlegen, also klicke ich auf cube it und gebe den Namen. Nehmen wir an, ich werde diesen bei Executiert benennen . Ich kann also sehen, dass mein Cubic erstellt wurde. Ich werde diesen Cubit auch als Textunterstrich zwei nennen, aber jetzt werden wir auch eine neue Seite namens Text DAG erstellen. Jetzt müssen Sie die Textseite nicht mehr erstellen und erkennt kubisch. Dies dient nur dazu, Ihnen ein Beispiel innerhalb des Textes zu zeigen , mit dem ich einen Materialpunkt, einen Punkt und einen Zustandslosen damit importieren werde . Textseite. Die Textseite wird ein Gerüst mit unserem Körper enthalten. In der Mitte. Es wird ein Kind mit erhöhtem Knopf haben. Die erhöhte Taste wird gedrückt. Lass uns folgen, habe hier eine leere Funktion und ein Kind sollte Text sein. Okay? Gehen wir nun zu unserem Text dazu. Dieser Kubikyard ist der eigentliche Kubikmeter. Und hier sind die Schritte. Lass uns ein paar neue Staaten gründen. Dies ist der Anfangszustand , also der Status, der vorhanden ist, wenn die App ausgeführt wird. Wenn Sie zu Cube gehen, können wir sehen, dass wir, wann immer der Kubik erstellt wurde, ihn bereits mit dem Anfangszustand initialisieren. In unserem Bundesstaat werden wir also einige Neuigkeiten in neue Staaten bringen. Eine ist das Laden von Text und eine ist der Text. Habe es getanzt. Okay? Jetzt machen wir eine neue Funktion. In unserer kubischen Funktion wird eine neue Textfunktion angezeigt. Und in dieser Funktion möchte ich zuerst zu unserem Mittelwert gehen und die Homepage auf eine nächste Seite ändern . Was ich eigentlich tun möchte, ist, dass ich immer dann, wenn ich auf diese Schaltfläche klicke, eine kreisförmige Fortschrittsanzeige anzeigen möchte. Und nach einiger Zeit möchte ich hier zeigen, dass es das braucht, was, sagen wir mal erledigt oder abgeschlossen ist . Lass uns das machen. Also werde ich zunächst einen neuen Status ausgeben, nämlich den Textladestatus. Warten wir nach einiger Zeit 1 Sekunde. Und nachdem wir 1 Sekunde warten, möchte ich den Text aussenden, tanzte ihn. Okay? Unsere Funktion hier wird erfüllt. Rufen wir jetzt diese Funktion auf. Immer wenn wir auf den Klick-Button klicken, gehen wir zu unserer Textseite. Und hier statt auf Druck werde ich es geben. Jetzt. Davor muss ich auch die Flatter-Block-Pakete importieren. Dann können wir die Funktion mit context dot read aufrufen. Und im Inneren werde ich den Cubit benennen, von dem aus wir den Funktionspunkt nehmen werden . Neuen Text anzeigen. Okay? Jetzt möchte ich hier einen Block oder einen Block Builder hier erstellen . Also, dass ich anstelle des Textes einmal den kreisförmigen Fortschrittsindikator und dann einen Text zeige , der nein sagt. Was wir anstelle dieser Schaltfläche anzeigen möchten, wenn wir auf die Schaltfläche klicken, möchten wir eine kreisförmige Fortschrittsanzeige und dann etwas Textur anzeigen . Was wir also tun müssen, ist, dass wir den erhöhten Knopf ändern müssen , zu einer kreisförmigen Fortschrittsanzeige wollen und es dann tun. Mal sehen, wie wir das machen werden. Wir werden das mit einem Widget namens Block Building tun . Schreiben wir es also hier. Dieser Block-Builder wird aus einem Text-Cubit bestehen. Und als nächstes werden wir innerhalb des Blockbauers einen Builder nennen , der zwei Dinge erfordert. Wenn wir sehen. Einer ist der gebaute Kontext und der andere ist der nächste Zustand. Geben wir also diese Kontexte und den Zustand an. Jetzt. Wenn der Status fest ist, initial, tun Sie nichts. Und so macht die Schaltfläche, wie zuvor, wenn der Status Text geladen wird, nichts anderes als eine kreisförmige Fortschrittsanzeige. Nun, wenn der Text ist, wenn der Status nicht Text anfänglich ist oder kein Text geladen wird, dann, wenn Sie zu unserem Text gehen und dann nur noch einen Status übrig hat, das heißt, der Text auf unserem anderen wird immer sein der Text Downstate. Wenn also der Status fertig ist, zeigen Sie einen Text an, der abgeschlossen ist. Um nun den Block zu verwenden, müssen wir den Block einem Widget zur Verfügung stellen den Block einem Widget zur , das das übergeordnete Element der Texte mit ihm ist. Wenn wir nun sehen, dass das übergeordnete Element der Textseite abgelehnt wird, ist das Material-App-Widget. Deshalb müssen wir unseren Block bereitstellen, bei dem es sich um den Text handelt, der in unserer Metrik oder über unserem Material-App-Widget feucht ist. Also wie könnte es gemacht werden? Mal sehen. Wir werden es von hier aus schneiden und ein Widget namens Multiblock verwenden. Bereitgestellt. Hier. Wir können mehrere Anbieter haben. Ein Anbieter wird also ein Blockanbieter sein. Und wir erstellen es mit einem Kontext , der einen Textcubit zurückgibt. Und das Kind wird jetzt unser Material sein. Okay? Wenn wir jetzt unseren neu starten, schauen wir mal, was passiert. Okay? Wir können also sehen, dass unser Button hier ist. Mal sehen, was passiert , wenn wir darauf klicken. Wir klicken auf den Button. Es zeigte den zirkulären Fortschrittsindikator und dann die Unternehmensdetails. Stellen wir die Verzögerung auf vier Sekunden ein und sehen uns die App dann erneut an. Okay? So können wir sehen, dass der Textladestatus initialisiert wird, sobald wir auf die Schaltfläche klicken . Und nach vier Sekunden wurde der Text im Downstate initialisiert. So funktioniert Block mit Cubic. Das ist also das grundlegende Verständnis der staatlichen Verwaltung , das wir verwenden werden. Im nächsten Video werden wir das staatliche Management in unsere App implementieren , was die News-App bedeutet. Also danke fürs Zuschauen und wir sehen uns beim nächsten. 11. Bloc und Cubit Implementierung in der App: Hallo und willkommen zum zehnten Video unserer Flatter-Clean-Architektur in dem wir eine komplette App mit Pain Architecture erstellen. In diesem Video werden wir unser Block- und Qubit-State-Management in unsere App integrieren . Löschen Sie also zuerst die Beispiel-Ellen, die wir im vorherigen Video gemacht haben. Also können wir es machen ist in Ordnung. Wir können die Textseite löschen. Jetzt. Dieser wird es auch tun. Und stattdessen werden wir bereitstellen, werden die Cubit zur Verfügung stellen , die in diesem Video gemacht wird. Und hier werden wir die Homepage schreiben. Löschen Sie die Importe. Fantastisch. Lass uns die App neu starten. Die Kinder können jetzt noch nicht leer sein, wir werden dieses Objekt einfach entfernen. Okay? Jetzt machen wir einen neuen Amor. Wir gehen zum Präsentationsbereich und in der Präsentationsmappe werden wir einen neuen Cubit-Anruf tätigen. Neuigkeiten. Wie ich Ihnen im letzten Video gesagt habe, können Sie eine sehr hilfreiche Erweiterung namens Block Extension haben , mit der Sie Cubit einfach erstellen können, Beispiel können Sie hier mit der rechten Maustaste klicken und einen Cubit-Audit-Block erstellen. Aber jetzt ist das die neueste Elle und den neuen Zustand werde ich das gefaltete neue Dummheit nennen. Gehen wir jetzt zu unserem News-Cubic. Wir können sehen, dass es standardmäßig den ersten Schritt der Nachricht gibt. Und innerhalb der neuen Staaten haben wir einen ersten Schritt. Wir werden zwei weitere Staaten haben. Der erste Staat werden Nachrichten sein. Überspringen wir es zunächst zu den Nachrichten. Der zweite Status wird das Laden von Nachrichten sein, der dritte Status wird der Nachrichtenredakteur sein. Nun, im ersten Schritt der Nachrichten, werden wir eine weitere Sache namens D haben, Liste der Nachrichteninformationen. Unsere Nachrichteninitiative wird also die Nachrichten enthalten, die hier gezeigt werden. Jetzt wird unser neuer Ausgangszustand die Nachrichten enthalten , die hier gezeigt werden. Lassen Sie uns unseren ersten Analyt, den wir initialisieren werden, wenn wir die Nachrichten zum ersten Mal initialisieren, mit einer leeren Liste setzen. Schauen wir uns die Konstante an. Und dann schreiben wir eine Funktion namens void fetch news function mit dem Suchtext hier. Und dann werden wir unsere Funktion aus den Anwendungsfällen aufrufen unsere Funktion aus den Anwendungsfällen Dies ist diese Funktion zum Abrufen der Schlummerfunktion , für die diese Funktion in unserem Service Locator registriert wird . Nehmen wir an, registrieren Sie das. Anwendungsfall für Stretch-Akte. Fetch weiß es. Okay. Gehen wir nun zu unserer neuen Fähigkeit, aber dot dot Phi. Und hier bekommen wir den Fridge News-Anwendungsfall. Importieren wir die Zelle hier. Das ist Service Locator. Und okay, jetzt können wir dieses Fetch News, Use Case-Objekt in unserer Funktion zum Abrufen von Nachrichten verwenden. Also lass uns das benutzen. Also schreiben wir Fetch News. Verwenden Sie Kickstart, um Nachrichten mit dem Suchtext abzurufen. Mal sehen, was das zurückbringt. Es gibt uns eine Zukunft zurück, entweder Misserfolge oder Neuigkeiten in einer Liste von Dingen. Holen wir uns also das Ergebnis, dass wir wait verwenden. Jetzt werden wir genau das entweder nach der Erde bekommen. Also werde ich letzte solche Nachrichten schreiben. Das Ergebnis ist gleich zwei. Und dies wird einen Datentyp haben, der entweder einen Fehler oder diese schwierigen Neuigkeiten enthält. Jetzt haben wir das Paket tarts, das uns den beiden Datentyp gibt, und uns auch eine sehr hilfreiche Funktion gibt , mit der wir unsere Dinge trennen können, was wir tun werden, wenn ein Fehler auftritt. Und wir können die Dinge trennen , die wir tun werden, wenn wir unsere Liste der Nachrichteninformationen erhalten. Wie können wir das machen? Wir können es mit der vollen Funktion DOD-Schizo machen, oder? Holen Sie sich das Nachrichtenergebnis punktförmig. Und hier können wir sehen, dass es zwei Funktionen gibt. Eine davon ist die linke Funktion, die aufgerufen wird , wenn das linke Ergebnis zurückgegeben wurde. Und eine richtige Funktion, die aufgerufen wird, wenn das richtige Ergebnis zurückgegeben wurde. Wenn also das linke Ergebnis zurückgegeben wurde, geben wir den Nachrichtenfehlerstatus aus. Und wenn das Recht geltend gemacht wurde, wird der Ausgangszustand der Nachricht ausgegeben. Aber mit den Nachrichten. Da diese Funktion eine Liste von Nachrichteninformationen zurückgibt, wenn der, wenn kein Fehler auftritt. Also dieses R wird auch eine Liste von Museen dafür haben, L wird einen Misserfolg haben. Okay? Bevor wir jetzt etwas tun, müssen wir auch den Ladezustand der Nachrichten ausgeben. Denn wann immer wir die Nachrichten abrufen, wird zuerst der Ladebildschirm angezeigt und dann werden die Nachrichten abgerufen. nach dem Abrufen der Nachrichten Wenn nach dem Abrufen der Nachrichten ein Fehler auftritt, wird angezeigt, dass Dennett den Fehlerstatus hat. Und wenn es keinen Fehler gibt und die Funktion die Liste der Nachrichteninformationen zurückgegeben hat, haben wir den Ausgangszustand der Nachrichten mit der Musik, mit der Liste der Musik für. Jetzt. Lassen Sie uns diese Funktion auf unserer Homepage nutzen. Dafür müssen wir unsere Homepage zu einem zustandsbehafteten Widget machen . Lass uns das machen. Und innerhalb unserer Homepage wird es eine Init-Funktion haben. Jetzt ist die init-Funktion eine sehr nützliche Funktion. Diese Funktion wird nur aufgerufen , wenn die Seite zum ersten Mal initialisiert wurde. Diese Funktion wird also nur aufgerufen, wenn die Homepage zum ersten Mal initialisiert wurde. Wir waren auch nicht der Meinung, dass wir erst als das erste Mal die Homepage, die Nation initialisiert hat, das erste Mal die Homepage, die Nation initialisiert hat, die Fetch News oder diese Funktion aufrufen wollen. Also lass uns das machen. Dafür müssen wir unser Better Block-Paket importieren. Und dann werden wir Context Dot, Read, News, Cubit, Dot Fetch News schreiben . Und der Suchtext ist null. Da wollen wir zunächst nur die normalen Texte durchsuchen. Das gibt uns einen Fehler. Der Grund dafür ist, dass wir die Nachrichtenküvette nicht in unserem Hauptpunkt, Punkt fünf, bereitgestellt haben . Also lass uns das machen. Wir haben diesen sogar geschnitten. Schreiben Sie hier einen Multiblock-Anbieter. Wir haben einige Anbieter oder eine Liste von Anbietern. Wir können nur eine Liste von Anbietern oder sogar einen einzelnen Anbieter haben. Wir werden einen Blockanbieter erstellen. In der Create. Wir werden eine Funktion haben , die den neuen Skew-it zurückgibt. Und das Kind wird unser Material sein. Wir können die Nachrichten-Temperatur importieren. Okay, jetzt sind wir fertig. Lass es uns einmal neu aufbauen und die App neu starten. Okay? Jetzt können wir sehen, dass unser Block funktioniert, aber wir müssen einige weitere Änderungen innerhalb der Benutzeroberfläche vornehmen, damit unser Block mit den Cubics verbunden ist. Wann immer es also eine Zustandsänderung gibt, wird sich demnach auch die DUI ändern. Um das zu tun, müssen wir auf unsere Homepage gehen. Wir müssen zu unserem ListView gehen. Hier drinnen. Anstelle von ListView wird ein Blockblock erstellt. Der Block Builder wird außerhalb des Nachrichtenbereichs und des Nachrichtenstatus sein. Hier wird die Builder-Funktion benötigt, die einen Kontext und den Status annimmt. Wenn der Status „news initial“ ist, nichts, zeigen Sie ListView an. Und statt der Artikelzählung verwenden wir jetzt den Status DOT. Länge der Nachrichtenpunkte, die wir hier weitergeben. Die Neuigkeiten, die möglicherweise sind, ändern wir den Namen von R2-Moves. Okay? Also die Nachrichten, die das Passieren hier in unserem neuen Nachrichten-Ausgangszustand hinzufügen werden , den wir hier verwenden. Also, wann immer der Staat neu venezianisch ist, verwenden Sie die Nachrichten, die im Ausgangszustand der Nachrichten bereitgestellt werden. Also schreiben wir ihn auf und sie zählen einfach, werden diese Nachrichtenpunktlänge neu angeben. Und okay, lass es vorerst so sein. Und wenn es sich bei dem Status nicht um Nachrichten handelt, wenn der Staat Nachrichten lädt, wird zu diesem Zeitpunkt ein Zentrum mit einer kreisförmigen Fortschrittsanzeige mit einer Farbe von, sagen wir, wenn der Staat keine Nachrichten ist, zurückgegeben einer kreisförmigen Fortschrittsanzeige mit einer Farbe von, Wenn der Staat zunächst nicht neu ist und geladen wird, dann haben wir nur noch einen weiteren Staat übrig. Das ist das Nachrichtenzeitalter. Dieses Mal können wir vorerst nur einen Text zeigen. Das ist ein Wrap it in einen Satz. Okay, wir sind also fertig mit unserem Block Builder auf unserer Homepage. Gehen wir jetzt zu New Scarred. Die Nachrichtenkarte ist ein Generikum für jede Nachrichtenkarte. Dies ist eine allgemeine Nachricht Scott, die wir in allen Nachrichtenkarten hier zeigen. Aber wir brauchen spezifische Informationen für jede einzelne Zeitung, die ein einzigartiges Bild, einen einzigartigen Titel usw. haben wird . das zu tun, müssen wir die Nachrichteninformationen in jede einzelne Narbe weitergeben . Und nach unseren neuen Informationen werden wir das Bild oder die Flut ändern. Also lass uns das machen. Anstelle dieser URL wird jetzt die URL Nachrichten-Info-Punkt-Bilds verwendet. wir nun zu unseren Nachrichteninformationen gehen, können wir sehen, dass die Bild-URL nullfähig sein kann. Wir können sehen, dass dies der Fall ist, die Bild-URL eine Zeichenfolge sein kann oder es kann getan werden. Wir möchten auch überprüfen, ob die URL des Nachrichteninfo-Punktbildes ungleich Null ist, nur dann das Bild anzeigen. Und auch hier können wir ein Erklärungszeichen geben, das speziell währenddessen, ja, wenn das von Ihnen hinzugefügte Bild nicht null ist, dann kann auch hier der Haupterwachsene nicht null sein. Nun, hier ist die Bild-URL null. Zeige nichts, nur eine Box mit konstanter Größe. Gehen wir nun zu unserem Titel. Hier. Zeigt den Titel des Nachrichten-Info-Punkts an. Jetzt können wir auch hier, wir wissen, dass der Titel Null oder eine Zeichenfolge sein kann. Also auch hier müssen wir sagen, dass, wenn die Nachrichten nicht gleich Null sind, dann der Titel des Nachrichteninfo-Punkts. Und wenn es gleich ist, einen Text ohne Titel anzuzeigen. Und wir müssen die Konstante von hier entfernen und sie hier hinzufügen. Seit früher haben wir gesagt, dass das Ganze konstant ist, aber jetzt ist das nicht konstant. Es ändert sich je nach den Nachrichteninformationen, die Sie weitergeben. Jetzt. Wir sind auch fertig mit unseren neuen Narben. Gehen wir zur News-View-Seite. Auch hier werden wir die Nachrichteninformationen weitergeben. Und jetzt müssen wir unser Display entsprechend den Nachrichteninformationen einstellen unser Display entsprechend , die wir erhalten. Zuallererst ändern wir sogar den Titel in News im Photo Dot Title. Wenn es nicht gleich Null ist, dann verwenden Sie die Nachrichten auf dem Foto mit dem Titel lose. Und wenn es gleich Null ist, dann zeige keinen Titel. Entfernen wir die Konstante von hier und fügen die Konstante durchgehend hinzu. Extrahieren. Das Bild wird sich auch ändern. Wir werden es in die URL des Nachrichteninfo-Punkt-Bilds ändern. Und wir werden sagen, wenn die URL des Nachrichteninfo-Punktbildes nicht gleich Null ist, dann verwenden Sie nur die Bild-URL im Bildpunktnetzwerk. Und wenn es gleich ist, gleich Null, dann habe ich ein Feld mit konstanter Größe. Jetzt müssen wir die Schulden auch geben, lass uns eine Funktion machen. Sagen wir Holen Sie sich das Datum im Format DD, MM, YY. Dies ist eine Funktion , die erstellt wird, die von hier aus konstant sein wird. Lassen Sie uns diese Funktion Foster erstellen. Diese Funktion gibt null zurück und wählt ein Datum und eine Uhrzeit aus unserem News-Info-Objekt aus. Was wir also zurückgeben werden, ist Datetime Punkt d. Nach diesem Schrägstrich, dann Datetime Punkt Monat, dann ein Schrägstrich und dann Datetime Punkt. Wenn Sie jetzt Daten innerhalb einer Zeichenfolge verwenden, das Dollarzeichen und dann mit geschweiften Klammern verwenden, wird dies als String-Interpolation bezeichnet. Dadurch werden die Daten in dieser Zeichenfolge zusammen mit der anderen Zeichenfolge angezeigt dieser Zeichenfolge zusammen mit , die hier vorhanden ist. Also zum Beispiel, wenn Sie hier den Wert von 100 anzeigen möchten , dann eine Zeichenfolge. Du kannst es so machen. Lassen Sie uns die Datetime der Nachrichteninformationen in unseren Daten in einer DD MM YY-Formatfunktion übergeben . Dann müssen wir auch hier den Autorennamen angeben. Neuigkeiten im Food Dot Autor. Der Autor kann auch null sein. Dafür werden wir überprüfen, ob der Autor nicht gleich Null ist, dann nur den sonst verfassten News-Info-Punkt verwenden, oder? Nein. Autor. Und der Inhalt wird auch diesen Lorem löschen. Ipsum-Text wird Nachrichteninformationen enthalten. Der Inhalt wird, kann auch null sein. Wenn der Inhalt also nicht gleich Null ist, dann verwende nur den Inhalt. Sonst. Keine lokale Route anzeigen. Okay, ich glaube, wir sind auch mit unserer News-View-Seite fertig. Gehen wir auf unsere Homepage. Und da wir die Nachrichteninformationen hier hinzugefügt haben, müssen wir sie auf unserer Homepage hinzufügen, auch in unserer Nachrichtenkarte. Außerdem haben wir die News-Info hinzugefügt. Also haben wir auch gesagt, dass es ein erforderlicher Parameter ist, also müssen wir ihn auf unserer Homepage in unserer Nachrichtenkarte hinzufügen . Objekt. Lass es uns hinzufügen. Die Nachrichteninformationen entsprechen den staatlichen Punktnachrichten. Entfernen wir die Konstante von ihnen. Okay? Also, wenn wir sehen würden, dass die State Dot News eine Liste von Nachrichteninformationen enthalten. Also jede einzelne Nachrichteninformation, die wir erhalten können indem wir State Dot News mit einem Index verwenden. Jetzt gibt es gute Nachrichten. Gott, das sind wir, wir können sehen , dass wir einen Fehler haben. Der Grund dafür ist die News-View-Seite, wir müssen die Informationen zu den Mahlzeiten bereitstellen. Also sind wir hier fertig. Starten wir die App neu und drücken die Daumen . Das sollte es sein. Okay. Unser zirkulärer Fortschrittsindikator wurde angezeigt und wir können sehen, dass wir auch die Nachrichten sehen können. Lass uns eine Nachricht öffnen. Das ist okay. Wir können sehen, dass die Neuigkeiten, die wir bekommen, das Datum, wir bekommen die Tiere des Autors, wir bekommen auch den Inhalt. Wir kriegen, wir kriegen die Titel-Optimisten. Gehen wir zurück und öffnen eine weitere Nachricht. Okay, auch hier, dasselbe. Okay. Lassen Sie uns nun überprüfen, ob unser Suchtext funktioniert oder nicht. Suche Apple. Es passiert nichts damit. Der Grund dafür ist, dass wir unsere Suchfunktion hier nicht hinzugefügt haben . Also lasst uns das hinzufügen. Wir müssen zu unserer Präsentation auf unseren Seiten gehen. Wir müssen auf die Homepage gehen. Und innerhalb unserer Homepage müssen wir einen geänderten Parameter hinzufügen, der die Konstante von hier aus übernimmt. Fügen wir die Konstante in diesen Räumen hinzu. Nun, was diese OnChange-Funktion tun wird ist, wann immer wir uns ändern, lass uns die onchange in own submitted ändern. Also wann immer, nachdem wir etwas geschrieben haben, sagen wir Orange. Und danach senden wir ab, indem wir auf diese Schaltfläche klicken. Wir werden hier nach Nachrichten zum Suchtext suchen, orange ist , und diskutieren. Also lass uns das machen. Wie wir das tun können, ist, indem wir die neue Funktion aufrufen. Also schreiben wir Kontexte, Punkt, Lesen, Nachrichten, Cubit, Dot Fetch News, zusammen mit den Suchsticks , die wir hier geben. Und wir müssen noch eine Sache spezifizieren. Aber mal sehen, wie es funktioniert oder nicht. Lassen Sie uns eine kleine Münze suchen. Okay, also unsere Suchfunktion funktioniert auch. Immer wenn wir in den Nachrichten gesucht haben, zeigt uns Era etwas Nettes. Lass uns die Nachrichten öffnen. Okay, das funktioniert also gut. Suchen wir mit ein paar anderen Namen. Sagen wir Apple. Das, Die Apple News sind auch wahr. Lass uns noch eins eintauchen. Newton. Nicht genau der Newton , den Sie sich erhoffen, aber okay, geben wir Google ein. Wir suchen die beliebteste Suchmaschine unsere Suche. Aber wir sehen, dass unsere Suchfunktion auch was ist. Aber wenn wir den gesamten Text hier entfernt haben und dann die Eingabetaste drücken, wird eine Fehlermeldung angezeigt. Aber was eigentlich passieren sollte ist, wenn hier kein Text vorhanden ist, zeige die Standardeinstellung an. Also müssen wir das auch tun, wenn der Suchtext punktuell abgeschnitten wird. Trimmen bedeutet, auch wenn Sie hier einige, sagen wir Räume haben , dies auch als nichts angesehen wird , das in unserem Lagerteil vorhanden ist. Also führen wir eine Trimmung ein. Wenn unsere Trimmung gleich ist, nichts, kein Text oder vermeide Text. Dieses Mal. Führen Sie eine Suche durch und zeigen Sie die Standardmittel an. Und die Standardnachricht ist standardmäßig, ich meine, dass der Suchtext null ist. Und wenn das nicht der Fall ist, dann. Diese sind also gestreckt. Lassen Sie uns nun überprüfen ob in unserer Suchleiste keine Texte vorhanden sind. Und dann drücken wir die Eingabetaste, wir sollten die Standardnachrichten erhalten und wir erhalten die Standardnachricht. Aber wenn es etwas Text gibt, bekommen wir die Suchwerkzeuge. Okay? Jetzt funktioniert also alles, aber wir müssen auch ein paar Dinge ändern, ein paar Details. Die wichtigsten Nachrichten sollten angezeigt werden, wenn wir die Standardnachrichten anzeigen. Aber wenn wir nur eine gelynchte Suche zeigen , dieses Mal, sollten die Top-Nachrichten durchsucht werden. Also lass uns das machen. Dazu müssen wir einen neuen Status erstellen , der als anfänglicher Suchstatus für Nachrichten bezeichnet wird. Jetzt wird dieser Status immer dann aufgerufen , wenn der Suchtext nicht gleich Null ist. Also schreiben wir es hier. Wenn der Suchtext ungleich Null ist, geben Sie die erste Nachrichtensuche aus. Bundesstaat. Sonst. Initialisieren Sie einfach die Nachrichteninitiativen. Gehen wir jetzt auf unsere Homepage. Und jetzt hier, wenn der Staat neu anfänglich ist, zeigen Sie die ListView, und wenn der Staat Nachrichten erste Suche ist, diese Zeit zeigt auch diesen Streit. Okay, jetzt gehen wir zu unseren Top-News und diese werden wir ändern. Also können wir das mit einem Blockaufbau abschließen. Das ist also die sehr nützliche Sache bei der Verwendung von Block Builder, dass wir nicht die gesamte Seite ändern oder die gesamte Seite neu erstellen müssen . Immer wenn es eine Statusänderung gibt, können wir einfach das bestimmte Widget ändern , das wir ändern möchten. Das ist das Schöne an Aussagen, oder? Kontext, Staat. Und wenn der Staat anfänglich Nachrichten hat, kehrt diese Zeit zur Normalität zurück. Top Neuigkeiten. Andernfalls, wenn der Staat neu ist, erste Suche, zeigte diese Zeit die Suche nach Nachrichten, Nachrichten zu gutschreiben. Und wenn der Staat weder die erste Nachrichtensuche noch die Erstsuche nach Nachrichten ist , geben Sie ein leeres Budget oder ein Feld mit konstanter Größe zurück. Okay, lass es uns ausprobieren. Wenn wir auf unserem Startbildschirm hatten, als es geladen wurde, wurde kein Widget angezeigt. Nochmals, wenn wir novae eingeben, die nur die Spitze nahe 0 zeigen, wenn die Top-Nachrichten angezeigt werden, ist die Kopfzeile Top News. Und wenn es sich um einen Suchnamen handelt, hatten die Suchnachrichten ein Problem. Okay, großartig. Jetzt werden wir auch hier einige Fehler behandeln. Lass uns einfach alles abwischen. Lassen Sie uns vorerst einen Kommentar abgeben. Kommentieren wir diesen Teil vorerst und geben den Nachrichtenfehlerstatus aus. Mal sehen, was hier gezeigt wird. Starten wir das f neu. Und wenn es einen Nachrichtenfehlerstatus gibt, zeigen wir nur, dass ein Fehlertext auf dem Bildschirm angezeigt wird. Was wir tun sollten, wenn ein Nachrichtenfehlerstatus vorliegt, ist, dass wir dem Benutzer einen Reload-Button geben sollten , damit wir bei einem Fehler beim Aufruf des APN wir unsere App und es wird die API erneut aufrufen. Also lass uns das machen. Jetzt. Wenn ein Fehler auftritt, möchten wir anstelle des Textes eine Symbolschaltfläche angeben. Die Icon-Taste wird ein Mal gedrückt. wir ihm vorerst eine leere Funktion und ein Symbol. Das Symbol wird sein, ich kann anfangen. Wir wiederholen es und das sollte in Ordnung sein. Und die Farbe wird Deep Blue sein. Die Größe wird, sagen wir mal, 24 sein. Und lass es uns hier eine Konstante geben. Und was wir eigentlich mit diesem Reload-Button machen wollen, wollen wir in unseren Nachrichten erneut die Funktion zum Abrufen von Nachrichten aufrufen, gute Nachrichten mit dem Null-Suchtext. Wenn wir das also vorerst tun, wird nichts passieren, weil wir hier nur einen Nachrichtenfehler nachgeahmt haben. Aber wenn wir den Nachrichtenfehler von hier entfernen und wenn wir das auskommentieren, und jetzt, wenn wir den Load-Button drücken, sollte es uns das Normale zeigen, nett. Aber die Standardeinstellung bedeutet Wallah es, sobald die Standardnachrichten vorliegen. Wenn wir die App immer wieder neu starten, teste sie aus, lass uns sehen, was passiert. Unsere ersten Nachrichten wurden mit dem Top-News-Header angezeigt und das Bild wird angezeigt, die Überschrift wird angezeigt. Die Bilder werden geladen. Und wenn wir zu einer Nachricht gehen, können wir sehen, dass der Titel angezeigt wird, die Einheiten werden angezeigt. Das Datum wird angezeigt, wann es veröffentlicht wurde, der Autor Naomi Tissue und der Inhalt auch wir sind jetzt, wenn wir nach Text suchen, suchen, einige Nachrichten Stunde gesucht Nachrichten werden auch angezeigt mit der Überschrift der Suchnachrichten. Und wenn sich in unserem Suchtextfeld kein Text befindet, dann die Standardinstallation. Deshalb haben wir unseren Block mit Qubit State Management in unserer App implementiert . Und unsere App ist vollständig und funktionsfähig. Im nächsten Video werde ich also über den modularen Teil einer sauberen Architektur sprechen . Wir werden sehen, warum es modular ist und wie wir es können. Ich werde auch zeigen, indem ich ein sehr wichtiges Paket ändere , welches wir verwenden. Und ich werde zeigen, wie einfach wir das Paket ändern können, ohne andere hier vorhandene Codes mit dieser sauberen Architektur zu beeinflussen . Also danke fürs Zuschauen. Wir sehen uns im nächsten. 12. Testen der Modularität der sauberen Architektur: Hallo und willkommen zum 11. Video und zum letzten Video unserer Serie „Flached Clean Architecture“, in der wir eine komplette App mit grüner Architektur erstellen. In diesem Video werden wir die Modularität einer sauberen Architektur testen . Vom ersten Video an habe ich so getan, als saubere Architektur sehr modular. Damit meinte ich, dass wir in jedem dieser Abschnitte leicht alles ändern können , ohne den Code anderer Sitzungen zu beeinflussen. In diesem Beispiel werden wir unser HTTP-Paket in unserem API-Service in ein anderes neues aktualisiertes Paket ändern . Mal sehen, welches Paket wir verwenden werden. Wir werden ein Paket namens dy verwenden. Gehen wir zur Biografie und fügen das DO-Paket in unserer YAML-Datei mit Pub-Spezifikation hinzu. Wir haben ein Zifferblatt in unserer YAML-Datei mit Leuchtmittelspezifikation hinzugefügt. Und lassen Sie uns unsere Umfrage durchgehen , die gefunden und registriert ist. Hat unsere Diode registriert. Jetzt erinnere dich an eine Sache. Sie müssen sich vor dem API-Service registrieren. Der Grund dafür ist, dass Sie das Wählpaket in unserem API-Service verwenden werden . Also müssen wir zuerst sterben off registrieren und dann müssen wir die API-Oberfläche registrieren. Nur aus diesem Grund registrieren wir unseren API-Service vor dem Abrufen aus der Remote-Datenquelle. Der Grund dafür ist, dass wir den API-Dienst in unserem Fisch aus einer Remote-Datenquelle verwenden. Gehen wir nun zu unserem API-Service und wir werden ihn löschen. Diese Linie. Wird schreiben, ist die endgültige Antwort gleich zwei. Davor müssen wir auch die Diode besorgen. Lassen Sie uns unseren Service Locator importieren. Jetzt werden wir die Dioden-Dot-Get-Funktion schreiben. Jetzt sehen wir, dass die get-Funktion den Pfad nimmt und auch drei Parameter benötigt. Der Teil wird die URL hier sein, und die Parameter werden sein, wo die Eltern sind, okay? Und es gibt eine Zukunft der Reaktion zurück. Die Antwort wird darauf eine Antwort haben. Nun, das wird die Antwort Punkt da, da Daten sein. Da wir die Reaktion der diapasonförmigen Ruhe verwenden, wird alles gerettet. Lassen Sie uns jetzt unseren Bewerber neu starten. Okay, wir bekommen einen Fehler. Mal sehen, welcher Fehler wir gemacht haben. Wenn wir hier drucken, Startdaten der Antwort. Wir können sehen, ob response.data gedruckt wird. Wenn wir die response.data hier drucken , schauen wir mal, was passiert. Okay? Also dieser wird gerade gedruckt. Unser Fehler muss also irgendwo in unseren Datenquellen liegen . Fein. Gehen wir zu unserer Datenquellendatei. Und in unserem Fang drucken wir die Bearbeitung aus. Wir können also sehen, dass interne HashMap oder eine Map String dynamic kein Subtyp von String ist. Dies zeigt sich, denn wenn wir zu unserem API-Dienst gehen, verwenden wir JsonData, den Code in unserer response.body, in unserem HTTP-Paket. Es gibt uns eine String-Neophyten-Version des dynamischen Kartensteins. Aber hier erhalten wir direkt die maximalen dynamischen Typen, sodass wir diesen nicht verwenden müssen. Also können wir es hier löschen. Und wenn wir es noch einmal ausführen, schauen wir mal, was passiert. Okay? Also bekommen wir unsere Daten oder eine Minute und schauen, ob das auch funktioniert. Lass es suchen. Okay. Die Suchfunktion funktioniert also auch. So einfach können wir Dinge in unserer sauberen Architektur ändern Dinge in unserer sauberen Architektur ohne etwas zu ändern. Wenn Sie gesehen haben, mussten wir nur zwei bis drei Zeilen in unserer API-Service-Punkt-Punkt-Datei ändern . Der Rest, jede einzelne Datei sagte, hat den gleichen Code. Wir mussten keine andere Datei außer dem API-Service ändern . Das ist also das Schöne an sauberer Architektur. Das ist so hilfreich , dass wir leicht alles ändern können , ohne andere Kämpfe zu ändern oder zu verändern. Das ist es also für dieses Video. In diesem Kurs haben wir eine komplette Anwendung mit einer sauberen Architektur von Grund auf neu erstellt. Ich hoffe, Sie können die Anwendung auch mit mir erstellen. Und danke, dass du dir die ganze Serie bis zum Ende angesehen hast.