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.