356 votes

La fenêtre verticale a reçu une hauteur non limitée.

Voici mon code :

  @override
  Widget build(BuildContext context) {
    return new Material(
      color: Colors.deepPurpleAccent,
      child: new Column(
       mainAxisAlignment: MainAxisAlignment.center,
          children:<Widget>[new GridView.count(crossAxisCount: _column,children: new List.generate(_row*_column, (index) {
            return new Center(
                child: new CellWidget()
            );
          }),)]
      )
    );
  }

Exception comme suit :

I/flutter ( 9925):  EXCEPTION CAUGHT BY RENDERING LIBRARY 
I/flutter ( 9925): The following assertion was thrown during performResize():
I/flutter ( 9925): Vertical viewport was given unbounded height.
I/flutter ( 9925): Viewports expand in the scrolling direction to fill their container.In this case, a vertical
I/flutter ( 9925): viewport was given an unlimited amount of vertical space in which to expand. This situation
I/flutter ( 9925): typically happens when a scrollable widget is nested inside another scrollable widget.
I/flutter ( 9925): If this widget is always nested in a scrollable widget there is no need to use a viewport because
I/flutter ( 9925): there will always be enough vertical space for the children. In this case, consider using a Column
I/flutter ( 9925): instead. Otherwise, consider using the "shrinkWrap" property (or a ShrinkWrappingViewport) to size
I/flutter ( 9925): the height of the viewport to the sum of the heights of its children.
I/flutter ( 9925): 
I/flutter ( 9925): When the exception was thrown, this was the stack:
I/flutter ( 9925): #0      RenderViewport.performResize.<anonymous closure> (package:flutter/src/rendering/viewport.dart:827:15)
I/flutter ( 9925): #1      RenderViewport.performResize (package:flutter/src/rendering/viewport.dart:880:6)
I/flutter ( 9925): #2      RenderObject.layout (package:flutter/src/rendering/object.dart:1555:9)

0 votes

Vous pouvez également utiliser un simple conteneur au lieu d'une colonne (principalement pour plus d'un widget enfant).

1 votes

Widget build(BuildContext context) { return new Material( color : Colors.deepPurpleAccent, child : new Container( alignment : Alignment.center, child : new GridView.count(crossAxisCount : _column,children : new List.generate(_row*_column, (index) { return new Center( child : new CellWidget() ) ; }) ), ) ) ; --Ce code n'aide pas non plus @Napolean

0 votes

Essayez d'ajouter mainAxisSize à max sous Column, et voyez si cela aide.

763voto

BloodLoss Points 542

Ajout de ces deux lignes

ListView.builder(
    scrollDirection: Axis.vertical,
    shrinkWrap: true,
...

47 votes

Merci, juste un petit conseil : vous pouvez entourer le ListView de Flexible pour le rendre défilable.

9 votes

Voici la documentation pour shrinkWrap api.flutter.dev/flutter/widgets/ScrollView/shrinkWrap.html

20 votes

Pour référence future, sachez que, selon la documentation, shrinkWrap étant défini à true peut être nettement plus coûteux s'il y a beaucoup de widgets dans la vue en liste. Veuillez consulter cet extrait de la documentation : Shrink wrapping the content of the scroll view is significantly more expensive than expanding to the maximum allowed size because the content can expand and contract during scrolling, which means the size of the scroll view needs to be recomputed whenever the scroll position changes.

315voto

CopsOnRoad Points 4705

Cela se produit généralement lorsque vous essayez d'utiliser un ListView / GridView à l'intérieur d'un Column Il existe de nombreuses façons de résoudre le problème, j'en énumère quelques-unes ici.

  1. Enveloppe ListView en Expanded

    Column(
      children: <Widget>[
        Expanded( // wrap in Expanded
          child: ListView(...),
        ),
      ],
    )
  2. Enveloppe ListView en SizedBox et donner un height

    Column(
      children: <Widget>[
        SizedBox(
          height: 400, // fixed height
          child: ListView(...),
        ),
      ],
    )
  3. Utilisez shrinkWrap: true en ListView .

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

11 votes

J'ai essayé de le faire avec un listview vertical contenant un listview horizontal. Seule la méthode sizedbox fonctionne, mais elle est trop contraignante pour la hauteur. Comment faire autrement ?

4 votes

shrinkWrap: true a fait le travail

1 votes

Voici la réponse.

57voto

Donc, tout le monde a posté des réponses mais personne ne s'est soucié d'expliquer pourquoi : Je vais copier la documentation sur shrinkWrap :

Indique si l'étendue de la vue défilante dans la [scrollDirection] doit être déterminée par le contenu affiché. déterminée par le contenu visualisé.

Si la vue défilante n'est pas rétractée, la vue défilante s'agrandit. à la taille maximale autorisée dans la [scrollDirection]. Si la vue défilante a des contraintes non limitées dans la [scrollDirection], [shrinkWrap] doit être vrai. être vrai.

Le rétrécissement du contenu de la vue en défilement est nettement plus beaucoup plus coûteuse que l'expansion à la taille maximale autorisée, car le contenu peut s'étendre et se contracter pendant le défilement, ce qui signifie que la taille de la de la vue défilante doit être recalculée chaque fois que la position de défilement change.

La valeur par défaut est false .

Donc, en prenant le vocabulaire des docs, ce qui se passe ici est que notre ListView est dans une situation de contraintes non limitées (dans la direction où l'on fait défiler les pages), donc l'élément ListView se plaindra que :

... une fenêtre verticale a reçu une quantité illimitée d'espace vertical dans lequel pour s'étendre.

En fixant simplement shrinkWrap a true s'assurera qu'il enveloppe sa taille définie par le contenu. Un exemple de code pour illustrer :

// ...
  ListView(
    // Says to the `ListView` that it must wrap its
    // height (if it's vertical) and width (if it's horizontal).
    shrinkWrap: true,
  ),
// ...

C'est ce qui se passe avec votre code, néanmoins, la suggestion de @Rémi est la meilleure pour ce cas, en utilisant Align au lieu d'un Column .

42voto

Manoj Kumar Points 181

Placer la vue de la grille dans le widget Flexible ou Expanded

return new Material(
    color: Colors.deepPurpleAccent,
    child: new Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children:<Widget>[
         Flexible(
          child:  GridView.count(crossAxisCount: _column,children: new List.generate(_row*_column, (index) {
          return new Center(
             child: new CellWidget(),
          );
        }),))]
    )
);

2 votes

Élargi et ajouté shrinkWrap: true à GridView.

12voto

Rémi Rousselet Points 45139

N'utilisez pas Column pour l'alignement d'un seul enfant. Utilisez Align à la place.

    new Align(
      alignment: Alignment.topCenter,
      child: new GridView(),
    )

0 votes

Cela a résolu mon erreur mais je ne suis toujours pas capable de centrer mon GridView verticalement. Il affiche la même chose qu'avant. J'ai essayé tous les drapeaux pour Alignment.* Qu'est-ce qui me manque ?

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