mirror of
https://github.com/flutter/flutter
synced 2024-10-13 11:42:54 +00:00
Simplify drawer scrimColor defaults, update tests (#31947)
This commit is contained in:
parent
34325ba33a
commit
4230e9674c
|
@ -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<DrawerController> 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<DrawerController> 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<DrawerController> 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<DrawerController> 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),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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<Container>(
|
||||
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<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
|
||||
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<Container>(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);
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue