// Copyright 2014 The Flutter 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 'debug.dart'; import 'divider.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.io/design/components/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 EdgeInsetsGeometry padding; /// The margin around the drawer header. final EdgeInsetsGeometry? 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. /// /// {@macro flutter.widgets.child} 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 Container( height: statusBarHeight + _kDrawerHeaderHeight, margin: margin, decoration: BoxDecoration( border: Border( bottom: Divider.createBorderSide(context), ), ), child: AnimatedContainer( padding: padding.add(EdgeInsets.only(top: statusBarHeight)), decoration: decoration, duration: duration, curve: curve, child: child == null ? null : DefaultTextStyle( style: theme!.textTheme.bodyText1!, child: MediaQuery.removePadding( context: context, removeTop: true, child: child!, ), ), ), ); } }