Google flattert von Grund auf neu Raster, Listen und Datenquellen

Nahezu jede nicht triviale mobile App hat heutzutage wahrscheinlich Listen in ihren Layouts. Dies liegt daran, dass die Verwendung einer scrollbaren Liste oft die einfachste Möglichkeit ist, eine große Anzahl ähnlicher Elemente auf einem kleinen Bildschirm anzuzeigen. 

Das Flutter-Framework bietet mehrere Widgets, mit denen Sie solche Listen effizient und mit minimalem Code erstellen und anzeigen können. In diesem Tutorial zeige ich Ihnen, wie Sie sie sowohl mit lokalen als auch mit entfernten Datenquellen verwenden.

1. Anzeigen einer nicht scrollbaren Liste

Wenn Sie eine kleine Anzahl ähnlicher Elemente anzeigen müssen und sicher sind, dass der Bildschirm des Benutzers alle Elemente gleichzeitig anzeigen kann, verwenden Sie die Säule Widget ist das effizienteste, was zu tun ist.

Um eine Liste in Ihrer Flutter-App zu erstellen, können Sie die Liste Klasse, die die Programmiersprache Dart bietet. Nachdem Sie die Liste erstellt haben, können Sie deren verwenden hinzufügen() Methode, um beliebig viele Elemente hinzuzufügen. Der folgende Code zeigt, wie Sie eine Liste mit drei Elementen erstellen RaisedButton Widgets:

// Liste erstellen myItems = neue Liste (); // Füge drei Button-Widgets hinzu myItems.add (new RaisedButton (child: new Text ("Twitter"), onPressed: () )); myItems.add (new RaisedButton (untergeordneter: neuer Text ("Facebook"), onPressed: () )); myItems.add (new RaisedButton (child: new Text ("Reddit"), onPressed: () ));

Beachten Sie, dass jedes Element in der Liste leer ist onPressed Event-Handler, der damit verbunden ist, da das Element sonst deaktiviert würde.

Nun, da die Liste fertig ist, können Sie sie direkt der zuordnen Kinder Eigentum der Säule anzuzeigendes Widget. Normalerweise möchten Sie jedoch auch angeben, wo die Listenelemente auf dem Bildschirm platziert werden sollen. Weil der Säule Das Widget ist ein flexibles Widget. Sie können die Positionen der Elemente entlang der Hauptachse und der Querachse mithilfe von steuern mainAxisAlignment und crossAxisAlignment Eigenschaften. Standardmäßig für die Säule Widget ist die Hauptachse die vertikale Achse und die Querachse die horizontale Achse.

Der folgende Code zeigt, wie Sie die drei Schaltflächen über die horizontale Achse strecken und vertikal in der Bildschirmmitte platzieren:

Spalte column = new Column (mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.stretch, children: myItems);

So sieht die Kolumne jetzt aus:

Es ist wichtig zu beachten, dass ein Laufzeitfehler auftritt, wenn a Säule Das Widget kann nicht alle seine Kinder aufnehmen. Zum Beispiel, wenn Sie über ein Dutzend hatten RaisedButton Widgets in Ihrer Liste statt drei, würden Sie eine Fehlermeldung sehen, die wie folgt aussieht:

2. Anzeigen einer einfachen scrollbaren Liste

Bei etwas größeren Listen, Listen, deren Inhalt wahrscheinlich den Bildschirm überläuft, müssen Sie die Verwendung von a in Betracht ziehen Listenansicht Widget, weil es das Scrollen unterstützt.

Möglicherweise haben Sie bemerkt, dass der Code, den wir zur Erstellung der Liste im vorherigen Schritt geschrieben haben, sowohl langwierig als auch wiederholt wurde. Das Erstellen einer größeren Liste nach demselben Ansatz kann sehr mühsam sein. Ein einfacher alternativer Ansatz besteht darin, stattdessen zwei Listen zu verwenden: eine mit den Daten und eine mit den Widgets.

So können Sie das verwenden [] Operator, um schnell eine Datenliste zu erstellen, die momentan nur mehrere Zeichenketten enthält:

Liste data = ["Twitter", "Reddit", "YouTube", "Facebook", "Vimeo", "GitHub", "GitLab", "BitBucket", "LinkedIn", "Medium", "Tumblr", "Instagram", " Pinterest "];

Um die obige Liste von Strings in eine Liste von zu konvertieren RaisedButton Widgets können Sie die verwenden Karte() und auflisten() Methoden. Mit dem Karte() Methode können Sie jede Zeichenfolge verwenden, um eine neue zu generieren RaisedButton Widget. Und mit dem auflisten() Methode können Sie das konvertieren Iterable Objekt zurückgegeben von Karte() Methode in eine tatsächliche Liste Objekt. Der folgende Code zeigt Ihnen wie:

Liste myWidgets = data.map ((item) return new RaisedButton (untergeordnetes Element: new Text (item), onPressed: () async String url = "https: // $ item .com"; )) warte auf start (url););). toList ();

Der Vollständigkeit halber zeigt der obige Code auch die Erstellung einer onPressed Event-Handler, der das verwendet canLaunch () und starten() Methoden der url_launcher Paket, um die Website zu öffnen, die der Benutzer im Standardbrowser ausgewählt hat.

Sobald Ihre Liste fertig ist, können Sie sie an den übergeben Kinder Eigentum der Listenansicht Widget, um es anzuzeigen.

ListView myList = new ListView (children: myWidgets);

Wenn Sie zu diesem Zeitpunkt die App ausführen, sollten Sie in der Lage sein, durch die Liste zu blättern und eine beliebige Taste zu drücken, um die zugehörige Website zu starten.

3. Erstellen eines Gitters

Das Listenansicht Mit dem Widget können Sie nur ein Element auf seiner Querachse platzieren. Das Element wird standardmäßig so gedehnt, dass es den gesamten Platz auf dieser Achse belegt. Wenn Sie mehr Flexibilität wünschen, sollten Sie die Verwendung von a in Betracht ziehen Rasteransicht Stattdessen Widget, mit dem Sie angeben können, wie viele Elemente Sie auf der Querachse haben möchten.

Der folgende Code verwendet die GridView.count () Konstruktor zum Erstellen eines Rasteransicht Widget, das zwei Elemente pro Zeile anzeigt:

GridView myGrid = GridView.count (crossAxisCount: 2, children: myWidgets);

So sieht das Raster aus:

4. Große Listen anzeigen

Bei Datenlisten, die mehr als einige Dutzend Elemente enthalten, sollten Sie vermeiden, Widgetlisten manuell zu erstellen, wie Sie es in einem früheren Schritt getan haben. Warum? Das Erstellen eines Widgets ist eine kostspielige Operation und große Widgetslisten können viel Speicherplatz beanspruchen.

Verwenden Sie stattdessen die IndexedWidgetBuilder Funktion, mit der Sie Widgets nur dann erstellen können, wenn der Benutzer sie sehen muss. Mit ihm können Sie Widgets langsam generieren, während der Benutzer durch Ihr Fenster blättert Listenansicht Widget.

Es ist ziemlich unwahrscheinlich, dass große Datenmengen direkt in Ihren Apps definiert werden. Normalerweise würden Sie solche Daten von einem Remote-Server abrufen. Um Ihnen ein realistisches Beispiel zu geben, möchte ich Ihnen jetzt zeigen, wie Sie mit Hilfe der Stack-Exchange-API 100 Fragen aus Stack Overflow abrufen und bei Bedarf anzeigen können.

Beginnen Sie mit der Erstellung einer Unterklasse von StatefulWidget Klasse, die als Container für Ihre dient Listenansicht Widget und überschreiben seine createState () Methode.

Die Klasse VeryLargeListHolder erweitert StatefulWidget @override State createState () return new MyState (); 

Das Mein Staat Die im obigen Code erwähnte Klasse ist noch nicht vorhanden. Erstellen Sie sie und überschreiben Sie sie bauen() Methode.

Klasse MyState erweitert State @override Widget build (BuildContext-Kontext) // TODO

Als nächstes fügen Sie ein Liste object als eine der Membervariablen der Klasse. Sie speichern damit die Fragen, die Sie von Stack Overflow heruntergeladen haben. Fügen Sie außerdem den Endpunkt der API als weitere Variable hinzu.

Fragen auflisten; String endpoint = "https://api.stackexchange.com/2.2/questions?" + "pagesize = 100 & order = desc & sort = Aktivität & Site = Stackoverflow";

Wenn Sie nicht möchten, dass Ihr Benutzer eine Schaltfläche zum Herunterladen der Fragen drückt, sollten Sie sie automatisch herunterladen, wenn das Widget initialisiert wird. Dementsprechend überschreiben Sie die initState () Methode und rufen Sie eine neue asynchrone Methode auf lade Daten().

@override void initState () super.initState (); lade Daten();  void loadData () async // hier mehr Code

In der lade Daten() Methode können Sie die erhalten() Funktion von Dart http Paket zum Herunterladen der Fragen. Der API-Endpunkt gibt ein JSON-Dokument zurück, das Sie mithilfe von analysieren können json.decode () Funktion in Darts verfügbar Konvertieren Paket. Der folgende Code zeigt Ihnen wie:

String rawData = (Erwarten Sie http.get (Endpunkt)). Body; Karte jsonData = json.decode (rawData);

Sobald das JSON-Dokument in eine konvertiert wurde Karte Objekt können Sie den mit seinem verknüpften Wert verwenden Artikel Taste zum Initialisieren der Fragen Variable. Die Variable ist jedoch Teil des Status des Widgets. Daher müssen Sie sicherstellen, dass Sie es in der setState () nur Methode. Hier ist wie:

setState (() questions = jsonData ["items"];);

An dieser Stelle können Sie ein neues erstellen Listenansicht Widget mit der ListView.builder () Konstruktor, der eine erwartet IndexedWidgetBuilder Funktion und ein Element zählen als Argumente. Für den Moment ist die Anzahl der Artikel nichts anderes als die Größe der Fragen Liste. Fügen Sie daher den folgenden Code in der bauen() Methode der Mein Staat Klasse:

ListView myList = ListView.builder (itemCount: questions == null? 0: questions.length, itemBuilder: (BuildContext-Kontext, int index) // Mehr Code hier);

In der Builder-Funktion müssen Sie lediglich einen kleinen Widget-Baum erstellen, um verschiedene Details zu jeder Frage anzuzeigen, die Sie heruntergeladen haben. Flattern Material Paket bietet ein sehr nützliches Widget namens ListTile, So können Sie schnell einen solchen Baum erstellen und dabei die Richtlinien für das Materialdesign beachten.

Der folgende Code zeigt, wie Sie den Titel und den Autor der Frage mit Hilfe von anzeigen Titel und Untertitel Eigenschaften des ListTile Widget:

neues ListTile zurückgeben (Titel: Text (Fragen [Index] ["Titel"]), Untertitel: Text ("Gefragt von $ Fragen [Index] [" Eigentümer "] [" Anzeigename "]"));

Zuletzt erstellen Sie ein neues Gerüst Widget, weisen Sie das zu Listenansicht Widget zu seinem Karosserie Eigentum, und geben Sie es von der bauen() Methode, so dass es mit einem verwendet werden kann MaterialApp Widget. Optional können Sie eine hinzufügen AppBar Widget zum Gerüst Widget.

Neues Gerüst zurückgeben (AppBar: Neue AppBar (Titel: Neuer Text ("LargeListDemo")), Body: MyList);

So sieht die App aus, nachdem sie die Fragen heruntergeladen hat:

Fazit

Sie wissen jetzt, wie Sie mit Listen in einer Flutter-Anwendung arbeiten. In diesem Lernprogramm haben Sie nicht nur gelernt, wie Sie Listen und Raster erstellen, die große Datenquellen unterstützen, sondern auch, wie Sie jedes Element interaktiv machen können. Weitere Informationen zu Listen in Flutter finden Sie in der offiziellen Dokumentation.