| // 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/widgets.dart'; |
| |
| import 'button_theme.dart'; |
| import 'dialog.dart'; |
| import 'flat_button.dart'; |
| import 'raised_button.dart'; |
| |
| /// An end-aligned row of buttons. |
| /// |
| /// Places the buttons horizontally according to the padding in the current |
| /// [ButtonTheme]. The children are laid out in a [Row] with |
| /// [MainAxisAlignment.end]. When the [Directionality] is [TextDirection.ltr], |
| /// the button bar's children are right justified and the last child becomes |
| /// the rightmost child. When the [Directionality] [TextDirection.rtl] the |
| /// children are left justified and the last child becomes the leftmost child. |
| /// |
| /// Used by [Dialog] to arrange the actions at the bottom of the dialog. |
| /// |
| /// See also: |
| /// |
| /// * [RaisedButton], a kind of button. |
| /// * [FlatButton], another kind of button. |
| /// * [Card], at the bottom of which it is common to place a [ButtonBar]. |
| /// * [Dialog], which uses a [ButtonBar] for its actions. |
| /// * [ButtonTheme], which configures the [ButtonBar]. |
| class ButtonBar extends StatelessWidget { |
| /// Creates a button bar. |
| /// |
| /// The alignment argument defaults to [MainAxisAlignment.end]. |
| const ButtonBar({ |
| Key key, |
| this.alignment = MainAxisAlignment.end, |
| this.mainAxisSize = MainAxisSize.max, |
| this.children = const <Widget>[], |
| }) : super(key: key); |
| |
| /// How the children should be placed along the horizontal axis. |
| final MainAxisAlignment alignment; |
| |
| /// How much horizontal space is available. See [Row.mainAxisSize]. |
| final MainAxisSize mainAxisSize; |
| |
| /// The buttons to arrange horizontally. |
| /// |
| /// Typically [RaisedButton] or [FlatButton] widgets. |
| final List<Widget> children; |
| |
| @override |
| Widget build(BuildContext context) { |
| final ButtonThemeData buttonTheme = ButtonTheme.of(context); |
| // We divide by 4.0 because we want half of the average of the left and right padding. |
| final double paddingUnit = buttonTheme.padding.horizontal / 4.0; |
| final Widget child = Row( |
| mainAxisAlignment: alignment, |
| mainAxisSize: mainAxisSize, |
| children: children.map<Widget>((Widget child) { |
| return Padding( |
| padding: EdgeInsets.symmetric(horizontal: paddingUnit), |
| child: child |
| ); |
| }).toList() |
| ); |
| switch (buttonTheme.layoutBehavior) { |
| case ButtonBarLayoutBehavior.padded: |
| return Padding( |
| padding: EdgeInsets.symmetric( |
| vertical: 2.0 * paddingUnit, |
| horizontal: paddingUnit |
| ), |
| child: child, |
| ); |
| case ButtonBarLayoutBehavior.constrained: |
| return Container( |
| padding: EdgeInsets.symmetric(horizontal: paddingUnit), |
| constraints: const BoxConstraints(minHeight: 52.0), |
| alignment: Alignment.center, |
| child: child, |
| ); |
| } |
| assert(false); |
| return null; |
| } |
| } |