// 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 'package:flutter/widgets.dart'; import 'debug.dart'; import 'theme.dart'; const double _kDrawerHeaderHeight = 160.0 + 1.0; // bottom edge /// The top-most region of a material design drawer. The header's [child] /// widget, if any, is placed inside a [Container] whose [decoration] can be /// passed as an argument, inset by the given [padding]. /// /// Part of the material design [Drawer]. /// /// Requires one of its ancestors to be a [Material] widget. This condition is /// satisfied by putting the [DrawerHeader] in a [Drawer]. /// /// See also: /// /// * [UserAccountsDrawerHeader], a variant of [DrawerHeader] that is /// specialized for showing user accounts. /// * <https://material.google.com/patterns/navigation-drawer.html> class DrawerHeader extends StatelessWidget { /// Creates a material design drawer header. /// /// Requires one of its ancestors to be a [Material] widget. const DrawerHeader({ Key key, this.decoration, this.margin: const EdgeInsets.only(bottom: 8.0), this.padding: const EdgeInsets.fromLTRB(16.0, 16.0, 16.0, 8.0), this.duration: const Duration(milliseconds: 250), this.curve: Curves.fastOutSlowIn, @required this.child, }) : super(key: key); /// Decoration for the main drawer header [Container]; useful for applying /// backgrounds. /// /// This decoration will extend under the system status bar. /// /// If this is changed, it will be animated according to [duration] and [curve]. final Decoration decoration; /// The padding by which to inset [child]. /// /// The [DrawerHeader] additionally offsets the child by the height of the /// system status bar. /// /// If the child is null, the padding has no effect. final EdgeInsets padding; /// The margin around the drawer header. final EdgeInsets margin; /// The duration for animations of the [decoration]. final Duration duration; /// The curve for animations of the [decoration]. final Curve curve; /// A widget to be placed inside the drawer header, inset by the [padding]. /// /// This widget will be sized to the size of the header. To position the child /// precisely, consider using an [Align] or [Center] widget. final Widget child; @override Widget build(BuildContext context) { assert(debugCheckHasMaterial(context)); assert(debugCheckHasMediaQuery(context)); final ThemeData theme = Theme.of(context); final double statusBarHeight = MediaQuery.of(context).padding.top; return new Container( height: statusBarHeight + _kDrawerHeaderHeight, margin: margin, decoration: new BoxDecoration( border: new Border( bottom: new BorderSide( color: theme.dividerColor, width: 0.0 ) ) ), child: new AnimatedContainer( padding: padding + new EdgeInsets.only(top: statusBarHeight), decoration: decoration, duration: duration, curve: curve, child: child == null ? null : new DefaultTextStyle( style: theme.textTheme.body2, child: child ) ) ); } }