The Row widget is a commonly used layout pattern in Flutter applications. It is a multi-child widget that displays its children in a horizontal array. Its main-axis alignment is horizontal, as shown in the image below.
The Row
widget provides a constructor with various parameters to customize its behavior and layout.
Row({
Key? key,
MainAxisAlignment mainAxisAlignment = MainAxisAlignment.start,
MainAxisSize mainAxisSize = MainAxisSize.max,
CrossAxisAlignment crossAxisAlignment = CrossAxisAlignment.center,
TextDirection? textDirection,
VerticalDirection verticalDirection = VerticalDirection.down,
TextBaseline? textBaseline,
List<Widget> children = const <Widget>[]
})
Let's take a closer look at each parameter and its purpose.
key
: An optional parameter that allows us to provide a unique identifier for the Row
widget.
mainAxisAlignment
: Determines how its children are aligned horizontally within the available space. The default value is MainAxisAlignment.start
. Other possible values include MainAxisAlignment.center
, MainAxisAlignment.end
, and MainAxisAlignment.spaceEvenly
, among others.
mainAxisSize
: Specifies the horizontal size of the Row
. The default value is MainAxisSize.max
, which allows the Row
to occupy all available horizontal space. Alternatively, we can set it MainAxisSize.min
to make the Row
take up only the required horizontal space.
crossAxisAlignment
: Determines how the children are aligned vertically. The default value is CrossAxisAlignment.center
. Other options include CrossAxisAlignment.start
and CrossAxisAlignment.end
, among others.
textDirection
: An optional parameter that specifies the directionality of the text within the Row
.
verticalDirection
: Specifies the order in which the children of the Column are laid out vertically. The default value is VerticalDirection.down
, which arranges the children from top to bottom. We can also use VerticalDirection.up
to reverse the order.
textBaseline
: An optional parameter determining the text's baseline alignment within the Row
. By default, it uses the TextBaseline.alphabetic
.
children
: The list of child widgets is stacked horizontally in the Row
. We can provide any number of widgets as children. The default value is an empty list ([])
.
We can follow the instructions given below to add a Row
widget in UI:
To use the Row
widget, we need to import the flutter/material.dart
package in your Dart file.
import 'package:flutter/material.dart';
To create a Row
widget, we can use the Row
constructor and provide the desired children widgets as a list.
Row(
children: <Widget>[
// Add your children widgets here
],
)
We can add multiple widgets we want to stack horizontally inside the children's property of the Row
widget. These children can be any Flutter widgets, such as Text
, Image
, Container
, etc.
Row(
children: <Widget>[
Text('Widget 1'),
Text('Widget 2'),
Text('Widget 3'),
],
)
To customize the layout of the Row
widget, we can utilize properties such as mainAxisAlignment
, crossAxisAlignment
, and mainAxisSize
, etc.
Row(mainAxisAlignment: MainAxisAlignment.center,crossAxisAlignment: CrossAxisAlignment.start,mainAxisSize: MainAxisSize.min,children: <Widget>[Text('Widget 1'),Text('Widget 2'),Text('Widget 3'),],)
Line 2: We set Column
property mainAxisAlignment
to MainAxisAlignment.center
, which means the children will be positioned in the middle of the available horizontal space.
Line 3: We set Column
property crossAxisAlignment
to CrossAxisAlignment.start
, which ensures the children are positioned on the left side of each row box.
Line 4: We set Column
property mainAxisSize
to MainAxisSize.min
, which specifies that the Column
should take up only the required vertical space.
We get the following output by putting together the code explained above.
import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Row Widget Example'), ), body: Center( child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: <Widget>[ Container( color: Colors.red, height: 100, width: 100, child: Center(child: Text('Widget 1', style: TextStyle(color: Colors.white))), ), Container( color: Colors.green, height: 100, width: 100, child: Center(child: Text('Widget 2', style: TextStyle(color: Colors.white))), ), Container( color: Colors.blue, height: 100, width: 100, child: Center(child: Text('Widget 3', style: TextStyle(color: Colors.white))), ), ], ), ), ), ); } }
It is important to remember that one limitation of the Row
widget is that it doesn't support horizontal scrolling. As a result, an overflow alert will be shown if the combined height of the children is more than the size of the screen. It can be solved by wrapping the Row
widget with SingleChildScrollView
and then setting its property scrollDirection
to Axis.horizontal
as shown below.
SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: Row(
children: [
// Add your child widgets here
],
),
)
The Row
widget in Flutter offers an easier way to arrange multiple children in a vertical layout. We can customize the Column widget using optional named arguments such as child alignment, main axis size, padding, color, and render direction.
You can learn about other Flutter widgets from the following resources: