VStack class

A widget that displays its children in a vertical array.

To cause a child to expand to fill the available vertical space, wrap the child in an Expanded widget.

The VStack widget does not scroll (and in general it is considered an error to have more children in a VStack than will fit in the available room). If you have a line of widgets and want them to be able to scroll if there is insufficient room, consider using a ListView.

For a horizontal variant, see HStack.

If you only have one child, then consider using Align or Center to position the child.

{@tool snippet}

This example uses a VStack to arrange three widgets vertically, the last being made to fill all the remaining space.

Using the Column in this way creates two short lines of text with a large Flutter underneath.


    Text('Deliver features faster'),
    Text('Craft beautiful UIs'),
      child: FittedBox(
        fit: BoxFit.contain, // otherwise the logo will be tiny
        child: const FlutterLogo(),

/// {@end-tool} {@tool snippet}

In the sample above, the text and the logo are centered on each line. In the following example, the crossAlignment is set to CrossAxisAlignment.start, so that the children are left-aligned. The axisSize is set to MainAxisSize.min, so that the column shrinks to fit the children.

    Text('We move under cover and we move as one'),
    Text('Through the night, we have one shot to live another day'),
    Text('We cannot let a stray gunshot give us away'),
    Text('We will fight up close, seize the moment and stay in it'),
    Text('It’s either that or meet the business end of a bayonet'),
    Text('The code word is ‘Rochambeau,’ dig me?'),
    Text('Rochambeau!', style: DefaultTextStyle.of(context).style.apply(fontSizeFactor: 2.0)),
  crossAlignment: CrossAxisAlignment.start,
  axisSize: MainAxisSize.min,


Available Extensions


VStack(List<Widget> children, {Key key, MainAxisAlignment alignment = MainAxisAlignment.start, CrossAxisAlignment crossAlignment = CrossAxisAlignment.start, MainAxisSize axisSize = MainAxisSize.min})


alignment MainAxisAlignment
How the children should be placed along the main axis. [...]
axisSize MainAxisSize
How much space should be occupied in the main axis. [...]
children List<Widget>
List of widgets in the stack.
crossAlignment CrossAxisAlignment
How the children should be placed along the cross axis. [...]
hashCode int
The hash code for this object. [...]
@nonVirtual, read-only, inherited
key Key
Controls how one widget replaces another widget in the tree. [...]
final, inherited
runtimeType Type
A representation of the runtime type of the object.
read-only, inherited


build(BuildContext context) Widget
Describes the part of the user interface represented by this widget. [...]
createElement() StatelessElement
Creates a StatelessElement to manage this widget's location in the tree. [...]
debugDescribeChildren() List<DiagnosticsNode>
Returns a list of DiagnosticsNode objects describing this node's children. [...]
@protected, inherited
debugFillProperties(DiagnosticPropertiesBuilder properties) → void
Add additional properties associated with the node. [...]
noSuchMethod(Invocation invocation) → dynamic
Invoked when a non-existent method or property is accessed. [...]
toDiagnosticsNode({String name, DiagnosticsTreeStyle style}) DiagnosticsNode
Returns a debug representation of the object that is used by debugging tools and by DiagnosticsNode.toStringDeep. [...]
toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) String
A string representation of this object. [...]
toStringDeep({String prefixLineOne = '', String prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) String
Returns a string representation of this node and its descendants. [...]
toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) String
Returns a one-line detailed description of the object. [...]
toStringShort() String
A short, textual description of this widget.


operator ==(Object other) bool
The equality operator. [...]
@nonVirtual, inherited