Commit 28b58db1 authored by Tiziano Munegato's avatar Tiziano Munegato Committed by Shi-Hao Hong

Add `shape` property to SliverAppBar (#31662)

parent 017997b9
......@@ -681,6 +681,7 @@ class _SliverAppBarDelegate extends SliverPersistentHeaderDelegate {
@required this.floating,
@required this.pinned,
@required this.snapConfiguration,
@required this.shape,
}) : assert(primary || topPadding == 0.0),
_bottomHeight = bottom?.preferredSize?.height ?? 0.0;
......@@ -705,6 +706,7 @@ class _SliverAppBarDelegate extends SliverPersistentHeaderDelegate {
final double topPadding;
final bool floating;
final bool pinned;
final ShapeBorder shape;
final double _bottomHeight;
......@@ -759,6 +761,7 @@ class _SliverAppBarDelegate extends SliverPersistentHeaderDelegate {
primary: primary,
centerTitle: centerTitle,
titleSpacing: titleSpacing,
shape: shape,
toolbarOpacity: toolbarOpacity,
bottomOpacity: pinned ? 1.0 : (visibleMainHeight / _bottomHeight).clamp(0.0, 1.0),
),
......@@ -902,6 +905,7 @@ class SliverAppBar extends StatefulWidget {
this.floating = false,
this.pinned = false,
this.snap = false,
this.shape,
}) : assert(automaticallyImplyLeading != null),
assert(forceElevated != null),
assert(primary != null),
......@@ -1062,6 +1066,12 @@ class SliverAppBar extends StatefulWidget {
/// Defaults to [NavigationToolbar.kMiddleSpacing].
final double titleSpacing;
/// The material's shape as well its shadow.
///
/// A shadow is only displayed if the [elevation] is greater than
/// zero.
final ShapeBorder shape;
/// The size of the app bar when it is fully expanded.
///
/// By default, the total height of the toolbar and the bottom widget (if
......@@ -1215,6 +1225,7 @@ class _SliverAppBarState extends State<SliverAppBar> with TickerProviderStateMix
topPadding: topPadding,
floating: widget.floating,
pinned: widget.pinned,
shape: widget.shape,
snapConfiguration: _snapConfiguration,
),
),
......
......@@ -1514,4 +1514,39 @@ void main() {
expect(getMaterialWidget().shape, roundedRectangleBorder);
});
testWidgets('SliverAppBar with shape', (WidgetTester tester) async {
const RoundedRectangleBorder roundedRectangleBorder = RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(15.0)),
);
await tester.pumpWidget(
MaterialApp(
home: CustomScrollView(
slivers: const <Widget>[
SliverAppBar(
leading: Text('L'),
title: Text('No Scaffold'),
shape: roundedRectangleBorder,
actions: <Widget>[Text('A1'), Text('A2')],
),
],
),
),
);
final Finder sliverAppBarFinder = find.byType(SliverAppBar);
SliverAppBar getAppBarWidget() {
return tester.widget<SliverAppBar>(sliverAppBarFinder);
}
expect(getAppBarWidget().shape, roundedRectangleBorder);
final Finder materialFinder = find.byType(Material);
Material getMaterialWidget() {
return tester.widget<Material>(materialFinder);
}
expect(getMaterialWidget().shape, roundedRectangleBorder);
});
}
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