J'obtiens une exception de rendu que je ne comprends pas comment corriger. J'essaye de créer une colonne qui a 3 lignes.
Ligne [Image]
Ligne [TextField]
Ligne [Buttons]
Voici mon code pour construire le conteneur:
Container buildEnterAppContainer(BuildContext context) {
var container = new Container(
padding: const EdgeInsets.all(8.0),
child: new Column(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
buildImageRow(context),
buildAppEntryRow(context),
buildButtonRow(context)
],
),
);
return container;
}
et mon code buildAppEntryRow pour le conteneur de texte
Widget buildAppEntryRow(BuildContext context) {
return new Row(
children: <Widget>[
new TextField(
decoration: const InputDecoration(helperText: "Enter App ID"),
style: Theme.of(context).textTheme.body1,
)
],
);
}
Quand je cours, j'obtiens l'exception suivante:
I/flutter ( 7674): BoxConstraints forces an infinite width.
I/flutter ( 7674): These invalid constraints were provided to RenderStack's layout() function by the following
I/flutter ( 7674): function, which probably computed the invalid constraints in question:
I/flutter ( 7674): RenderConstrainedBox.performLayout (package:flutter/src/rendering/proxy_box.dart:256:13)
I/flutter ( 7674): The offending constraints were:
I/flutter ( 7674): BoxConstraints(w=Infinity, 0.0<=h<=Infinity)
Si je change buildAppEntryRow en juste un TextField comme ceci
Widget buildAppEntryRow2(BuildContext context) {
return new TextField(
decoration: const InputDecoration(helperText: "Enter App ID"),
style: Theme.of(context).textTheme.body1,
);
}
Je n'ai plus l'exception. Que me manque-t-il avec l'implémentation de la ligne qui l'empêche de calculer la taille de cette ligne?
mainAxisAlignment
le widget Row. Avec deux widgets de texte, il n'y a pas de problème, mais avec un widget de texte et un widget Textfield qu'il contient,Flexible
il est aligné à gauche sans espacement.Vous obtenez cette erreur parce que se
TextField
développe dans le sens horizontal, tout comme leRow
, nous devons donc limiter la largeur duTextField
, il existe de nombreuses façons de le faire.Utilisation
Expanded
Utilisation
Flexible
Enveloppez-le dans
Container
ouSizedBox
et fournissezwidth
la source
TextField
à la suite.vous devez utiliser Flexible pour utiliser un champ de texte à l'intérieur d'une ligne.
la source
Container
, vous pouvez utiliser leFlexible
directement.La solution consiste à envelopper votre
Text()
intérieur dans l'un des widgets suivants: SoitExpanded
ouFlexible
. Ainsi, votre code utilisant Expanded sera comme:la source
Comme @Asif Shiraz l'a mentionné, j'ai eu le même problème et je l'ai résolu en enveloppant la colonne dans un flexible, ici comme ça,
la source
Une solution simple consiste à envelopper votre
Text()
intérieur aContainer()
. Donc, votre code sera comme:Ici, vous obtenez également l'attribut width et height d'un conteneur pour ajuster l'apparence de votre champ de texte. Pas besoin d'utiliser
Flexible
si vous encapsulez votre champ de texte à l'intérieur d'un conteneur.la source
width: n