From 01b7ada7c19bddf5e75a13b866424871e6787e20 Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Mon, 22 Feb 2021 16:56:03 -0800 Subject: [PATCH] SliverAppBar Default Elevation Patch (#73526) --- .../flutter/lib/src/material/app_bar.dart | 2 +- .../flutter/test/material/app_bar_test.dart | 67 ++++++++++++++++--- 2 files changed, 59 insertions(+), 10 deletions(-) diff --git a/packages/flutter/lib/src/material/app_bar.dart b/packages/flutter/lib/src/material/app_bar.dart index 765f7d2a65..681f1180f9 100644 --- a/packages/flutter/lib/src/material/app_bar.dart +++ b/packages/flutter/lib/src/material/app_bar.dart @@ -1154,7 +1154,7 @@ class _SliverAppBarDelegate extends SliverPersistentHeaderDelegate { ? Semantics(child: flexibleSpace, header: true) : flexibleSpace, bottom: bottom, - elevation: forceElevated || overlapsContent || (pinned && shrinkOffset > maxExtent - minExtent) ? elevation ?? 4.0 : 0.0, + elevation: forceElevated || overlapsContent || (pinned && shrinkOffset > maxExtent - minExtent) ? elevation : 0.0, shadowColor: shadowColor, backgroundColor: backgroundColor, foregroundColor: foregroundColor, diff --git a/packages/flutter/test/material/app_bar_test.dart b/packages/flutter/test/material/app_bar_test.dart index c95309bb17..2d5e5a66f9 100644 --- a/packages/flutter/test/material/app_bar_test.dart +++ b/packages/flutter/test/material/app_bar_test.dart @@ -903,30 +903,79 @@ void main() { expect(tabBarHeight(tester), initialTabBarHeight); }); - testWidgets('SliverAppBar rebuilds when forceElevated changes', (WidgetTester tester) async { - // Regression test for https://github.com/flutter/flutter/issues/59158. - Widget buildSliverAppBar(bool forceElevated) { + testWidgets('AppBar uses the specified elevation or defaults to 4.0', (WidgetTester tester) async { + Widget buildAppBar([double? elevation]) { return MaterialApp( + home: Scaffold( + appBar: AppBar(title: const Text('Title'), elevation: elevation), + ), + ); + } + + Material getMaterial() => tester.widget(find.descendant( + of: find.byType(AppBar), + matching: find.byType(Material), + )); + + // Default elevation should be _AppBarState._defaultElevation = 4.0 + await tester.pumpWidget(buildAppBar()); + expect(getMaterial().elevation, 4.0); + + // AppBar should use the specified elevation. + await tester.pumpWidget(buildAppBar(8.0)); + expect(getMaterial().elevation, 8.0); + }); + + group('SliverAppBar elevation', () { + Widget buildSliverAppBar(bool forceElevated, {double? elevation, double? themeElevation}) { + return MaterialApp( + theme: ThemeData(appBarTheme: AppBarTheme(elevation: themeElevation)), home: CustomScrollView( slivers: [ SliverAppBar( backwardsCompatibility: false, title: const Text('Title'), forceElevated: forceElevated, + elevation: elevation, ), ], ), ); } - final Finder appBarFinder = find.byType(AppBar); - AppBar getAppBarWidget(Finder finder) => tester.widget(finder); + testWidgets('Respects forceElevated parameter', (WidgetTester tester) async { + // Regression test for https://github.com/flutter/flutter/issues/59158. + AppBar getAppBar() => tester.widget(find.byType(AppBar)); + Material getMaterial() => tester.widget(find.byType(Material)); - await tester.pumpWidget(buildSliverAppBar(false)); - expect(getAppBarWidget(appBarFinder).elevation, 0.0); + // When forceElevated is off, SliverAppBar should not be elevated. + await tester.pumpWidget(buildSliverAppBar(false)); + expect(getMaterial().elevation, 0.0); - await tester.pumpWidget(buildSliverAppBar(true)); - expect(getAppBarWidget(appBarFinder).elevation, 4.0); + // Default elevation should be _AppBarState._defaultElevation = 4.0, and + // the AppBar's elevation should not be specified by SliverAppBar. + await tester.pumpWidget(buildSliverAppBar(true)); + expect(getMaterial().elevation, 4.0); + expect(getAppBar().elevation, null); + + // SliverAppBar should use the specified elevation. + await tester.pumpWidget(buildSliverAppBar(true, elevation: 8.0)); + expect(getMaterial().elevation, 8.0); + }); + + testWidgets('Uses elevation of AppBarTheme by default', (WidgetTester tester) async { + // Regression test for https://github.com/flutter/flutter/issues/73525. + Material getMaterial() => tester.widget(find.byType(Material)); + + await tester.pumpWidget(buildSliverAppBar(false, themeElevation: 12.0)); + expect(getMaterial().elevation, 0.0); + + await tester.pumpWidget(buildSliverAppBar(true, themeElevation: 12.0)); + expect(getMaterial().elevation, 12.0); + + await tester.pumpWidget(buildSliverAppBar(true, elevation: 8.0, themeElevation: 12.0)); + expect(getMaterial().elevation, 8.0); + }); }); testWidgets('AppBar dimensions, with and without bottom, primary', (WidgetTester tester) async {