垂直ビューポートには無制限の高さが与えられました


131

これは私のコードです:

  @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()
            );
          }),)]
      )
    );
  }

次のような例外:

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)

列の代わりに単純なコンテナを使用することもできます(主に複数の子ウィジェット用)
Napolean 2018年

ウィジェット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、 (インデックス){return new Center(child:new CellWidget());}))、)); -このコードは@Napoleanにも役立ちません
pallavbohara18年

列の下のmaxにmainAxisSizeを追加してみて、それが役立つかどうかを確認してください。
pblead26 2018年

それが動作するかどうか、私はそれが行われるべきだと思うので、これを見て:stackoverflow.com/a/61708887/10563627
Paresh Mangukiya

回答:



164

これは通常、ListView/をGridView内部で使用しようとすると発生します。これColumnを解決する方法はたくさんあります。ここではいくつかリストします。

  1. ラップListViewインExpanded

    Column(
      children: <Widget>[
        Expanded( // wrap in Expanded
          child: ListView(...),
        ),
      ],
    )
    
  2. 包み込みListView、限界SizedBoxを与えるheight

    Column(
      children: <Widget>[
        SizedBox(
          height: 400, // fixed height
          child: ListView(...),
        ),
      ],
    )
    
  3. で使用shrinkWrap: trueListViewます。

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

5
水平リストビューを含む垂直リストビューでこれを試しました。サイズボックス方式のみが機能しますが、高さについてはあまりにも規範的です。これを行う他の方法は?
フラクタル

1
shrinkWrap: true仕事をしました
Ali 8020年

1
これが答えです。
vishalknishad

これが私が探していたものです。それぞれの選択肢の長所と短所を追加できる可能性はありますか?
emragins

これは私を大いに助けました。おかげで@CopsOnRoad
Kobbyディスカウント

33

したがって、誰もが回答を投稿しましたが、理由を説明する人は誰もいませんでしたshrinkWrap

[scrollDirection]のスクロールビューの範囲は、表示されているコンテンツによって決定される必要があるかどうか。

スクロールビューがシュリンクラップしない場合、スクロールビューは[scrollDirection]で許可されている最大サイズまで拡大します。スクロールビューの[scrollDirection]に無制限の制約がある場合、[shrinkWrap]はtrueである必要があります。

スクロールビューのコンテンツをシュリンクラップすると、スクロール中にコンテンツが拡大および縮小する可能性があるため、最大許容サイズに拡大するよりも大幅にコストがかかります。つまり、スクロール位置が変更されるたびにスクロールビューのサイズを再計算する必要があります。

デフォルトはfalse

したがって、ドキュメントの語彙をとると、ここで起こっていることListViewは、(スクロールしている方向に)無制限の制約の状況にあるということです。したがって、ListViewは次のように文句を言います。

...垂直ビューポートには、拡張するための無制限の垂直スペースが与えられました。

に設定shrinkWrapするだけでtrue、コンテンツで定義されたサイズを確実にラップします。説明するサンプルコード:

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

それがあなたのコードで起こっていることですが、それにもかかわらず、@Rémiの提案は、のAlign代わりにを使用して、この場合に最適ですColumn


27

グリッドビューをフレキシブルウィジェットまたは拡張ウィジェット内に配置する

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(),
          );
        }),))]
    )
);

1
展開しshrinkWrap: trueてGridViewに追加します。
ウィルマー

13

この状況は通常、スクロール可能なウィジェットが別のスクロール可能なウィジェット内にネストされている場合に発生します。

私の場合、Column内でGridViewを使用すると、そのエラーがスローされます。

GridViewウィジェットにはshrinkWrapプロパティ/名前付きパラメーターがあります。これを設定するtrueと問題が修正されます。

GridView.count(
  shrinkWrap: true,
  // rest of code
)

9

Column一人っ子の配置には使用しないでください。Align代わりに使用してください。

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

エラーは解決しましたが、それでもGridViewを垂直方向に中央揃えできません。以前と同じように表示されます。Alignmentのすべてのフラグを試しました。*何が欠けていますか?
pallavbohara18年

5

けれどもshrinkWrap事をしていますが、中にスクロールすることはできませんListView

スクロール機能が必要な場合は、physicsプロパティを追加できます。

ListView.builder(
    scrollDirection: Axis.vertical,
    shrinkWrap: true,
    physics: ScrollPhysics(),
...

4

この回答は、@ CopsOnRoadの北に基づいています

これは、ListView/GridViewウィジェットにそのサイズを取得する親がないために発生します。そのため、ウィジェットの高さは無限であり、フラッターはListViewの高さを認識せず、レンダリングできません。

  1. 解決策1:固定高さ

    Containerまたはで直接ラップしてSizedBox、デッドハイトを書き込みます。

    Column(
      children: <Widget>[
        SizedBox(
         height: 400, // fixed height
        child: ListView(...),
       ),
     ],
    )
    

これは問題ありませんが、高さを調整する必要がある場合は、それを記述しても機能しません。

  1. 解決策2:shrinkWrap:true

    試しshrinkWrap: truephysics: ScrollPhysics()スクロールするために

    shrinkWrap: trueアンドロイドのに少し似ていwrap_contentます。

    ListView.builder(
       scrollDirection: Axis.vertical,
       shrinkWrap: true,
       physics: ScrollPhysics()
    ...
    

ただし、コンパイル後、ページの下部に長い黄色の警告が表示されます。

だからまだできません

  1. 解決策3:拡張または柔軟

    Flexible フラッターの柔軟なレイアウトであり、AndroidのLinearLayoutと同等です。

    Flexibleには1つありflexます。layout_weightに等しい属性は、残りのすべてのスペースを占有します。

    したがって、ListViewをFlexibleでラップできます。

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

この回答ベース:垂直ビューポートには無制限の高さが与えられました。


それらはすべて、私のソリューションであるPareshですでにカバーされています。何か新しいものを追加していただければ幸いです。
CopsOnRoad

はい、私は知っていますが、私もあなたをクレジットとして言及する必要があると思いますが、その解決策を説明しようとしました
PareshMangukiya20年

1

これを2番目のリストビューでテストします

ListView.builder(
            physics: NeverScrollableScrollPhysics(),

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.