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({
Clip? clipBehavior,
BoxConstraints? constraints,
bool? enableDrag,
bool? showDragHandle,
AnimationController? transitionAnimationController,
}) {
assert(debugCheckHasScaffold(context));
......@@ -1345,6 +1346,7 @@ PersistentBottomSheetController showBottomSheet({
clipBehavior: clipBehavior,
constraints: constraints,
enableDrag: enableDrag,
showDragHandle: showDragHandle,
transitionAnimationController: transitionAnimationController,
);
}
......
......@@ -2306,6 +2306,7 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin, Resto
Clip? clipBehavior,
BoxConstraints? constraints,
bool? enableDrag,
bool? showDragHandle,
bool shouldDisposeAnimationController = true,
}) {
assert(() {
......@@ -2380,6 +2381,7 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin, Resto
key: bottomSheetKey,
animationController: animationController,
enableDrag: enableDrag ?? !isPersistent,
showDragHandle: showDragHandle,
onClosing: () {
if (_currentBottomSheet == null) {
return;
......@@ -2481,6 +2483,7 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin, Resto
Clip? clipBehavior,
BoxConstraints? constraints,
bool? enableDrag,
bool? showDragHandle,
AnimationController? transitionAnimationController,
}) {
assert(() {
......@@ -2508,6 +2511,7 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin, Resto
clipBehavior: clipBehavior,
constraints: constraints,
enableDrag: enableDrag,
showDragHandle: showDragHandle,
shouldDisposeAnimationController: transitionAnimationController == null,
);
});
......@@ -3133,6 +3137,7 @@ class _StandardBottomSheet extends StatefulWidget {
super.key,
required this.animationController,
this.enableDrag = true,
this.showDragHandle,
required this.onClosing,
required this.onDismissed,
required this.builder,
......@@ -3147,6 +3152,7 @@ class _StandardBottomSheet extends StatefulWidget {
final AnimationController animationController; // we control it, but it must be disposed by whoever created it.
final bool enableDrag;
final bool? showDragHandle;
final VoidCallback? onClosing;
final VoidCallback? onDismissed;
final VoidCallback? onDispose;
......@@ -3252,6 +3258,7 @@ class _StandardBottomSheetState extends State<_StandardBottomSheet> {
child: BottomSheet(
animationController: widget.animationController,
enableDrag: widget.enableDrag,
showDragHandle: widget.showDragHandle,
onDragStart: _handleDragStart,
onDragEnd: _handleDragEnd,
onClosing: widget.onClosing!,
......
......@@ -1194,35 +1194,10 @@ void main() {
});
testWidgets('Drag handle color can take MaterialStateProperty', (WidgetTester tester) async {
final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
const Color defaultColor=Colors.blue;
const Color hoveringColor=Colors.green;
await tester.pumpWidget(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')),
),
));
showModalBottomSheet<void>(
context: scaffoldKey.currentContext!,
showDragHandle: true,
builder: (BuildContext context) {
return const Text('BottomSheet');
},
);
Future<void> checkDragHandleAndColors() async {
await tester.pump(); // bottom sheet show animation starts
await tester.pump(const Duration(seconds: 1)); // animation done
......@@ -1253,6 +1228,57 @@ void main() {
)).decoration! as BoxDecoration;
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 {
......
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