| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'package:flutter/foundation.dart'; |
| |
| import 'basic_types.dart'; |
| |
| /// The style of line to draw for a [BorderSide] in a [Border]. |
| enum BorderStyle { |
| /// Skip the border. |
| none, |
| |
| /// Draw the border as a solid line. |
| solid, |
| |
| // if you add more, think about how they will lerp |
| } |
| |
| /// A side of a border of a box. |
| /// |
| /// A [Border] consists of four [BorderSide] objects: [Border.top], |
| /// [Border.left], [Border.right], and [Border.bottom]. |
| /// |
| /// Note that setting [BorderSide.width] to 0.0 will result in hairline |
| /// rendering. A more involved explanation is present in [BorderSide.width]. |
| /// |
| /// {@tool sample} |
| /// |
| /// This sample shows how [BorderSide] objects can be used in a [Container], via |
| /// a [BoxDecoration] and a [Border], to decorate some [Text]. In this example, |
| /// the text has a thick bar above it that is light blue, and a thick bar below |
| /// it that is a darker shade of blue. |
| /// |
| /// ```dart |
| /// Container( |
| /// padding: EdgeInsets.all(8.0), |
| /// decoration: BoxDecoration( |
| /// border: Border( |
| /// top: BorderSide(width: 16.0, color: Colors.lightBlue.shade50), |
| /// bottom: BorderSide(width: 16.0, color: Colors.lightBlue.shade900), |
| /// ), |
| /// ), |
| /// child: Text('Flutter in the sky', textAlign: TextAlign.center), |
| /// ) |
| /// ``` |
| /// {@end-tool} |
| /// |
| /// See also: |
| /// |
| /// * [Border], which uses [BorderSide] objects to represent its sides. |
| /// * [BoxDecoration], which optionally takes a [Border] object. |
| /// * [TableBorder], which is similar to [Border] but has two more sides |
| /// ([TableBorder.horizontalInside] and [TableBorder.verticalInside]), both |
| /// of which are also [BorderSide] objects. |
| @immutable |
| class BorderSide { |
| /// Creates the side of a border. |
| /// |
| /// By default, the border is 1.0 logical pixels wide and solid black. |
| const BorderSide({ |
| this.color = const Color(0xFF000000), |
| this.width = 1.0, |
| this.style = BorderStyle.solid, |
| }) : assert(color != null), |
| assert(width != null), |
| assert(width >= 0.0), |
| assert(style != null); |
| |
| /// The color of this side of the border. |
| final Color color; |
| |
| /// The width of this side of the border, in logical pixels. |
| /// |
| /// Setting width to 0.0 will result in a hairline border. This means that |
| /// the border will have the width of one physical pixel. Also, hairline |
| /// rendering takes shortcuts when the path overlaps a pixel more than once. |
| /// This means that it will render faster than otherwise, but it might |
| /// double-hit pixels, giving it a slightly darker/lighter result. |
| /// |
| /// To omit the border entirely, set the [style] to [BorderStyle.none]. |
| final double width; |
| |
| /// The style of this side of the border. |
| /// |
| /// To omit a side, set [style] to [BorderStyle.none]. This skips |
| /// painting the border, but the border still has a [width]. |
| final BorderStyle style; |
| |
| /// A hairline black border that is not rendered. |
| static const BorderSide none = |
| BorderSide(width: 0.0, style: BorderStyle.none); |
| |
| /// Creates a copy of this border but with the given fields replaced with the new values. |
| BorderSide copyWith({ |
| Color color, |
| double width, |
| BorderStyle style, |
| }) { |
| assert(width == null || width >= 0.0); |
| return BorderSide( |
| color: color ?? this.color, |
| width: width ?? this.width, |
| style: style ?? this.style, |
| ); |
| } |
| } |
| |
| /// Base class for shape outlines. |
| /// |
| /// This class handles how to add multiple borders together. Subclasses define |
| /// various shapes, like circles ([CircleBorder]), rounded rectangles |
| /// ([RoundedRectangleBorder]), continuous rectangles |
| /// ([ContinuousRectangleBorder]), or beveled rectangles |
| /// ([BeveledRectangleBorder]). |
| /// |
| /// See also: |
| /// |
| /// * [ShapeDecoration], which can be used with [DecoratedBox] to show a shape. |
| /// * [Material] (and many other widgets in the Material library), which takes |
| /// a [ShapeBorder] to define its shape. |
| /// * [NotchedShape], which describes a shape with a hole in it. |
| @immutable |
| abstract class ShapeBorder { |
| /// Abstract const constructor. This constructor enables subclasses to provide |
| /// const constructors so that they can be used in const expressions. |
| const ShapeBorder(); |
| } |