BoxDecoration

The BoxDecoration class is used to specify the styles applied on a box. For example, your box may have a background color, or a background gradient, or a background image. You can also apply border style, and controlling the roundness of the border.

The body of the box is painted in layers. The bottom-most layer is the color, which fills the box. Above that is the gradient, which also fills the box. Finally there is the image, the precise alignment of which is controlled by the DecorationImage class.

Here is an example of BoxDecoration is applied to Container widget -

Container(
  decoration: BoxDecoration(
    color: const Color(0xff7c94b6),
    image: const DecorationImage(
      image: NetworkImage('https:///flutter.github.io/assets-for-api-docs/assets/widgets/owl-2.jpg'),
      fit: BoxFit.cover,
    ),
    border: Border.all(
      color: Colors.black,
      width: 8,
    ),
    borderRadius: BorderRadius.circular(12),
  ),
)

Below are the arguments discussed in details.

Border

Let's learn how to create border in flutter. The border of a box is represented by Border class. The Border class consist of four object which is known as BorderSide. That means each of the four side of the border is represented by BorderSide class.

The BorderSide constructor takes the following arguments -

Here are some example -

BorderSide(width: 16.0, color: Colors.lightBlue.shade50)
BorderSide(width: 10.0, color: Colors.lightBlue.shade900)

// No border --
BorderSide(style: BorderStyle.none)

The Border constructor takes the following argument to constrol the border in all four sides -

All of the above four arguments takes BorderSide object to represent the border style. For example -

border: Border(
	top: BorderSide(width: 1.0, color: Color(0xFFFFDFDFDF)),
	left: BorderSide(width: 1.0, color: Color(0xFFFFDFDFDF)),
	right: BorderSide(width: 1.0, color: Color(0xFFFF7F7F7F)),
	bottom: BorderSide(width: 1.0, color: Color(0xFFFF7F7F7F)),
),

Border.all

The named constructor Border.all applies the style to all four sides -

Border.all(width: 2.0, color: const Color(0xFFFFFFFF))

Border.symmetric

The named constructor symmetric applies the style in horizontal and verital way.

Border.symmetric(horizontal: BorderSide(width: 2.0, color: const Color(0xFFFFFFFF)))
Border.symmetric(vertical: BorderSide(width: 2.0, color: const Color(0xFFFFFFFF)))
Border.symmetric(
	vertical: BorderSide(width: 2.0, color: const Color(0xFFFFFFFF)), 
	horizontal : BorderSide(width: 1.0, color : Colors.red[400]),
)

BorderSide.none

You can use constant none which is defined in BorderSide class to remove the border.

border: Border(
	top: BorderSide(width: 1.0, color: Color(0xFFFFDFDFDF)),
	left: BorderSide.none,
	right: BorderSide(width: 1.0, color: Color(0xFFFF7F7F7F)),
	bottom: BorderSide.none
),

borderRadius

The borderRadius argument controls the roundness of the border. It is represented by BorderRadius class. But first lets learn how a radius is represented in flutter. The radius is represented by the class Radius.

Radius

A radius can either be circular or elliptical. The constructor Radius.circular is used to for circular shapes and Radius.elliptical constructor is used for elliptical shapes. Here are the syntax -

Radius.circular(10.0)
Radius.elliptical(10.0, 15.5)

In Circular shapes the valule is same for x and y axis and in Elliptical shapes the first value is for x axis and second value is for y axis.

The Radius class defines a constant zero. This constant removes the radius. Here is an example -

Radius.zero

// Same as

Radius.circular(0.0)
Radius.elliptical(0.0, 0.0)

Now return to the BorderRadius class, the BorderRadius class consist of four Radius object represents the roundness of a rectangle.

BorderRadius.all

The named constructor all allows you to create border radius which takes a Radius object and is applied to all four corners.

BorderRadius.all(Radius.circular(30.0))

BorderRadius.circular

The named constructor circular allows you to create a circular radius. It takes a double value.

BorderRadius.circular(30.0)

// Same as

BorderRadius.all(Radius.circular(30.0))

BorderRadius.only

The named constructor only allows you to specify the radius for each corner seperately.

BorderRadius.only(
	topLeft : Radius.circular(10),
	topRight : Radius.zero,
	bottomLeft : Radius.zero,
	bottomRight : Radius.elliptical(10.0, 15.0)
)

shape

The shape to fill the background color, gradient, and image into and to cast as the boxShadow. That means the shape argument helps flutter to draw color, gradient or image properly according to the shape and it also helps to paint box shadow. It is recomend to use whenever possible. The value is defined in BoxShape class. This class defines two constant.

shape : BoxShape.circle,

If this is BoxShape.circle then borderRadius is ignored.

color

The argument color represents the background solid color to paint.

gradient

This argument is used to specify the gradient for the box. The details are discussed in Gradient chapter.

boxShadow

The argument boxShadow allows you to draw a shadow behind the box. This argument takes a list of shadows. Here is an example :

new Container(
    height: 200.0,
    decoration: new BoxDecoration(
        boxShadow: [
          BoxShadow(
            color: Colors.red,
            blurRadius: 25.0, // soften the shadow
            spreadRadius: 5.0, //extend the shadow
            offset: Offset(
              15.0, // Move to right 10  horizontally
              15.0, // Move to bottom 10 Vertically
            ),
          )
        ],
    );
    child: new Text("Hello world"),
);

In the above example, we have only one shadow applied on the Container widget. But you can use multiple shadows seperated by comma.

The class BoxShadow is used to define a shadow. Let's look at the constructor and its different argument.

The color arguments specifies the color of the shadow.

The offset argument specifies the offset of the shadow. The offset is the distance from the center. By default the shadow appears just right behind box so it is invisible by default. You move the shadow from little bit from its center to make part of it visible. In the above example, the shadow will move 15 pixel to the right in the x axis and 15 pixel at the bottom in the y axis.

offset: Offset(15.0, 15.0),

The argument blurRadius specifies how far the shadow will be blurred. Without blur you will notice a sharpe edge of the shadow, the blurRadius helps you to bring the smoothness of the edges.

The argument spreadRadius allows you to control how far the shadow will be spread to.

image

The argument image allows you to draw a background image in the box. It is paint above the color and gradient. Use DecorationImage to provide the image.

decoration: new BoxDecoration(
    image: DecorationImage(
      image: new AssetImage('assets/alucard.jpg'),
      fit: BoxFit.fill,
    ),
    borderRadius: BorderRadius.circular(80.0),
),

Lets look at different DecorationImage argument you can use to control the image:

The argument alignment controls the alignment of the image. or example, an Alignment alignment of (-1.0, -1.0) aligns the image to the top-left corner of its layout bounds, while a Alignment alignment of (1.0, 1.0) aligns the bottom right of the image with the bottom right corner of its layout bounds. Similarly, an alignment of (0.0, 1.0) aligns the bottom middle of the image with the middle of the bottom edge of its layout bounds. Defaults to Alignment.center.

The argument image allows you to specify the path of the image. If you are using a local image you can use AssetImage class to provide the image.

The argument fit is used to specify how the image should be inscribed into the box. Use BoxFit class to provide the values.

DecoratedBox

DecorationBox allows you to set decoration on the Box. In all the above example we are using Container widget to set the decoration. But Container widget is combination of multiple widget. When you are using the argument decoration on Container widget, the widget internally uses DecoratedBox and passes the value of the decoration argument to the DecorationBox widget.

A widget that paints a Decoration either before or after its child paints. Container insets its child by the widths of the borders; this widget does not.

DecoratedBox(
  decoration: BoxDecoration(
    gradient: RadialGradient(
      center: const Alignment(-0.5, -0.6),
      radius: 0.15,
      colors: <Color>[
        const Color(0xFFEEEEEE),
        const Color(0xFF111133),
      ],
      stops: <double>[0.9, 1.0],
    ),
  ),
)

DecorationPosition

This widget takes a position argument which is optional. It specifies whether to paint the box decoration behind or in front of the child. Use DecorationPosition enum to provide the value. It defines following two constants:

DecoratedBox(
  decoration: BoxDecoration(
    position: DecorationPosition.foreground,
    gradient: RadialGradient(
      center: const Alignment(-0.5, -0.6),
      radius: 0.15,
      colors: <Color>[
        const Color(0xFFEEEEEE),
        const Color(0xFF111133),
      ],
      stops: <double>[0.9, 1.0],
    ),
  ),
)