From 4230e9674cde1e1b55755ea9a9193251c72dfee7 Mon Sep 17 00:00:00 2001 From: Hans Muller Date: Thu, 2 May 2019 11:57:01 -0700 Subject: [PATCH] Simplify drawer scrimColor defaults, update tests (#31947) --- packages/flutter/lib/src/material/drawer.dart | 23 ++++-- .../flutter/lib/src/material/scaffold.dart | 2 +- .../flutter/test/material/drawer_test.dart | 80 ++++++++++++++----- 3 files changed, 78 insertions(+), 27 deletions(-) diff --git a/packages/flutter/lib/src/material/drawer.dart b/packages/flutter/lib/src/material/drawer.dart index d64dc17a0f..164554dea7 100644 --- a/packages/flutter/lib/src/material/drawer.dart +++ b/packages/flutter/lib/src/material/drawer.dart @@ -181,7 +181,7 @@ class DrawerController extends StatefulWidget { @required this.alignment, this.drawerCallback, this.dragStartBehavior = DragStartBehavior.start, - this.scrimColor = Colors.black54, + this.scrimColor, }) : assert(child != null), assert(dragStartBehavior != null), assert(alignment != null), @@ -223,7 +223,7 @@ class DrawerController extends StatefulWidget { /// The color to use for the scrim that obscures primary content while a drawer is open. /// - /// By default, the color is [Colors.black54] + /// By default, the color used is [Colors.black54] final Color scrimColor; @override @@ -237,7 +237,7 @@ class DrawerControllerState extends State with SingleTickerPro @override void initState() { super.initState(); - _color = ColorTween(begin: Colors.transparent, end: widget.scrimColor); + _scrimColorTween = _buildScrimColorTween(); _controller = AnimationController(duration: _kBaseSettleDuration, vsync: this) ..addListener(_animationChanged) ..addStatusListener(_animationStatusChanged); @@ -250,6 +250,13 @@ class DrawerControllerState extends State with SingleTickerPro super.dispose(); } + @override + void didUpdateWidget(DrawerController oldWidget) { + super.didUpdateWidget(oldWidget); + if (widget.scrimColor != oldWidget.scrimColor) + _scrimColorTween = _buildScrimColorTween(); + } + void _animationChanged() { setState(() { // The animation controller's state is our build state, and it changed already. @@ -386,9 +393,13 @@ class DrawerControllerState extends State with SingleTickerPro widget.drawerCallback(false); } - ColorTween _color; + ColorTween _scrimColorTween; final GlobalKey _gestureDetectorKey = GlobalKey(); + ColorTween _buildScrimColorTween() { + return ColorTween(begin: Colors.transparent, end: widget.scrimColor ?? Colors.black54); + } + AlignmentDirectional get _drawerOuterAlignment { assert(widget.alignment != null); switch (widget.alignment) { @@ -452,8 +463,8 @@ class DrawerControllerState extends State with SingleTickerPro onTap: close, child: Semantics( label: MaterialLocalizations.of(context)?.modalBarrierDismissLabel, - child: Container( - color: _color.evaluate(_controller), + child: Container( // The drawer's "scrim" + color: _scrimColorTween.evaluate(_controller), ), ), ), diff --git a/packages/flutter/lib/src/material/scaffold.dart b/packages/flutter/lib/src/material/scaffold.dart index 5316be375f..29b5095567 100644 --- a/packages/flutter/lib/src/material/scaffold.dart +++ b/packages/flutter/lib/src/material/scaffold.dart @@ -904,7 +904,7 @@ class Scaffold extends StatefulWidget { this.primary = true, this.drawerDragStartBehavior = DragStartBehavior.start, this.extendBody = false, - this.drawerScrimColor = Colors.black54, + this.drawerScrimColor, }) : assert(primary != null), assert(extendBody != null), assert(drawerDragStartBehavior != null), diff --git a/packages/flutter/test/material/drawer_test.dart b/packages/flutter/test/material/drawer_test.dart index 3a6f14ca89..94264f2a42 100644 --- a/packages/flutter/test/material/drawer_test.dart +++ b/packages/flutter/test/material/drawer_test.dart @@ -107,31 +107,71 @@ void main() { semantics.dispose(); }); - testWidgets('Drawer scrimDrawerColor test', (WidgetTester tester) async { - - await tester.pumpWidget( - const MaterialApp( - home: Scaffold( - drawerScrimColor: Color(0xFF323232), - drawer: Drawer(), + testWidgets('Scaffold drawerScrimColor', (WidgetTester tester) async { + // The scrim is a Container within a Semantics node labeled "Dismiss", + // within a DrawerController. Sorry. + Container getScrim() { + return tester.widget( + find.descendant( + of: find.descendant( + of: find.byType(DrawerController), + matching: find.byWidgetPredicate((Widget widget) { + if (widget is! Semantics) + return false; + final Semantics semantics = widget; + return semantics.properties.label == 'Dismiss'; + }), + ), + matching: find.byType(Container), ), - ), - ); + ); + } - final ScaffoldState state = tester.firstState(find.byType(Scaffold)); - state.openDrawer(); + final GlobalKey scaffoldKey = GlobalKey(); + Widget buildFrame({ Color drawerScrimColor }) { + return MaterialApp( + home: Scaffold( + key: scaffoldKey, + drawerScrimColor: drawerScrimColor, + drawer: Drawer( + child: Builder( + builder: (BuildContext context) { + return GestureDetector( + onTap: () { Navigator.pop(context); }, // close drawer + ); + }, + ), + ), + ), + ); + } - await tester.pump(); - await tester.pump(const Duration(seconds: 1)); + // Default drawerScrimColor - final Container container = tester.widget(find.descendant( - of: find.byType(Scaffold), - matching: find.byType(Container), - ).first, - ); + await tester.pumpWidget(buildFrame(drawerScrimColor: null)); + scaffoldKey.currentState.openDrawer(); + await tester.pumpAndSettle(); - final BoxDecoration decoration = container.decoration; + BoxDecoration decoration = getScrim().decoration; + expect(decoration.color, Colors.black54); + expect(decoration.shape, BoxShape.rectangle); + + await tester.tap(find.byType(Drawer)); + await tester.pumpAndSettle(); + expect(find.byType(Drawer), findsNothing); + + // Specific drawerScrimColor + + await tester.pumpWidget(buildFrame(drawerScrimColor: const Color(0xFF323232))); + scaffoldKey.currentState.openDrawer(); + await tester.pumpAndSettle(); + + decoration = getScrim().decoration; expect(decoration.color, const Color(0xFF323232)); - expect(decoration.shape, BoxShape.rectangle); + expect(decoration.shape, BoxShape.rectangle); + + await tester.tap(find.byType(Drawer)); + await tester.pumpAndSettle(); + expect(find.byType(Drawer), findsNothing); }); }