Unverified Commit ba4a11da authored by Qun Cheng's avatar Qun Cheng Committed by GitHub

Add `showDragHandle` to `showBottomSheet` (#141754)

parent 3563372f
...@@ -1333,6 +1333,7 @@ PersistentBottomSheetController showBottomSheet({ ...@@ -1333,6 +1333,7 @@ PersistentBottomSheetController showBottomSheet({
Clip? clipBehavior, Clip? clipBehavior,
BoxConstraints? constraints, BoxConstraints? constraints,
bool? enableDrag, bool? enableDrag,
bool? showDragHandle,
AnimationController? transitionAnimationController, AnimationController? transitionAnimationController,
}) { }) {
assert(debugCheckHasScaffold(context)); assert(debugCheckHasScaffold(context));
...@@ -1345,6 +1346,7 @@ PersistentBottomSheetController showBottomSheet({ ...@@ -1345,6 +1346,7 @@ PersistentBottomSheetController showBottomSheet({
clipBehavior: clipBehavior, clipBehavior: clipBehavior,
constraints: constraints, constraints: constraints,
enableDrag: enableDrag, enableDrag: enableDrag,
showDragHandle: showDragHandle,
transitionAnimationController: transitionAnimationController, transitionAnimationController: transitionAnimationController,
); );
} }
......
...@@ -2306,6 +2306,7 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin, Resto ...@@ -2306,6 +2306,7 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin, Resto
Clip? clipBehavior, Clip? clipBehavior,
BoxConstraints? constraints, BoxConstraints? constraints,
bool? enableDrag, bool? enableDrag,
bool? showDragHandle,
bool shouldDisposeAnimationController = true, bool shouldDisposeAnimationController = true,
}) { }) {
assert(() { assert(() {
...@@ -2380,6 +2381,7 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin, Resto ...@@ -2380,6 +2381,7 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin, Resto
key: bottomSheetKey, key: bottomSheetKey,
animationController: animationController, animationController: animationController,
enableDrag: enableDrag ?? !isPersistent, enableDrag: enableDrag ?? !isPersistent,
showDragHandle: showDragHandle,
onClosing: () { onClosing: () {
if (_currentBottomSheet == null) { if (_currentBottomSheet == null) {
return; return;
...@@ -2481,6 +2483,7 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin, Resto ...@@ -2481,6 +2483,7 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin, Resto
Clip? clipBehavior, Clip? clipBehavior,
BoxConstraints? constraints, BoxConstraints? constraints,
bool? enableDrag, bool? enableDrag,
bool? showDragHandle,
AnimationController? transitionAnimationController, AnimationController? transitionAnimationController,
}) { }) {
assert(() { assert(() {
...@@ -2508,6 +2511,7 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin, Resto ...@@ -2508,6 +2511,7 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin, Resto
clipBehavior: clipBehavior, clipBehavior: clipBehavior,
constraints: constraints, constraints: constraints,
enableDrag: enableDrag, enableDrag: enableDrag,
showDragHandle: showDragHandle,
shouldDisposeAnimationController: transitionAnimationController == null, shouldDisposeAnimationController: transitionAnimationController == null,
); );
}); });
...@@ -3133,6 +3137,7 @@ class _StandardBottomSheet extends StatefulWidget { ...@@ -3133,6 +3137,7 @@ class _StandardBottomSheet extends StatefulWidget {
super.key, super.key,
required this.animationController, required this.animationController,
this.enableDrag = true, this.enableDrag = true,
this.showDragHandle,
required this.onClosing, required this.onClosing,
required this.onDismissed, required this.onDismissed,
required this.builder, required this.builder,
...@@ -3147,6 +3152,7 @@ class _StandardBottomSheet extends StatefulWidget { ...@@ -3147,6 +3152,7 @@ class _StandardBottomSheet extends StatefulWidget {
final AnimationController animationController; // we control it, but it must be disposed by whoever created it. final AnimationController animationController; // we control it, but it must be disposed by whoever created it.
final bool enableDrag; final bool enableDrag;
final bool? showDragHandle;
final VoidCallback? onClosing; final VoidCallback? onClosing;
final VoidCallback? onDismissed; final VoidCallback? onDismissed;
final VoidCallback? onDispose; final VoidCallback? onDispose;
...@@ -3252,6 +3258,7 @@ class _StandardBottomSheetState extends State<_StandardBottomSheet> { ...@@ -3252,6 +3258,7 @@ class _StandardBottomSheetState extends State<_StandardBottomSheet> {
child: BottomSheet( child: BottomSheet(
animationController: widget.animationController, animationController: widget.animationController,
enableDrag: widget.enableDrag, enableDrag: widget.enableDrag,
showDragHandle: widget.showDragHandle,
onDragStart: _handleDragStart, onDragStart: _handleDragStart,
onDragEnd: _handleDragEnd, onDragEnd: _handleDragEnd,
onClosing: widget.onClosing!, onClosing: widget.onClosing!,
......
...@@ -1194,35 +1194,10 @@ void main() { ...@@ -1194,35 +1194,10 @@ void main() {
}); });
testWidgets('Drag handle color can take MaterialStateProperty', (WidgetTester tester) async { testWidgets('Drag handle color can take MaterialStateProperty', (WidgetTester tester) async {
final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
const Color defaultColor=Colors.blue; const Color defaultColor=Colors.blue;
const Color hoveringColor=Colors.green; const Color hoveringColor=Colors.green;
await tester.pumpWidget(MaterialApp( Future<void> checkDragHandleAndColors() async {
theme: ThemeData.light().copyWith(
bottomSheetTheme: BottomSheetThemeData(
dragHandleColor: MaterialStateColor.resolveWith((Set<MaterialState> states) {
if (states.contains(MaterialState.hovered)) {
return hoveringColor;
}
return defaultColor;
}),
),
),
home: Scaffold(
key: scaffoldKey,
body: const Center(child: Text('body')),
),
));
showModalBottomSheet<void>(
context: scaffoldKey.currentContext!,
showDragHandle: true,
builder: (BuildContext context) {
return const Text('BottomSheet');
},
);
await tester.pump(); // bottom sheet show animation starts await tester.pump(); // bottom sheet show animation starts
await tester.pump(const Duration(seconds: 1)); // animation done await tester.pump(const Duration(seconds: 1)); // animation done
...@@ -1253,6 +1228,57 @@ void main() { ...@@ -1253,6 +1228,57 @@ void main() {
)).decoration! as BoxDecoration; )).decoration! as BoxDecoration;
expect(boxDecoration.color, hoveringColor); expect(boxDecoration.color, hoveringColor);
await gesture.removePointer();
}
Widget buildScaffold(GlobalKey scaffoldKey) {
return MaterialApp(
theme: ThemeData.light().copyWith(
bottomSheetTheme: BottomSheetThemeData(
dragHandleColor: MaterialStateColor.resolveWith((Set<MaterialState> states) {
if (states.contains(MaterialState.hovered)) {
return hoveringColor;
}
return defaultColor;
}),
),
),
home: Scaffold(
key: scaffoldKey,
body: const Center(child: Text('body')),
),
);
}
GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
await tester.pumpWidget(buildScaffold(scaffoldKey));
showModalBottomSheet<void>(
context: scaffoldKey.currentContext!,
showDragHandle: true,
builder: (BuildContext context) {
return const Text('BottomSheet');
},
);
await checkDragHandleAndColors();
await tester.pumpWidget(Container()); // Reset
scaffoldKey = GlobalKey<ScaffoldState>();
await tester.pumpWidget(buildScaffold(scaffoldKey));
scaffoldKey.currentState!.showBottomSheet((_) {
return Builder(
builder: (BuildContext context) {
return const SizedBox(
height: 200.0,
child: Text('Bottom Sheet'),
);
},
);
}, showDragHandle: true);
await checkDragHandleAndColors();
}); });
testWidgets('showModalBottomSheet does not use root Navigator by default', (WidgetTester tester) async { testWidgets('showModalBottomSheet does not use root Navigator by default', (WidgetTester tester) async {
......
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