blob: 21138acae4426336a4e6a91f158b24e78168f982 [file] [log] [blame]
// Copyright 2016 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 'colors.dart';
import 'theme.dart';
/// A header used in a material design [GridTile].
///
/// Typically used to add a one or two line header or footer on a [GridTile].
///
/// For a one-line header, include a [title] widget. To add a second line, also
/// include a [subtitle] widget. Use [leading] or [trailing] to add an icon.
///
/// See also:
///
/// * [GridTile]
/// * <https://material.google.com/components/grid-lists.html#grid-lists-specs>
class GridTileBar extends StatelessWidget {
/// Creates a grid tile bar.
///
/// Typically used to with [GridTile].
const GridTileBar({
Key key,
this.backgroundColor,
this.leading,
this.title,
this.subtitle,
this.trailing
}) : super(key: key);
/// The color to paint behind the child widgets.
///
/// Defaults to transparent.
final Color backgroundColor;
/// A widget to display before the title.
///
/// Typically an [Icon] or an [IconButton] widget.
final Widget leading;
/// The primary content of the list item.
///
/// Typically a [Text] widget.
final Widget title;
/// Additional content displayed below the title.
///
/// Typically a [Text] widget.
final Widget subtitle;
/// A widget to display after the title.
///
/// Typically an [Icon] or an [IconButton] widget.
final Widget trailing;
@override
Widget build(BuildContext context) {
BoxDecoration decoration;
if (backgroundColor != null)
decoration = new BoxDecoration(color: backgroundColor);
final List<Widget> children = <Widget>[];
final EdgeInsetsDirectional padding = new EdgeInsetsDirectional.only(
start: leading != null ? 8.0 : 16.0,
end: trailing != null ? 8.0 : 16.0,
);
if (leading != null)
children.add(new Padding(padding: const EdgeInsetsDirectional.only(end: 8.0), child: leading));
final ThemeData theme = Theme.of(context);
final ThemeData darkTheme = new ThemeData(
brightness: Brightness.dark,
accentColor: theme.accentColor,
accentColorBrightness: theme.accentColorBrightness
);
if (title != null && subtitle != null) {
children.add(
new Expanded(
child: new Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
new DefaultTextStyle(
style: darkTheme.textTheme.subhead,
softWrap: false,
overflow: TextOverflow.ellipsis,
child: title
),
new DefaultTextStyle(
style: darkTheme.textTheme.caption,
softWrap: false,
overflow: TextOverflow.ellipsis,
child: subtitle
)
]
)
)
);
} else if (title != null || subtitle != null) {
children.add(
new Expanded(
child: new DefaultTextStyle(
style: darkTheme.textTheme.subhead,
softWrap: false,
overflow: TextOverflow.ellipsis,
child: title ?? subtitle
)
)
);
}
if (trailing != null)
children.add(new Padding(padding: const EdgeInsetsDirectional.only(start: 8.0), child: trailing));
return new Container(
padding: padding,
decoration: decoration,
height: (title != null && subtitle != null) ? 68.0 : 48.0,
child: new Theme(
data: darkTheme,
child: IconTheme.merge(
data: const IconThemeData(color: Colors.white),
child: new Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: children
)
)
)
);
}
}