Flutter中Column的子代之间的空间


115

我有一个Column带有两个TextField小部件的小部件,希望它们之间有一定的空间。

我已经尝试过mainAxisAlignment: MainAxisAlignment.spaceAround,但是结果不是我想要的。


3
只需将SizedBox(height:15.0,),放在两个TextField之间
anmol.majhail 18-10-12

margin: EdgeInsets.only(left: 200.0, top: 300.0))
user7856586

Answers:


142

您可以Padding在这两个小部件之间使用小部件,也可以将这些小部件包装成小Padding部件。

更新资料

SizedBox窗口小部件可在两个窗口小部件之间使用,以在两个窗口小部件之间添加空间,它使代码比padding窗口小部件更具可读性。

例如:

Column(
  children: <Widget>[
    Widget1(),
    SizedBox(height: 10),
    Widget2(),
  ],
),

10
我当然希望column-class包含该属性。在所有孩子之间进行填充将浪费编码时间。
Haroun Hajem,

当填充小部件仅采用单个子参数时,如何在填充小部件中包装两个小部件?
ScottF

@ScottF回答说该Padding小部件位于2个小部件之间。不是这2个小部件成为的子级Padding
marcusljx

2
它直截了当地说“或用Padding小部件包装这些小部件” ...
ScottF

@ScottF使用两个小部件将子级作为子级或行作为子级。
莱利·菲茨帕特里克

143

您可以在小部件之间放置一个SizedBox特定height的名称,如下所示:

Column(
  children: <Widget>[
    FirstWidget(),
    SizedBox(height: 100),
    SecondWidget(),
  ],
),

为什么比包装小部件更喜欢Padding呢?可读性!视觉样板更少,缩进更少,并且代码遵循典型的阅读顺序。


添加大小框就像添加空视图,对吗?会不会导致任何问题?
user5381191

SizedBox只是一个普通的窗口小部件,其大小在布局期间会尝试达到所需大小,但不会呈现任何内容。所有的叶子小部件(如“文本”或“容器”)也是空的,因此可以。
马塞尔

52

您可以改用Wrap()小部件Column()在子小部件之间添加空间,并使用interval属性在子小部件之间提供相等的间距

Wrap(
  spacing: 20, // to apply margin in the main axis of the wrap
  runSpacing: 20, // to apply margin in the cross axis of the wrap
  children: <Widget>[
     Text('child 1'),
     Text('child 2')
  ]
)

1
使用runSpacing代替spacing垂直间隔的项目之间的间隙
Arpit

这对我有用。我认为这是最好的解决方案,但是使用Wrap()而不是Column()会带来什么破坏呢?
利马·查韦斯

1
Column是展开的窗口小部件,而Wrap不是。因此,当您想扩展父对象的整个空间时,应该使用扩展的小部件,例如“列”或“行”等。这取决于您的情况
Mahdi Tohidloo

是的,这比单独包装每个孩子要好得多。好建议。
kevinH

31

只需使用padding像这样包装它:

Column(
  children: <Widget>[
  Padding(
    padding: EdgeInsets.all(8.0),
    child: Text('Hello World!'),
  ),
  Padding(
    padding: EdgeInsets.all(8.0),
    child: Text('Hello World2!'),
  )
]);

您也可以使用Container(padding ...)或SizeBox(height:xx)。最后一个是最常见的,但是它会影响您如何管理小部件的空间,如果该空间确实是小部件的一部分,我喜欢使用填充,例如,将sizebox用于列表。


有没有办法做像CSS网格差距的事情?
Aseem '19

17

这样做的方法很多,这里列出了一些方法。

  1. 使用Container并给一些高度:

    Column(
      children: <Widget>[
        Widget1(),
        Container(height: 10), // set height
        Widget2(),
      ],
    )
    
  2. 采用 Spacer

    Column(
      children: <Widget>[
        Widget1(),
        Spacer(), // use Spacer
        Widget2(),
      ],
    )
    
  3. 采用 Expanded

    Column(
      children: <Widget>[
        Widget1(),
        Expanded(child: SizedBox()), // use Expanded
        Widget2(),
      ],
    )
    
  4. 采用 mainAxisAlignment

    Column(
      mainAxisAlignment: MainAxisAlignment.spaceAround, // mainAxisAlignment
      children: <Widget>[
        Widget1(),
        Widget2(),
      ],
    )
    
  5. 采用 Wrap

    Wrap(
      direction: Axis.vertical, // make sure to set this
      spacing: 20, // set your spacing
      children: <Widget>[
        Widget1(),
        Widget2(),
      ],
    )
    

8
Column(
  children: <Widget>[
    FirstWidget(),
    Spacer(),
    SecondWidget(),
  ]
)

垫片会创建一个可插入[Flexible]小部件的灵活空间。(像专栏一样)


5
请在回答中添加一些解释,以帮助其他人更好地理解它。仅代码答案被认为是不礼貌的,并且可能无法帮助OP理解您试图帮助的问题。
迈克尔

6

出于代码可读性的目的,上面使用了SizedBox的相同方法,您可以以相同的方式使用Padding小部件,而不必使其成为Column的任何子级的父级小部件。

Column(
  children: <Widget>[
    FirstWidget(),
    Padding(padding: EdgeInsets.only(top: 40.0)),
    SecondWidget(),
  ]
)

2

您可以通过其他方式解决此问题。

如果使用行/列,则必须使用mainAxisAlignment:MainAxisAlignment.spaceEvenly

如果您使用Wrap Widget,则必须使用runSpacing:5,间距:10,

在任何地方都可以使用SizeBox()


1

列默认情况下没有高度,您可以将列包装到容器中,然后将特定高度添加到容器中。然后,您可以使用如下所示的内容:

Container(
   width: double.infinity,//Your desire Width
   height: height,//Your desire Height
   child: Column(
      mainAxisAlignment: MainAxisAlignment.spaceBetween,
      children: <Widget>[
         Text('One'),
         Text('Two')
      ],
   ),
),

1

这里有很多答案,但是我将在这里列出每个人都应该使用的最重要的答案。

1.专栏

 Column(
          children: <Widget>[
            Text('Widget A'), //Can be any widget
            SizedBox(height: 20,), //height is space betweeen your top and bottom widget
            Text('Widget B'), //Can be any widget
          ],
        ),

2.包装

     Wrap(
          direction: Axis.vertical, // We have to declare Axis.vertical, otherwise by default widget are drawn in horizontal order
            spacing: 20, // Add spacing one time which is same for all other widgets in the children list
            children: <Widget>[
              Text('Widget A'), // Can be any widget
              Text('Widget B'), // Can be any widget
            ]
        )



0

您也可以使用辅助函数在每个孩子之后添加间距。

List<Widget> childrenWithSpacing({
  @required List<Widget> children,
  double spacing = 8,
}) {
  final space = Container(width: spacing, height: spacing);
  return children.expand((widget) => [widget, space]).toList();
}

因此,返回的列表可以用作列的子代

Column(
  children: childrenWithSpacing(
    spacing: 14,
    children: [
      Text('This becomes a text with an adjacent spacing'),
      if (true == true) Text('Also, makes it easy to add conditional widgets'),
    ],
  ),
);

我不确定是否要通过帮助程序为同一个目标运行子项是否有错或有性能损失?


-1

在手机处于横向模式的情况下,大小框将无济于事。

body: Column(
      mainAxisAlignment: MainAxisAlignment.spaceBetween,
      crossAxisAlignment: CrossAxisAlignment.stretch,
      children: <Widget>[
        Expanded(
           child: Container(
            margin: EdgeInsets.all(15.0),
            decoration: BoxDecoration(
              color: Color(0xFF1D1E33),
              borderRadius: BorderRadius.circular(10.0),
            ),
          ),
        ),
        Expanded(
           child: Container(
            margin: EdgeInsets.all(15.0),
            decoration: BoxDecoration(
              color: Color(0xFF1D1E33),
              borderRadius: BorderRadius.circular(10.0),
            ),
          ),
        ),
        Expanded(
           child: Container(
            margin: EdgeInsets.all(15.0),
            decoration: BoxDecoration(
              color: Color(0xFF1D1E33),
              borderRadius: BorderRadius.circular(10.0),
            ),
          ),
        ),
      ],
     )
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.