Flutter에서 열에 ListView를 추가하는 방법은 무엇입니까?


125

Flutter 앱을위한 간단한 로그인 페이지를 구성하려고합니다. TextFields 및 로그인 / 로그인 버튼을 성공적으로 구축했습니다. 수평 ListView를 추가하고 싶습니다. 코드를 실행하면 요소가 사라지고 ListView없이 수행하면 다시 괜찮습니다. 이 작업을 올바르게 수행하려면 어떻게해야합니까?

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),
          ),
        ),
      );

답변:


75

콘솔 출력을 확인할 수 있습니다. 오류를 인쇄합니다.

performResize () 동안 다음 어설 션이 발생했습니다. 수평 뷰포트에 무제한 높이가 제공되었습니다. 뷰포트는 교차 축에서 확장되어 컨테이너를 채우고 교차 축의 범위와 일치하도록 자식을 제한합니다. 이 경우 수평 뷰포트에는 확장 할 수있는 무제한의 수직 공간이 주어졌습니다.

가로 목록에 높이 제한을 추가해야합니다. 예 : 높이가있는 컨테이너 포장 :

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"),
      )
    ],
  ),
)

6
다음 두 답변은 또 다른 두 가지 해결책을 제공하고 무슨 일이 일어나고 있는지 설명합니다.
pashute

299

나도이 문제가 있습니다. 내 솔루션은 Expanded위젯을 사용 하여 남은 공간을 확장하는 것입니다.

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

2
남은 공간을 차지하기를 원할 때와 같이 ListView의 다양한 크기의 높이 / 너비를 허용하므로 훌륭한 솔루션입니다. 정확한 높이 / 너비를 알기가 너무 어려울 때 다양한 화면 크기를 고려할 수 있습니다.
Daniel Allen 19

1
이것은 받아 들여진 대답이어야합니다. 이 솔루션을 사용하면 ListView가 미디어 쿼리를 처리하지 않고도 화면의 나머지 부분을 차지할 수 있습니다.
Terence Ponce 19

왜 이것이 작동하는지 알기에는 Flutter를 처음 접했지만 그렇게되어 기쁩니다. 감사합니다. Flutter의 오류 메시지는 비전문가에게이 문제의 근본 원인을 설명하는 데 그다지 도움이되지 않았습니다.
devdanke

감사합니다. 귀하의 답변으로 시간이 절약됩니다.
Licat Julius

126

오류 이유 :

Column주축 방향 (세로 축)에서 최대 크기로 확장되며 ListView.

솔루션

따라서 ListView. 이를 수행하는 방법에는 여러 가지가 있으며 필요에 가장 적합한 것을 선택할 수 있습니다.


  1. 당신은 허용 할 경우 ListView남아있는 모든 공간 내부를 차지하기 위해 Column사용 Expanded.

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

  1. ListView특정 으로 제한 height하려면을 사용할 수 있습니다 SizedBox.

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

  1. 당신 ListView이 작은 경우 , 당신은 shrinkWrap그것에 재산을 시도 할 수 있습니다 .

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

내 높이가 고정되어서는 안하고 다른 답변 나를 위해 = / 작동하지 않았다
다니엘 Vilela

1
@DanielVilela 옵션 1이 작동합니다. 그렇지 않은 경우 질문으로 게시하고 가능한 경우 답변 할 수 있습니다.
CopsOnRoad

1
나는 그것을 작동시켰다! 감사. 나는 몇몇 전략적 장소에 Expanded ()를 넣어야했다.
Daniel Vilela

고마워, 나는 확장에 대해 생각하지 않았다.
Gilvan André 19

shrinkWrap에 감사드립니다 : ListView ()의 true
Rana Hyder

18

나는 SingleChildScrollView부모로 하나의 Column위젯과 마지막 자식으로 목록보기 위젯을 가지고 있습니다.

목록보기에서 이러한 속성을 추가하는 것은 나를 위해 일했습니다.

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

14

확장 된 위젯은 사용 가능한 공간으로 가능한 한 크기를 늘립니다. ListView는 본질적으로 높이가 무한하기 때문에 오류가 발생합니다.

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

전체 화면으로 렌더링 할 수있는 위젯이 충분하지 않더라도 Expanded가 전체 화면을 차지하므로 필요한 공간 만 차지하므로 여기서는 Flexible 위젯을 사용해야합니다.


10

실제로 문서를 읽을 때 ListView가 확장 된 위젯 안에 있어야 작동 할 수 있습니다.

  Widget build(BuildContext context) {
return Scaffold(
    body: Column(
  children: <Widget>[
    Align(
      child: PayableWidget(),
    ),
    Expanded(
      child: _myListView(context),
    )
  ],
));

}


7

위에서 다른 사람들이 언급했듯이 확장 된 랩 목록보기가 해결책입니다.

그러나 중첩 된 열을 다룰 때는 ListView를 특정 높이로 제한해야합니다 (이 문제에 많이 직면했습니다).

다른 해결책이 있으면 의견에 언급하거나 답변을 추가하십시오.

  SingleChildScrollView(
   child: Column(
     children: <Widget>[
       Image(image: ),//<< any widgets added
       SizedBox(),
       Column(
         children: <Widget>[
           Text('header'),  //<< any widgets added
            Expanded(child: 
            ListView.builder(
              //here your code
               scrollDirection: Axis.horizontal,
        itemCount: items.length,
        itemBuilder: (BuildContext context, int index) {
            return Container();
                   } 
         )
        ),
        Divider(),//<< any widgets added
         ],
       ),

     ],
   ), 
  );

중첩 된 열에서 확장을 사용하지 말고 shrikWrap : true, physics : NeverScrolPhysics () 속성을 listView에서 사용하세요
Mohamed Kamel

5

FlexFlexible위젯을 사용할 수 있습니다 . 예를 들면 :

Flex(
direction: Axis.vertical,
children: <Widget>[
    ... other widgets ...
    Flexible(
        flex: 1,
        child: ListView.builder(
        itemCount: ...,
        itemBuilder: (context, index) {
            ...
        },
        ),
    ),
],

);


0
return new MaterialApp(
    home: new Scaffold(
      appBar: new AppBar(
        title: new Text("Login / Signup"),
      ),
      body: new Container(
        child: new Center(
          child: ListView(
          //mainAxisAlignment: MainAxisAlignment.center,
          scrollDirection: Axis.vertical,
            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),
      ),
    ),
  );

-1

Slivers를 사용해보십시오.

Container(
    child: CustomScrollView(
      slivers: <Widget>[
        SliverList(
          delegate: SliverChildListDelegate(
            [
              HeaderWidget("Header 1"),
              HeaderWidget("Header 2"),
              HeaderWidget("Header 3"),
              HeaderWidget("Header 4"),
            ],
          ),
        ),
        SliverList(
          delegate: SliverChildListDelegate(
            [
              BodyWidget(Colors.blue),
              BodyWidget(Colors.red),
              BodyWidget(Colors.green),
              BodyWidget(Colors.orange),
              BodyWidget(Colors.blue),
              BodyWidget(Colors.red),
            ],
          ),
        ),
        SliverGrid(
          gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2),
          delegate: SliverChildListDelegate(
            [
              BodyWidget(Colors.blue),
              BodyWidget(Colors.green),
              BodyWidget(Colors.yellow),
              BodyWidget(Colors.orange),
              BodyWidget(Colors.blue),
              BodyWidget(Colors.red),
            ],
          ),
        ),
      ],
    ),
  ),
)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.