Google Flutter From Scratch Grids, Lister og Datakilder

Nesten alle ikke-trivielle mobilappene i dag er sannsynligvis å ha lister i oppsettene. Det er fordi det å bruke en rullbar liste ofte er den enkleste måten å vise et stort antall lignende gjenstander på en liten skjerm. 

The Flutter-rammeverket tilbyr flere widgets du kan bruke til effektivt, og med minimal kode, opprette og vise slike lister. I denne veiledningen viser jeg deg hvordan du bruker dem med både lokale og eksterne datakilder.

1. Vise en liste som ikke kan rulles

Hvis du trenger å vise et lite antall lignende elementer, og du er sikker på at brukerens skjerm vil kunne imøtekomme dem alle samtidig, ved å bruke Kolonne Widget er den mest effektive tingen å gjøre.

Hvis du vil opprette en liste i Flutter-appen, kan du bruke Liste klasse som Dart programmeringsspråket tilbyr. Etter å ha opprettet listen, kan du bruke dens Legg til() metode for å legge til et hvilket som helst antall elementer til den. Følgende kode viser hvordan du oppretter en liste som inneholder tre RaisedButton widgets:

// Opprett liste Liste myItems = ny liste (); // Legg til tre knapp widgets til den myItems.add (new RaisedButton (barn: ny tekst ("Twitter"), påPressed: () )); myItems.add (new RaisedButton (barn: ny tekst ("Facebook"), onPressed: () )); myItems.add (new RaisedButton (barn: ny tekst ("Reddit"), onPressed: () ));

Merk at hvert element i listen har en tom onPressed Event Handler assosiert med det fordi, uten det, var elementet deaktivert.

Nå som listen er klar, kan du direkte tildele den til barn eiendom av Kolonne widget som skal vises. Vanligvis vil du imidlertid også spesifisere hvor listeelementene skal plasseres på skjermen. Fordi det Kolonne Widget er en flex-widget, du kan kontrollere posisjonene til elementene langs hovedakselen og krysse akse ved hjelp av mainAxisAlignment og crossAxisAlignment eiendommer. Som standard, for Kolonne widget, hovedaksen er den vertikale aksen, og kryssaksen er den horisontale akse.

Følgende kode viser hvordan du strekker de tre knappene over den horisontale aksen og plasserer dem midt på skjermen vertikalt:

Kolonne kolonne = Ny kolonne (mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.stretch, barn: myItems);

Her ser kolonnen nå ut:

Det er viktig å merke seg at du vil støte på en kjøretidsfeil hvis a Kolonne Widget kan ikke imøtekomme alle sine barn. For eksempel, hvis du hadde over et dusin RaisedButton widgets i listen i stedet for tre, vil du se en feilmelding som ser slik ut:

2. Viser en enkel, rullbar liste

For litt større lister, lister der innholdet sannsynligvis vil overfylle skjermen, må du vurdere å bruke en Listevisning widget fordi den støtter rulling.

Du har kanskje lagt merke til at koden vi skrev for å lage listen i forrige trinn var både lang og repeterende. Å lage en større liste med samme tilnærming kan være veldig kjedelig. En enkel alternativ tilnærming er å bruke to lister i stedet: en som inneholder dataene, og en som inneholder widgets.

Slik kan du bruke [] operatør for raskt å lage en dataliste, som for øyeblikket bare inneholder flere strenge:

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

For å konvertere listen over strenger over til en liste over RaisedButton widgets, kan du bruke kart() og ramse opp() metoder. Med kart() metode, kan du bruke hver streng til å generere en ny RaisedButton widget. Og med ramse opp() Metode, du kan konvertere Iterable objekt returnert av kart() metode til en faktisk Liste gjenstand. Følgende kode viser deg hvordan:

Liste myWidgets = data.map ((item) return new RaisedButton (barn: ny tekst (element), onPressed: () async String url = "https: // $ item .com" )) venter lansering (url););). toList ();

For fullstendig skyld viser koden ovenfor hvordan du lager en onPressed hendelseshåndterer som bruker canLaunch () og lansering () metoder som tilbys av url_launcher pakke for å åpne nettstedet som brukeren har valgt i standard nettleser.

Når listen er klar, kan du sende den til barn eiendom av Listevisning widget for å vise den.

ListView myList = ny ListView (barn: myWidgets);

På dette tidspunktet, hvis du kjører appen, bør du kunne bla gjennom listen og trykke på en hvilken som helst knapp for å starte den tilknyttede nettsiden.

3. Opprette et rutenett

De Listevisning widget lar deg plassere bare ett element på sin kryss akse. Elementet vil som standard bli strukket for å innta all ledig plass på den aksen. Hvis du vil ha mer fleksibilitet, bør du vurdere å bruke en Rutenett visning widget i stedet, som lar deg angi hvor mange elementer du vil ha på kryssaksen.

Følgende kode bruker GridView.count () konstruktør for å lage en Rutenett visning widget som viser to elementer per rad:

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

Her ser nettverket ut:

4. Viser store lister

For datalister som inneholder mer enn noen få dusin elementer, bør du unngå å generere widgetlister manuelt, slik du gjorde i et tidligere trinn. Hvorfor? Fordi å lage en widget er en dyr operasjon, og store lister over widgets kan forbruke mye minne.

I stedet bør du bruke IndexedWidgetBuilder funksjon, som lar deg generere widgets bare når brukeren trenger å se dem. Med det kan du lazily lage widgets som brukeren ruller gjennom din Listevisning widget.

Det er ganske lite sannsynlig at du skal ha store mengder data definert rett innenfor appene dine. Vanligvis vil du hente slike data fra en ekstern server. For å gi deg et realistisk eksempel, la meg nå vise deg hvordan du kan hente 100 spørsmål fra Stack Overflow ved hjelp av Stack Exchange API og vise dem på etterspørsel.

Start med å lage en underklasse av StatefulWidget klassen, som vil fungere som en beholder for din Listevisning widget og overstyr den createState () metode.

klasse VeryLargeListHolder utvider StatefulWidget @override State createState () returner nytt MyState (); 

De MyState Klassen nevnt i koden ovenfor eksisterer ikke ennå, så opprett den og overstyr den bygge() metode.

klassen MyState utvider staten @override Widget build (BuildContext kontekst) // TODO

Deretter legger du til en Liste objekt som en av medlemsvariablene i klassen. Du bruker det til å lagre spørsmålene du lastet ned fra Stack Overflow. I tillegg legger du til endringspunktet for API-en som en annen variabel.

Liste spørsmål; String endpoint = "https://api.stackexchange.com/2.2/questions?" + "pageize = 100 & order = desc & sort = aktivitet & site = stackoverflow";

Med mindre du vil at brukeren skal trykke på en knapp for å laste ned spørsmålene, foreslår jeg at du laster dem ned automatisk når widgeten initialiseres. Følgelig overstyrer initState () metode og ringe til en ny asynkron metode kalt loadData ().

@override void initState () super.initState (); loadData ();  void loadData () async // Mer kode her

Inne i loadData () metode, kan du bruke få() funksjon av Dart's http pakke for å laste ned spørsmålene. API-endepunktet returnerer et JSON-dokument, som du kan analysere ved å bruke json.decode () funksjon tilgjengelig i Dart's konvertere pakke. Følgende kode viser deg hvordan:

String rawData = (avventer http.get (endepunkt)). Kropp; Kart jsonData = json.decode (rawData);

Når JSON-dokumentet er konvertert til a Kart objekt, kan du bruke verdien som er knyttet til dens elementer nøkkel til å initialisere spørsmål variabel. Variabelen er imidlertid en del av widgetens tilstand. Derfor må du sørge for at du oppdaterer den inne i setState () bare metode. Dette er hvordan:

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

På dette tidspunktet kan du opprette en ny Listevisning widget ved hjelp av ListView.builder () konstruktør, som forventer en IndexedWidgetBuilder funksjon og et element teller som sine argumenter. For nå er antall teller ingenting annet enn størrelsen på spørsmål liste. Følgelig legger du til følgende kode inne i bygge() metode av MyState klasse:

ListView myList = ListView.builder (itemCount: questions == null? 0: questions.length, itemBuilder: (BuildContext kontekst, int indeks) // Mer kode her);

I builderfunksjonen er alt du trenger å gjøre, å lage et lite widgettre for å vise forskjellige detaljer om hvert spørsmål du lastet ned. Flutter er materiale pakken tilbyr en veldig nyttig widget kalt ListTile, som gjør at du raskt kan lage et slikt tre samtidig som du følger retningslinjene for Materialdesign.

Følgende kode viser hvordan du viser spørsmålet tittel og forfatter ved hjelp av tittel og undertittel egenskaper av ListTile widget:

returnere ny ListTile (tittel: Tekst (spørsmål [index] ["title"]), tekst: Tekst ("Asked by $ questions [index] [" owner "] [" display_name "]"));

Til slutt, opprett en ny stillas~~POS=TRUNC widget, tilordne Listevisning widget til sin kropp eiendom, og returner den fra bygge() metode slik at den kan brukes med a MaterialApp widget. Eventuelt kan du legge til en appbar widget til stillas~~POS=TRUNC widget.

returner ny stillas (appBar: ny AppBar (tittel: ny tekst ("LargeListDemo")), kropp: myList);

Slik ser appen ut etter at den har lastet ned spørsmålene:

Konklusjon

Du vet nå hvordan du skal arbeide med lister i et Flutter-program. I denne opplæringen lærte du ikke bare hvordan du oppretter lister og grid som støtter store datakilder, men også hvordan du lager hvert element inni dem interaktivt. For å lære mer om lister i Flutter, kan du se den offisielle dokumentasjonen.