mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
136 lines
3.8 KiB
Dart
136 lines
3.8 KiB
Dart
// 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
|
|
)
|
|
)
|
|
)
|
|
);
|
|
}
|
|
}
|