Flutterapp
Structure du code flottant
Cadre de base
Importer des packages.
import 'package:flutter/matériel.dart' ;
Cette ligne de code agit comme une importation de la bibliothèque de composants Material UI. Material est un langage de conception visuel standard pour mobile et Web, et Flutter fournit par défaut un riche ensemble de composants d'interface utilisateur de style Material. 2.
portail d'applications.
void main() => runApp(MyApp());
- Similaire à C/C++, Java, la fonction
main
dans l'application Flutter est le point d'entrée de l'application. La fonctionmain
appelle la méthoderunApp
, dont la fonction est de démarrer l'application Flutter.runApp
prend un paramètreWidget
, qui dans ce cas est un objetMyApp
, etMyApp()
est le composant racine de l'application Flutter. - La fonction
main
utilise la notation (=>
), qui est un raccourci pour une fonction ou une méthode à une ligne dans Dart.
- Similaire à C/C++, Java, la fonction
Structuration des candidatures.
class MyApp étend StatelessWidget {
@override
Widget build (contexte BuildContext) {
return new MaterialApp(
//nom de l'application
titre : 'Flutter Demo',
thème : new ThemeData(
//thème bleu
primarySwatch : couleurs. blue,
),
//route de la page d'accueil de l'application
home: new MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}- La classe `MyApp` représente une application Flutter qui hérite de la classe `StatelessWidget` , ce qui signifie que l'application elle-même est également un widget.
- Dans Flutter, la plupart des choses sont des widgets (plus tard "composants" ou "widgets"), y compris l'alignement, le rembourrage, la mise en page, etc., qui sont tous fournis sous la forme de widgets.
- Flutter appelle la méthode `build` d'un composant lors de la construction d'une page. Le travail principal d'un widget est de fournir une méthode build () pour décrire comment construire l'interface utilisateur (généralement en combinant et en assemblant d'autres widgets de base).
- `MaterialApp` est le framework Flutter APP fourni dans la bibliothèque de matériaux, à travers lequel vous pouvez définir le nom, le thème, la langue, la page d'accueil et la liste de routage de l'application. `MaterialApp` est également un widget.
- `home` est la page d'accueil de l'application Flutter, c'est aussi un widget.
Composant de la page d'accueil
class MyHomePage extend StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
titres de String final ;
@override
_MyHomePageState createState() => new _MyHomePageState();
}
classe _MyHomePageState étend l'état<MyHomePage> {
}
MyHomePage
est la page d'accueil de l'application Flutter, elle hérite de la classe StatefulWidget
, ce qui signifie qu'il s'agit d'un widget à état (un composant à état). Pour l'instant, considérons brièvement qu'un widget avec état est différent d'un widget sans état de deux manières.
Les widgets avec état peuvent avoir des états modifiables pendant le cycle de vie du widget, tandis que les widgets sans état sont immuables.
Le widget avec état se compose d'au moins deux classes.
- Une classe
StatefulWidget
. - Une classe
État
; la classeStatefulWidget
elle-même est immuable, mais l'état détenu dans la classeState
peut changer au cours du cycle de vie du widget.
La classe
_MyHomePageState
est la classe d'état correspondant à la classeMyHomePage
. Ici, le lecteur a peut-être remarqué : Contrairement à la classeMyApp
, il n'y a pas de méthodebuild
dans la classeMyHomePage
, à la place, la méthodebuild
a été déplacée vers la méthode_MyHomePageState
.- Une classe
Classe d'état
Voyons ensuite ce que contient _MyHomePageState
.
l'état du composant. Puisque nous n'avons besoin de maintenir qu'un compteur de clics, définissez un état
_counter
.``dard int _counter = 0 ; // utilisé pour enregistrer le nombre total de clics sur le bouton
`_counter` est l'état qui contient le nombre de clics sur le bouton avec un signe "+" dans le coin inférieur droit de l'écran.Définissez la fonction d'auto-incrémentation pour l'état.
void _incrementCounter() {
setState(() {
_counter++;
});
}Cette fonction est appelée lorsque le bouton est cliqué. La fonction fonctionne en auto-incrémentant d'abord
_counter
puis en appelant la méthodesetState
. Le but de la méthodesetState
est de notifier au framework Flutter qu'un état a changé. Lorsque le framework Flutter reçoit la notification, il exécute la méthodebuild
pour reconstruire l'interface en fonction du nouvel état. vous pouvez donc reconstruire tout ce qui doit être mis à jour sans avoir à modifier les widgets individuels.Créer une interface utilisateur
La logique de construction de l'interface utilisateur se trouve dans la méthode
build
. LorsqueMyHomePage
est créé pour la première fois, la classe_MyHomePageState
sera créée, et lorsque l'initialisation sera terminée, le framework Flutter appellera la méthodebuild
du widget pour construire l'arborescence du widget, et enfin affichera le arborescence de widgets à l'écran de l'appareil. Voyons donc ce qui est fait dans la méthodebuild
de_MyHomePageState
.Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text(widget.title),
),
body: new Center(
child: new Column(
mainAxisAlignment: MainAxisAlignment.center ,
enfants : <Widget>[
new Text(
'Vous avez appuyé plusieurs fois sur le bouton :',
),
new Text(
'$_counter',
style : Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton : new FloatingActionButton(
onPressed : _incrementCounter,
tooltip : 'Increment',
child : new Icon(Icons.add),
),
);
}- `Scaffold` est un échafaudage de page fourni dans la bibliothèque de matériaux qui fournit une barre de navigation par défaut, un en-tête et une propriété `corps` contenant l'arborescence des widgets de l'écran principal (appelée plus tard "arborescence des composants" ou "arborescence des widgets") . Les arbres de composants peuvent être très complexes. Dans les exemples plus loin dans ce livre, les routes sont créées via `Scaffold` par défaut.
- L'arborescence de composants de `corps` contient un composant `Center` et `Center` peut aligner ses arbres de composants enfants sur le centre de l'écran. Dans ce cas, le sous-composant `Centre` est un composant `Colonne` , et le rôle de `Colonne` est d'aligner tous ses sous-composants verticalement le long de l'écran ; dans ce cas, le sous-composant `Colonne` est composé de deux `Texte`s, et le premier `Texte` affiche le texte fixe "Vous avez appuyé sur le bouton plusieurs fois :", et le second `Texte` affiche la valeur du `_état du compteur`.
- Le `flottantActionButton` est le bouton de survol avec `+` dans le coin inférieur droit de la page, sa propriété `onPressed` accepte une fonction de rappel qui représente son gestionnaire lorsqu'il est cliqué, dans ce cas, la méthode `_incrementCounter` est directement utilisée comme sa fonction de gestionnaire.
Maintenant, enchaînons l'intégralité du flux d'exécution du compteur : lorsque le bouton floatingActionButton
dans le coin inférieur droit est cliqué, la méthode _incrementCounter
est appelée. Dans la méthode _incrementCounter
, d'abord le compteur _counter
(état) sera auto-incrémenté, puis setState
notifiera le framework Flutter que l'état a changé, puis le framework Flutter appellera la méthode build
pour reconstruire l'interface utilisateur avec le nouvel état et enfin l'afficher sur l'écran de l'appareil.
Pourquoi mettre la méthode build dans State et non dans StatefulWidget ?
Maintenant, répondons à la question posée précédemment, pourquoi la méthode build()
est-elle placée dans State (au lieu de StatefulWidget
) ? Il s'agit principalement d'augmenter la flexibilité du développement. Si la méthode build()
est placée dans le StatefulWidget
, il y a deux problèmes.
Accès à l'État peu pratique
Imaginez si notre
StatefulWidget
a plusieurs états, et à chaque fois que l'état change, nous devons appeler la méthodebuild
, puisque l'état est stocké dans State, si la méthodebuild
est dansStatefulWidget
, alors lela méthode build
et l'état sont dans deux classes distinctes, il sera donc très gênant de lire l'état lors de la construction ! serait très gênant ! Imaginez si vous mettez réellement la méthodebuild
dans un StatefulWidget, puisque le processus de construction de l'interface utilisateur dépend de l'état, la méthodebuild
devrait avoir un paramètreState
, quelque chose comme ce qui suit.Widget build (contexte BuildContext, état de l'état){
//state.counter
...
}Dans ce cas, vous pouvez uniquement déclarer tout l'état de l'état comme public, de sorte que vous pouvez accéder à l'état en dehors de la classe State ! Cependant, en rendant l'État public, l'État ne sera plus privé, ce qui signifie que les modifications de l'État deviendront incontrôlables. Mais si vous mettez la méthode
build()
dans l'état, le processus de construction a non seulement un accès direct à l'état, mais n'a pas non plus besoin d'exposer l'état privé, ce qui est très pratique.L'héritage de
StatefulWidget
n'est pas pratiquePar exemple, Flutter a une classe de base
AnimatedWidget
pour les widgets animés, qui hérite de la classeStatefulWidget
. Une méthode abstraitebuild(BuildContext context)
est introduite dansAnimatedWidget
, et tous les widgets animés qui héritent deAnimatedWidget
doivent implémenter cette méthodebuild
. Imaginez maintenant que si la classeStatefulWidget
a déjà une méthodebuild
, comme décrit ci-dessus, la méthodebuild
doit recevoir un objet d'état, ce qui signifie que leAnimatedWidget
doit passer son propre objet State (noté comme _animatedWidgetState) à sa classe enfant, car la classe enfant doit appeler la méthodebuild
de la classe parent dans sa méthodebuild
, et le code peut ressembler à ceci.class MyAnimationWidget étend AnimatedWidget{
@override
Widget build(BuildContext context, State state){
//puisque la sous-classe va utiliser l'objet d'état _animatedWidgetState de l'AnimatedWidget.
// donc l'AnimatedWidget doit d'une manière ou d'une autre exposer son objet d'état _animatedWidgetState
// l'exposer à ses sous-classes
super.build(context, _animatedWidgetState)
}
}Cela n'a évidemment aucun sens, car
1. l'objet d'état de `AnimatedWidget` est un détail d'implémentation interne de `AnimatedWidget` et ne doit pas être exposé à l'extérieur.
2. si l'état de la classe parent doit être exposé à la classe enfant, alors il doit y avoir un mécanisme de passage, et il est inutile de faire cet ensemble de mécanismes de passage, car le passage de l'état entre les classes parent et enfant n'est pas pertinent pour la logique de la classe enfant elle-même.
En résumé, on peut constater que pour StatefulWidget
, mettre la méthode build
dans State peut apporter beaucoup de souplesse au développement.