我试图为我的扑动应用程序构建一个简单的登录页面。我已经成功构建了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),
          ),
        ),
      );

当前回答

您可以检查控制台输出。打印错误:

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

其他回答

您可以检查控制台输出。打印错误:

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

我也有这个问题。我的解决方案是使用扩展小部件来扩大剩余空间。

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

正如上面其他人所提到的,带扩展的Wrap listview是解决方案。

但是当你处理嵌套列时,你还需要将你的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
         ],
       ),

     ],
   ), 
  );

用扩展小部件包装你的列表视图

错误原因:

列在主轴方向(纵轴)扩展到最大,ListView也是如此。

解决方案:

你需要限制ListView的高度。有很多方法可以做到这一点,你可以选择最适合你的需要。


如果你想让ListView占用Column内的所有剩余空间,请使用Expanded。 列( 孩子们:<部件> ( Expanded(// <——使用Expanded 孩子:列表视图(…), ) ), )


如果你想限制你的ListView到一定的高度,使用sizebox。 列( 孩子们:<部件> ( SizedBox ( height: 200, //约束高度。 孩子:列表视图(…), ) ), )


如果你的ListView很小,你可以尝试使用shrinkWrap属性。 列( 孩子们:<部件> ( 列表视图( shrinkWrap: true, //设置 ) ), )


如果你想让ListView尽可能小,使用Flexible with ListView. shrinkwrap: 列( 孩子们:<部件> ( Flexible(// <——使用Flexible 孩子:列表视图( shrinkWrap: true, //设置这个 ), ) ), )