Google Flutter From Scratch Grilles, listes et sources de données

Aujourd'hui, presque toutes les applications mobiles non-triviales ont probablement des listes dans leurs mises en page. En effet, l'utilisation d'une liste déroulante est souvent le moyen le plus simple d'afficher un grand nombre d'éléments similaires sur un petit écran.. 

La structure Flutter offre plusieurs widgets que vous pouvez utiliser pour créer et afficher de telles listes avec un minimum de code. Dans ce tutoriel, je vais vous montrer comment les utiliser avec des sources de données locales et distantes..

1. Affichage d'une liste non déroulable

Si vous avez besoin d'afficher un petit nombre d'éléments similaires et que vous êtes certain que l'écran de l'utilisateur sera en mesure de les afficher simultanément, utilisez la commande Colonne widget est la chose la plus efficace à faire.

Pour créer une liste dans votre application Flutter, vous pouvez utiliser le liste classe offerte par le langage de programmation Dart. Après avoir créé la liste, vous pouvez utiliser ses ajouter() méthode pour ajouter un nombre quelconque d’articles. Le code suivant vous montre comment créer une liste contenant trois RaisedButton widgets:

// Créer liste liste myItems = new List (); // Ajoute trois widgets de bouton à celui-ci myItems.add (new RaisedButton (child: new Text ("Twitter"), onPressed: () )); myItems.add (new RaisedButton (child: new Text ("Facebook"), onPressed: () )); myItems.add (new RaisedButton (child: new Text ("Reddit"), onPressed: () ));

Notez que chaque élément de la liste a un vide onPressed gestionnaire d'événements qui lui est associé car, sans cela, l'élément serait désactivé.

Maintenant que la liste est prête, vous pouvez l’affecter directement à la liste. les enfants propriété du Colonne widget à afficher. Toutefois, vous voudrez généralement aussi spécifier où les éléments de la liste doivent être placés à l'écran. Parce que le Colonne widget est un widget flex, vous pouvez contrôler la position des éléments le long de son axe principal et de son axe transversal à l'aide du bouton mainAxisAlignment et crossAxisAlignment Propriétés. Par défaut, pour le Colonne widget, l'axe principal est l'axe vertical et l'axe transversal est l'axe horizontal.

Le code suivant vous montre comment étendre les trois boutons sur l'axe horizontal et les placer au centre de l'écran verticalement:

Colonne colonne = nouvelle colonne (mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.stretch, children: myItems);

Voici à quoi ressemblera la colonne maintenant:

Il est important de noter que vous rencontrerez une erreur d’exécution si un Colonne Le widget ne peut pas accueillir tous ses enfants. Par exemple, si vous aviez plus d’une douzaine de RaisedButton widgets dans votre liste au lieu de trois, vous verrez un message d'erreur qui ressemble à ceci:

2. Affichage d'une simple liste déroulante

Pour les listes un peu plus grandes, celles dont le contenu risque de déborder de l'écran, vous devez envisager d'utiliser un ListView widget parce qu'il prend en charge le défilement.

Vous avez peut-être remarqué que le code que nous avons écrit pour créer la liste à l'étape précédente était à la fois long et répétitif. Créer une liste plus longue en utilisant la même approche peut être très fastidieux. Une approche alternative simple consiste à utiliser deux listes: une contenant les données et une autre contenant les widgets..

Voici comment vous pouvez utiliser le [] opérateur pour créer rapidement une liste de données qui, pour le moment, ne contient que plusieurs chaînes:

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

Pour convertir la liste de chaînes ci-dessus en une liste de RaisedButton widgets, vous pouvez utiliser le carte() et lister() méthodes. Avec le carte() méthode, vous pouvez utiliser chaque chaîne pour générer un nouveau RaisedButton widget. Et avec le lister() méthode, vous pouvez convertir le Iterable objet retourné par le carte() méthode dans un réel liste objet. Le code suivant vous montre comment:

liste myWidgets = data.map ((item) retour new new RaisedButton (child: new Text (item), onPressed: ()) async String url = "https: // $ item .com"; if (wait canLaunch (url )) attend le lancement (url););). toList ();

Par souci d’exhaustivité, le code ci-dessus vous indique également comment créer un onPressed gestionnaire d'événements qui utilise le canLaunch () et lancement() méthodes offertes par le url_launcher package pour ouvrir le site Web que l'utilisateur a sélectionné dans le navigateur par défaut.

Une fois que votre liste est prête, vous pouvez la transmettre au les enfants propriété du ListView widget pour l'afficher.

ListView myList = new ListView (enfants: myWidgets);

À ce stade, si vous exécutez l'application, vous devriez pouvoir faire défiler la liste et appuyer sur n'importe quel bouton pour lancer le site Web associé..

3. Créer une grille

le ListView Le widget vous permet de placer un seul élément sur son axe transversal. L'élément sera, par défaut, étiré pour occuper tout l'espace disponible sur cet axe. Si vous voulez plus de flexibilité, vous devriez envisager d'utiliser un GridView widget à la place, qui vous permet de spécifier le nombre d'éléments que vous souhaitez sur l'axe transversal.

Le code suivant utilise le GridView.count () constructeur pour créer un GridView widget qui affiche deux éléments par ligne:

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

Voici à quoi ressemble la grille:

4. Affichage de grandes listes

Pour les listes de données contenant plus de quelques douzaines d'éléments, évitez de générer manuellement des listes de widgets, comme vous le faisiez dans une étape précédente. Pourquoi? Parce que créer un widget est une opération coûteuse et que de grandes listes de widgets peuvent utiliser beaucoup de mémoire.

Au lieu de cela, vous devriez utiliser le ConstructeurIndexé fonction, qui vous permet de générer des widgets uniquement lorsque l'utilisateur a besoin de les voir. Avec celui-ci, vous pouvez générer des widgets paresseusement lorsque l'utilisateur fait défiler votre ListView widget.

Il est peu probable que de grandes quantités de données soient définies directement dans vos applications. En règle générale, vous récupérez de telles données sur un serveur distant. Par conséquent, pour vous donner un exemple réaliste, laissez-moi maintenant vous montrer comment extraire 100 questions de Stack Overflow à l'aide de l'API Stack Exchange et les afficher à la demande..

Commencez par créer une sous-classe du StatefulWidget classe, qui agira comme un conteneur pour votre ListView widget et remplacer sa createState () méthode.

La classe VeryLargeListHolder étend StatefulWidget @override State createState () retour new myState (); 

le Mon état La classe mentionnée dans le code ci-dessus n’existe pas encore. Créez-la et remplacez-la. construire() méthode.

la classe MyState étend l'Etat @override Widget build (contexte BuildContext) // TODO

Ensuite, ajoutez un liste objet comme l'une des variables membres de la classe. Vous allez l'utiliser pour stocker les questions que vous avez téléchargées à partir de Stack Overflow. De plus, ajoutez le noeud final de l'API en tant que autre variable.

Répertoriez les questions String endpoint = "https://api.stackexchange.com/2.2/questions?" + "pagesize = 100 & order = desc & sort = activity & site = stackoverflow";

À moins que vous ne souhaitiez que vos utilisateurs appuient sur un bouton pour télécharger les questions, je vous suggère de les télécharger automatiquement lorsque le widget est en cours d'initialisation. Par conséquent, remplacez le initState () et appelez une nouvelle méthode asynchrone appelée loadData ().

@override void initState () super.initState (); loadData ();  void loadData () async // Plus de code ici

À l'intérieur de loadData () méthode, vous pouvez utiliser le obtenir() fonction de Dart http package pour télécharger les questions. Le point de terminaison de l'API renvoie un document JSON, que vous pouvez analyser à l'aide du json.decode () fonction disponible dans Dart convertir paquet. Le code suivant vous montre comment:

String rawData = (wait http.get (endpoint)). Body; Map jsonData = json.decode (rawData);

Une fois le document JSON converti en un fichier Carte objet, vous pouvez utiliser la valeur associée à son articles clé pour initialiser le des questions variable. La variable, cependant, fait partie de l'état du widget. Par conséquent, vous devez vous assurer de le mettre à jour à l’intérieur du setState () méthode seulement. Voici comment:

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

À ce stade, vous pouvez créer un nouveau ListView widget en utilisant le ListView.builder () constructeur, qui attend un ConstructeurIndexé fonction et un élément comptent comme arguments. Pour l’instant, le nombre d’articles n’est autre que la taille de la des questions liste. En conséquence, ajoutez le code suivant dans le répertoire construire() méthode du Mon état classe:

ListView myList = ListView.builder (itemCount: questions == null? 0: questions.length, itemBuilder: (contexte BuildContext, index int) // Plus de code ici);

Dans la fonction de création, il vous suffit de créer une petite arborescence de widgets pour afficher divers détails sur chaque question téléchargée. Flutter Matériel Le paquet offre un widget très pratique appelé ListTile, ce qui vous permet de créer rapidement un tel arbre tout en respectant les directives de conception des matériaux.

Le code suivant vous montre comment afficher le titre et l'auteur de la question à l'aide du bouton Titre et Sous-titre propriétés du ListTile widget:

return new ListTile (title: Text (questions [index] ["title"]), sous-titre: Text ("Question posée par $ questions [index] [" propriétaire "] [" nom_écran "]"));

Enfin, créez un nouveau Échafaud widget, attribuer le ListView widget à son corps propriété, et le retourner de la construire() méthode afin qu'il puisse être utilisé avec un MaterialApp widget. Facultativement, vous pouvez ajouter un AppBar widget à la Échafaud widget.

return new Scaffold (appBar: new AppBar (titre: new Text ("LargeListDemo")), corps: maListe);

Voici à quoi ressemblera l'application après avoir téléchargé les questions:

Conclusion

Vous savez maintenant comment utiliser les listes dans une application Flutter. Dans ce didacticiel, vous avez non seulement appris à créer des listes et des grilles prenant en charge des sources de données volumineuses, mais également à rendre chaque élément de leur contenu interactif. Pour en savoir plus sur les listes dans Flutter, vous pouvez vous référer à la documentation officielle.