Skip to content

Commit f6144f0

Browse files
authored
feat: Add drag handle size to be configurable based on given size (flutter#152085)
Feat: Drag handle size can now be changed to any given size. So, In previous behaviour drag handle size was not able to extends beyond 48x48. But some user might want to change it. In current behaviour, drag handle size is default to same 48x48 but if drag handle size grows beyond that, we don't restrict it. Fixes flutter#149170
1 parent 7f8ad8a commit f6144f0

File tree

2 files changed

+78
-2
lines changed

2 files changed

+78
-2
lines changed

packages/flutter/lib/src/material/bottom_sheet.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
/// @docImport 'dart:ui';
66
library;
77

8+
import 'dart:math' as math;
9+
810
import 'package:flutter/gestures.dart';
911
import 'package:flutter/rendering.dart';
1012
import 'package:flutter/widgets.dart';
@@ -460,8 +462,8 @@ class _DragHandle extends StatelessWidget {
460462
container: true,
461463
onTap: onSemanticsTap,
462464
child: SizedBox(
463-
height: kMinInteractiveDimension,
464-
width: kMinInteractiveDimension,
465+
width: math.max(handleSize.width, kMinInteractiveDimension),
466+
height: math.max(handleSize.height, kMinInteractiveDimension),
465467
child: Center(
466468
child: Container(
467469
height: handleSize.height,

packages/flutter/test/material/bottom_sheet_test.dart

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1281,6 +1281,80 @@ void main() {
12811281
await checkDragHandleAndColors();
12821282
});
12831283

1284+
testWidgets('Drag handle interactive area size at minimum possible size', (WidgetTester tester) async {
1285+
Widget buildScaffold(GlobalKey scaffoldKey, {Size? dragHandleSize}) {
1286+
return MaterialApp(
1287+
theme: ThemeData.light().copyWith(
1288+
bottomSheetTheme: BottomSheetThemeData(
1289+
dragHandleSize: dragHandleSize
1290+
),
1291+
),
1292+
home: Scaffold(
1293+
key: scaffoldKey,
1294+
),
1295+
);
1296+
}
1297+
1298+
const Size smallerDragHandleSize = Size(20, 20);
1299+
1300+
final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
1301+
await tester.pumpWidget(buildScaffold(scaffoldKey, dragHandleSize: smallerDragHandleSize));
1302+
1303+
showModalBottomSheet<void>(
1304+
context: scaffoldKey.currentContext!,
1305+
showDragHandle: true,
1306+
builder: (BuildContext context) {
1307+
return const Text('BottomSheet');
1308+
},
1309+
);
1310+
1311+
await tester.pump(); // Bottom sheet show animation starts.
1312+
await tester.pump(const Duration(seconds: 1)); // Animation done.
1313+
1314+
final Finder dragHandle = find.bySemanticsLabel('Dismiss');
1315+
expect(
1316+
tester.getSize(dragHandle),
1317+
const Size(kMinInteractiveDimension, kMinInteractiveDimension),
1318+
);
1319+
});
1320+
1321+
testWidgets('Drag handle interactive area size at given dragHandleSize', (WidgetTester tester) async {
1322+
Widget buildScaffold(GlobalKey scaffoldKey, {Size? dragHandleSize}) {
1323+
return MaterialApp(
1324+
theme: ThemeData.light().copyWith(
1325+
bottomSheetTheme: BottomSheetThemeData(
1326+
dragHandleSize: dragHandleSize
1327+
),
1328+
),
1329+
home: Scaffold(
1330+
key: scaffoldKey,
1331+
),
1332+
);
1333+
}
1334+
1335+
const Size extendedDragHandleSize = Size(100, 50);
1336+
1337+
final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
1338+
await tester.pumpWidget(buildScaffold(scaffoldKey, dragHandleSize: extendedDragHandleSize));
1339+
1340+
showModalBottomSheet<void>(
1341+
context: scaffoldKey.currentContext!,
1342+
showDragHandle: true,
1343+
builder: (BuildContext context) {
1344+
return const Text('BottomSheet');
1345+
},
1346+
);
1347+
1348+
await tester.pump(); // Bottom sheet show animation starts.
1349+
await tester.pump(const Duration(seconds: 1)); // Animation done.
1350+
1351+
final Finder dragHandle = find.bySemanticsLabel('Dismiss');
1352+
expect(
1353+
tester.getSize(dragHandle),
1354+
extendedDragHandleSize,
1355+
);
1356+
});
1357+
12841358
testWidgets('showModalBottomSheet does not use root Navigator by default', (WidgetTester tester) async {
12851359
await tester.pumpWidget(MaterialApp(
12861360
home: Scaffold(

0 commit comments

Comments
 (0)