422 votes

Comment ajouter un ListView à une colonne dans Flutter ?

J'essaie de construire une page de connexion simple pour mon application Flutter. J'ai réussi à construire les TextFields et les boutons de connexion/signature. Je veux ajouter un ListView horizontal. Lorsque j'exécute le code, mes éléments disparaissent. Si je le fais sans le ListView, tout va bien à nouveau. Comment puis-je le faire correctement ?

return new MaterialApp(
        home: new Scaffold(
          appBar: new AppBar(
            title: new Text("Login / Signup"),
          ),
          body: new Container(
            child: new Center(
              child: new Column(
              mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  new TextField(
                    decoration: new InputDecoration(
                      hintText: "E M A I L    A D D R E S S"
                    ),
                  ),
                  new Padding(padding: new EdgeInsets.all(15.00)),
                  new TextField(obscureText: true,
                    decoration: new InputDecoration(
                      hintText: "P A S S W O R D"
                    ),
                    ),
                  new Padding(padding: new EdgeInsets.all(15.00)),
                  new TextField(decoration: new InputDecoration(
                    hintText: "U S E R N A M E"
                  ),),
                  new RaisedButton(onPressed: null,
                  child:  new Text("SIGNUP"),),
                  new Padding(padding: new EdgeInsets.all(15.00)),
                  new RaisedButton(onPressed: null,
                  child: new Text("LOGIN"),),
                  new Padding(padding: new EdgeInsets.all(15.00)),
                  new ListView(scrollDirection: Axis.horizontal,
                  children: <Widget>[
                    new RaisedButton(onPressed: null,
                    child: new Text("Facebook"),),
                    new Padding(padding: new EdgeInsets.all(5.00)),
                    new RaisedButton(onPressed: null,
                    child: new Text("Google"),)
                  ],)

                ],
              ),
            ),
            margin: new EdgeInsets.all(15.00),
          ),
        ),
      );

598voto

up2up Points 1401

J'ai aussi ce problème. Ma solution est d'utiliser Expanded widget pour étendre l'espace restant.

Column(
  children: <Widget>[
    Expanded(
      child: horizontalList,
    )
  ],
);

5 votes

Il s'agit d'une excellente solution, car elle permet de varier la hauteur/largeur de la liste, par exemple lorsque vous souhaitez qu'elle occupe tout l'espace restant. Elle vous permet de tenir compte des différentes tailles d'écran lorsqu'il est trop difficile de connaître la hauteur/largeur exacte.

5 votes

Cela devrait être la réponse acceptée. Cette solution permet au ListView d'occuper le reste de l'écran sans avoir à gérer la requête média.

1 votes

Je suis trop novice en Flutter pour savoir pourquoi cela fonctionne, mais je suis content que ce soit le cas. Merci. Les messages d'erreur de Flutter n'étaient pas très utiles pour expliquer la cause première de ce problème à un non-expert.

421voto

CopsOnRoad Points 4705

Raison de l'erreur :

Column s'étend jusqu'à la taille maximale dans la direction de l'axe principal (axe vertical), et il en va de même pour le fichier ListView .

Solutions

Ainsi, vous devez contraindre la hauteur de l'élément ListView . Il existe de nombreuses façons de procéder, vous pouvez choisir celle qui convient le mieux à vos besoins.


  1. Si vous voulez permettre ListView pour occuper tout l'espace restant à l'intérieur Column utiliser Expanded .

    Column(
      children: <Widget>[
        Expanded(
          child: ListView(...),
        )
      ],
    )

  1. Si vous voulez limiter votre ListView à certains height vous pouvez utiliser SizedBox .

    Column(
      children: <Widget>[
        SizedBox(
          height: 200, // constrain height
          child: ListView(),
        )
      ],
    )

  1. Si votre ListView est faible, vous pouvez essayer shrinkWrap sur elle.

    Column(
      children: <Widget>[
        ListView(
          shrinkWrap: true, // use it
        )
      ],
    )

0 votes

Ma taille ne devrait pas être fixée et les autres réponses n'ont pas fonctionné pour moi =/

2 votes

@DanielVilela L'option 1 devrait vous convenir. Si ce n'est pas le cas, postez-le comme question et si je suis disponible, je pourrai y répondre.

1 votes

J'ai réussi à le faire fonctionner ! Merci. J'ai dû mettre un Expanded() à certains endroits stratégiques.

159voto

German Saprykin Points 1827

Vous pouvez vérifier la sortie de la console. Elle affiche une erreur :

L'assertion suivante a été lancée pendant performResize() : La hauteur de la fenêtre d'affichage horizontale n'était pas illimitée. Les fenêtres d'affichage s'étendent dans l'axe transversal pour remplir leur conteneur et contraignent leurs enfants à correspondre à leur extension dans l'axe transversal. Dans ce cas, une fenêtre horizontale a reçu une quantité illimitée de espace vertical illimité pour s'étendre.

Vous devez ajouter une contrainte de hauteur à votre liste horizontale. Par exemple, envelopper dans un conteneur avec une hauteur :

Container(
  height: 44.0,
  child: ListView(
    scrollDirection: Axis.horizontal,
    children: <Widget>[
      RaisedButton(
        onPressed: null,
        child: Text("Facebook"),
      ),
      Padding(padding: EdgeInsets.all(5.00)),
      RaisedButton(
        onPressed: null,
        child: Text("Google"),
      )
    ],
  ),
)

12 votes

Les deux réponses suivantes donnent deux autres solutions et expliquent ce qui se passe.

2 votes

Avez-vous une suggestion pour utiliser la hauteur dynamique au lieu de fixer la hauteur de la liste ?

49voto

Hammad Tariq Points 644

J'ai SingleChildScrollView comme parent, et un Column Widget et ensuite List View Widget comme dernier enfant.

L'ajout de ces propriétés dans la vue en liste a fonctionné pour moi.

  physics: NeverScrollableScrollPhysics(),
  shrinkWrap: true,
  scrollDirection: Axis.vertical,

1 votes

scrollDirection: Axis.vertical est la valeur par défaut, ce qui ne fait pas partie de la solution. En outre, cela désactive le défilement de la liste.

48voto

jitesh mohite Points 3119

Expanded Widget augmente sa taille autant qu'il le peut avec l'espace disponible Puisque ListView a essentiellement une hauteur infinie, cela provoquera une erreur.

 Column(
  children: <Widget>[
    Flexible(
      child: ListView(...),
    )
  ],
)

Ici, nous devrions utiliser le Flexible car il n'occupera que l'espace dont il a besoin, alors que le mode étendu prend le plein écran, même s'il n'y a pas assez de widgets à rendre en plein écran.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X