Dans Android match_parent
et wrap_content
sont utilisés pour redimensionner les widgets automatiquement par rapport à leur parent au contenu que le widget contient.
Dans Flutter, il semble que tous les widgets sont définis par défaut sur wrap_content
, comment le changerais-je de manière à pouvoir le remplir width
et height
à celui de son parent?
Lien de l'article original
la source
crossAxisAlignment
champ sur les lignes et les colonnes qui peut être configuréCrossAxisAlignment.stretch
pour s'étendre horizontalement dans une colonne par exempleLa réponse courte est que le parent n'a pas de taille tant que l'enfant n'a pas une taille.
La façon dont la mise en page fonctionne dans Flutter est que chaque widget fournit des contraintes à chacun de ses enfants, comme "vous pouvez être aussi large, vous devez être aussi grand, vous devez être au moins aussi large", ou autre (en particulier, ils obtenir une largeur minimale, une largeur maximale, une hauteur minimale et une hauteur maximale). Chaque enfant prend ces contraintes, fait quelque chose et choisit une taille (largeur et hauteur) qui correspond à ces contraintes. Ensuite, une fois que chaque enfant a fait son travail, le widget peut choisir sa propre taille.
Certains widgets essaient d'être aussi gros que le parent le permet. Certains widgets essaient d'être aussi petits que le parent le permet. Certains widgets essaient de correspondre à une certaine taille "naturelle" (par exemple du texte, des images).
Certains widgets indiquent à leurs enfants qu'ils peuvent avoir la taille de leur choix. Certains donnent à leurs enfants les mêmes contraintes que leurs parents.
la source
PageView
inside aColumn
, avec un autreColumn
dans le courantpage
, j'obtiens une erreur de rendu, mais je peux la corriger en enveloppant l'PageView
intérieur d'unExpanded
ou aFlexible
. Le problème est que ces 2 options ne font qu'augmenter leur enfant. Pourquoi n'y a-t-il pas de widget connexe pour réduire la taille, comme «envelopper le contenu», pour résoudre ce type de problèmes de rendu?Il existe en fait quelques options disponibles:
Vous pouvez utiliser SizedBox.expand pour que votre widget corresponde aux dimensions des parents, ou SizedBox (width: double.infinity) pour ne correspondre qu'à la largeur ou SizedBox (heigth: double.infinity) pour ne correspondre qu'à la hauteur.
Si vous voulez un comportement wrap_content, cela dépend du widget parent que vous utilisez, par exemple si vous mettez un bouton sur une colonne, il se comportera comme wrap_content et pour l'utiliser comme match_parent, vous pouvez envelopper le bouton avec un widget étendu ou une sizebox.
Avec un ListView, le bouton obtient un comportement match_parent et pour obtenir un comportement wrap_content, vous pouvez l'envelopper avec un widget Flex comme Row.
L'utilisation d'un widget Développé permet à un enfant d'une ligne, d'une colonne ou d'un Flex de se développer pour remplir l'espace disponible dans l'axe principal (par exemple, horizontalement pour une ligne ou verticalement pour une colonne). https://docs.flutter.io/flutter/widgets/Expanded-class.html
L'utilisation d'un widget flexible donne à l'enfant d'une ligne, d'une colonne ou d'un flex la flexibilité de s'étendre pour remplir l'espace disponible dans l'axe principal (par exemple, horizontalement pour une ligne ou verticalement pour une colonne), mais, contrairement à Expanded, Flexible ne le fait pas demander à l'enfant de remplir l'espace disponible. https://docs.flutter.io/flutter/widgets/Flexible-class.html
la source
Une solution de contournement simple:
Si un conteneur n'a qu'un seul enfant de niveau supérieur, vous pouvez spécifier la propriété d'alignement pour l'enfant et lui donner toute valeur disponible. cela remplira tout l'espace du conteneur.
Autrement:
la source
BoxConstraints.expand(height: 100.0)
fonctionne très bien comme l'width="match_parent"
équivalent d'AndroidJ'ai utilisé cette solution, vous devez définir la hauteur et la largeur de votre écran à l'aide de MediaQuery:
la source
la source
Utilisez le widget
Wrap
.Pour
Column
un comportement similaire, essayez:Pour
Row
un comportement similaire, essayez:Pour plus d'informations: Wrap (Flutter Widget)
la source
Utilisez cette ligne de codes à l'intérieur de la colonne. Pour wrap_content:
mainAxisSize: MainAxisSize.min
Pour match_parent:mainAxisSize: MainAxisSize.max
la source
Il existe en fait un moyen très simple et soigné de le faire.
Utilisez un
FractionallySizedBox
widget.Ce widget est également très utile lorsque vous souhaitez dimensionner votre enfant à une fraction de la taille de son parent.
la source
Pour qu'un enfant remplisse son parent, enveloppez-le simplement dans une FittedBox
la source