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.
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 erstellenmyItems = 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:
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:
Listedata = ["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:
ListemyWidgets = 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.
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:
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 StatecreateState () 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:
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.