Unverified Commit 5a00d54e authored by Ayush Bherwani's avatar Ayush Bherwani Committed by GitHub

[AppBar] adds leadingWidth property to customize width of leading widget (#60915)

parent 93eac884
...@@ -208,6 +208,7 @@ class AppBar extends StatefulWidget implements PreferredSizeWidget { ...@@ -208,6 +208,7 @@ class AppBar extends StatefulWidget implements PreferredSizeWidget {
this.toolbarOpacity = 1.0, this.toolbarOpacity = 1.0,
this.bottomOpacity = 1.0, this.bottomOpacity = 1.0,
this.toolbarHeight, this.toolbarHeight,
this.leadingWidth,
}) : assert(automaticallyImplyLeading != null), }) : assert(automaticallyImplyLeading != null),
assert(elevation == null || elevation >= 0.0), assert(elevation == null || elevation >= 0.0),
assert(primary != null), assert(primary != null),
...@@ -223,7 +224,7 @@ class AppBar extends StatefulWidget implements PreferredSizeWidget { ...@@ -223,7 +224,7 @@ class AppBar extends StatefulWidget implements PreferredSizeWidget {
/// ///
/// Becomes the leading component of the [NavigationToolBar] built /// Becomes the leading component of the [NavigationToolBar] built
/// by this widget. The [leading] widget's width and height are constrained to /// by this widget. The [leading] widget's width and height are constrained to
/// be no bigger than [kToolbarHeight] and [toolbarHeight] respectively. /// be no bigger than [leadingWidth] and [toolbarHeight] respectively.
/// ///
/// If this is null and [automaticallyImplyLeading] is set to true, the /// If this is null and [automaticallyImplyLeading] is set to true, the
/// [AppBar] will imply an appropriate widget. For example, if the [AppBar] is /// [AppBar] will imply an appropriate widget. For example, if the [AppBar] is
...@@ -450,6 +451,11 @@ class AppBar extends StatefulWidget implements PreferredSizeWidget { ...@@ -450,6 +451,11 @@ class AppBar extends StatefulWidget implements PreferredSizeWidget {
/// By default, the value of `toolbarHeight` is [kToolbarHeight]. /// By default, the value of `toolbarHeight` is [kToolbarHeight].
final double toolbarHeight; final double toolbarHeight;
/// Defines the width of [leading] widget.
///
/// By default, the value of `leadingWidth` is 56.0.
final double leadingWidth;
bool _getEffectiveCenterTitle(ThemeData theme) { bool _getEffectiveCenterTitle(ThemeData theme) {
if (centerTitle != null) if (centerTitle != null)
return centerTitle; return centerTitle;
...@@ -543,7 +549,7 @@ class _AppBarState extends State<AppBar> { ...@@ -543,7 +549,7 @@ class _AppBarState extends State<AppBar> {
} }
if (leading != null) { if (leading != null) {
leading = ConstrainedBox( leading = ConstrainedBox(
constraints: const BoxConstraints.tightFor(width: _kLeadingWidth), constraints: BoxConstraints.tightFor(width: widget.leadingWidth ?? _kLeadingWidth),
child: leading, child: leading,
); );
} }
...@@ -803,6 +809,7 @@ class _SliverAppBarDelegate extends SliverPersistentHeaderDelegate { ...@@ -803,6 +809,7 @@ class _SliverAppBarDelegate extends SliverPersistentHeaderDelegate {
@required this.stretchConfiguration, @required this.stretchConfiguration,
@required this.shape, @required this.shape,
@required this.toolbarHeight, @required this.toolbarHeight,
@required this.leadingWidth,
}) : assert(primary || topPadding == 0.0), }) : assert(primary || topPadding == 0.0),
_bottomHeight = bottom?.preferredSize?.height ?? 0.0; _bottomHeight = bottom?.preferredSize?.height ?? 0.0;
...@@ -831,6 +838,7 @@ class _SliverAppBarDelegate extends SliverPersistentHeaderDelegate { ...@@ -831,6 +838,7 @@ class _SliverAppBarDelegate extends SliverPersistentHeaderDelegate {
final bool pinned; final bool pinned;
final ShapeBorder shape; final ShapeBorder shape;
final double toolbarHeight; final double toolbarHeight;
final double leadingWidth;
final double _bottomHeight; final double _bottomHeight;
...@@ -886,6 +894,7 @@ class _SliverAppBarDelegate extends SliverPersistentHeaderDelegate { ...@@ -886,6 +894,7 @@ class _SliverAppBarDelegate extends SliverPersistentHeaderDelegate {
toolbarOpacity: toolbarOpacity, toolbarOpacity: toolbarOpacity,
bottomOpacity: pinned ? 1.0 : ((visibleMainHeight / _bottomHeight).clamp(0.0, 1.0) as double), bottomOpacity: pinned ? 1.0 : ((visibleMainHeight / _bottomHeight).clamp(0.0, 1.0) as double),
toolbarHeight: toolbarHeight, toolbarHeight: toolbarHeight,
leadingWidth: leadingWidth,
), ),
); );
return floating ? _FloatingAppBar(child: appBar) : appBar; return floating ? _FloatingAppBar(child: appBar) : appBar;
...@@ -917,7 +926,8 @@ class _SliverAppBarDelegate extends SliverPersistentHeaderDelegate { ...@@ -917,7 +926,8 @@ class _SliverAppBarDelegate extends SliverPersistentHeaderDelegate {
|| snapConfiguration != oldDelegate.snapConfiguration || snapConfiguration != oldDelegate.snapConfiguration
|| stretchConfiguration != oldDelegate.stretchConfiguration || stretchConfiguration != oldDelegate.stretchConfiguration
|| forceElevated != oldDelegate.forceElevated || forceElevated != oldDelegate.forceElevated
|| toolbarHeight != oldDelegate.toolbarHeight; || toolbarHeight != oldDelegate.toolbarHeight
|| leadingWidth != leadingWidth;
} }
@override @override
...@@ -1039,6 +1049,7 @@ class SliverAppBar extends StatefulWidget { ...@@ -1039,6 +1049,7 @@ class SliverAppBar extends StatefulWidget {
this.onStretchTrigger, this.onStretchTrigger,
this.shape, this.shape,
this.toolbarHeight = kToolbarHeight, this.toolbarHeight = kToolbarHeight,
this.leadingWidth,
}) : assert(automaticallyImplyLeading != null), }) : assert(automaticallyImplyLeading != null),
assert(forceElevated != null), assert(forceElevated != null),
assert(primary != null), assert(primary != null),
...@@ -1337,6 +1348,11 @@ class SliverAppBar extends StatefulWidget { ...@@ -1337,6 +1348,11 @@ class SliverAppBar extends StatefulWidget {
/// By default, the value of `toolbarHeight` is [kToolbarHeight]. /// By default, the value of `toolbarHeight` is [kToolbarHeight].
final double toolbarHeight; final double toolbarHeight;
/// Defines the width of [leading] widget.
///
/// By default, the value of `leadingWidth` is 56.0.
final double leadingWidth;
@override @override
_SliverAppBarState createState() => _SliverAppBarState(); _SliverAppBarState createState() => _SliverAppBarState();
} }
...@@ -1429,6 +1445,7 @@ class _SliverAppBarState extends State<SliverAppBar> with TickerProviderStateMix ...@@ -1429,6 +1445,7 @@ class _SliverAppBarState extends State<SliverAppBar> with TickerProviderStateMix
snapConfiguration: _snapConfiguration, snapConfiguration: _snapConfiguration,
stretchConfiguration: _stretchConfiguration, stretchConfiguration: _stretchConfiguration,
toolbarHeight: widget.toolbarHeight, toolbarHeight: widget.toolbarHeight,
leadingWidth: widget.leadingWidth,
), ),
), ),
); );
......
...@@ -2045,4 +2045,38 @@ void main() { ...@@ -2045,4 +2045,38 @@ void main() {
expect(error.toString(), contains('is not true')); expect(error.toString(), contains('is not true'));
} }
}); });
testWidgets('AppBar respects leadingWidth', (WidgetTester tester) async {
const Key key = Key('leading');
await tester.pumpWidget(MaterialApp(
home: Scaffold(
appBar: AppBar(
leading: const Placeholder(key: key),
leadingWidth: 100,
title: const Text('Title'),
),
),
));
// By default toolbarHeight is 56.0.
expect(tester.getRect(find.byKey(key)), const Rect.fromLTRB(0, 0, 100, 56));
});
testWidgets('SliverAppBar respects leadingWidth', (WidgetTester tester) async {
const Key key = Key('leading');
await tester.pumpWidget( const MaterialApp(
home: CustomScrollView(
slivers: <Widget>[
SliverAppBar(
leading: Placeholder(key: key),
leadingWidth: 100,
title: Text('Title'),
),
],
)
));
// By default toolbarHeight is 56.0.
expect(tester.getRect(find.byKey(key)), const Rect.fromLTRB(0, 0, 100, 56));
});
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment