@@ -72,7 +72,7 @@ void main() {
72
72
73
73
testWidgets ('Material2 - Dialog size - input mode' , (WidgetTester tester) async {
74
74
const TimePickerEntryMode entryMode = TimePickerEntryMode .input;
75
- const Size timePickerInputSize = Size (312 , 216 );
75
+ const Size timePickerInputSize = Size (312 , 252 );
76
76
const Size dayPeriodPortraitSize = Size (52 , 80 );
77
77
const EdgeInsets padding = EdgeInsets .fromLTRB (8 , 18 , 8 , 8 );
78
78
final double height = timePickerInputSize.height + padding.vertical;
@@ -81,7 +81,9 @@ void main() {
81
81
await mediaQueryBoilerplate (tester, entryMode: entryMode, materialType: MaterialType .material2);
82
82
83
83
width = timePickerInputSize.width + padding.horizontal;
84
- expect (tester.getSize (find.byWidget (getMaterialFromDialog (tester))), Size (width, height));
84
+ Size size = tester.getSize (find.byWidget (getMaterialFromDialog (tester)));
85
+ expect (size.width, width);
86
+ expect (size.height, lessThan (height));
85
87
86
88
await tester.tap (find.text (okString)); // dismiss the dialog
87
89
await tester.pumpAndSettle ();
@@ -93,7 +95,9 @@ void main() {
93
95
materialType: MaterialType .material2,
94
96
);
95
97
width = timePickerInputSize.width - dayPeriodPortraitSize.width - 12 + padding.horizontal + 16 ;
96
- expect (tester.getSize (find.byWidget (getMaterialFromDialog (tester))), Size (width, height));
98
+ size = tester.getSize (find.byWidget (getMaterialFromDialog (tester)));
99
+ expect (size.width, width);
100
+ expect (size.height, lessThan (height));
97
101
});
98
102
99
103
testWidgets ('Material2 - respects MediaQueryData.alwaysUse24HourFormat == true' , (
@@ -163,7 +167,7 @@ void main() {
163
167
final ThemeData theme = ThemeData ();
164
168
const TimePickerEntryMode entryMode = TimePickerEntryMode .input;
165
169
const double textScaleFactor = 1.0 ;
166
- const Size timePickerMinInputSize = Size (312 , 216 );
170
+ const Size timePickerMinInputSize = Size (312 , 252 );
167
171
const Size dayPeriodPortraitSize = Size (52 , 80 );
168
172
const EdgeInsets padding = EdgeInsets .all (24.0 );
169
173
final double height = timePickerMinInputSize.height * textScaleFactor + padding.vertical;
@@ -172,7 +176,9 @@ void main() {
172
176
await mediaQueryBoilerplate (tester, entryMode: entryMode, materialType: MaterialType .material3);
173
177
174
178
width = timePickerMinInputSize.width - (theme.useMaterial3 ? 32 : 0 ) + padding.horizontal;
175
- expect (tester.getSize (find.byWidget (getMaterialFromDialog (tester))), Size (width, height));
179
+ Size size = tester.getSize (find.byWidget (getMaterialFromDialog (tester)));
180
+ expect (size.width, width);
181
+ expect (size.height, lessThan (height));
176
182
177
183
await tester.tap (find.text (okString)); // dismiss the dialog
178
184
await tester.pumpAndSettle ();
@@ -185,7 +191,9 @@ void main() {
185
191
);
186
192
187
193
width = timePickerMinInputSize.width - dayPeriodPortraitSize.width - 12 + padding.horizontal;
188
- expect (tester.getSize (find.byWidget (getMaterialFromDialog (tester))), Size (width, height));
194
+ size = tester.getSize (find.byWidget (getMaterialFromDialog (tester)));
195
+ expect (size.width, width);
196
+ expect (size.height, lessThan (height));
189
197
});
190
198
191
199
testWidgets ('Material3 - respects MediaQueryData.alwaysUse24HourFormat == true' , (
@@ -594,6 +602,24 @@ void main() {
594
602
expect (find.text ('Cancel' ), findsOneWidget);
595
603
});
596
604
605
+ testWidgets (
606
+ 'Material3 - large actions label should not overflow in input mode' ,
607
+ (WidgetTester tester) async {
608
+ await startPicker (
609
+ tester,
610
+ (TimeOfDay ? time) {},
611
+ entryMode: TimePickerEntryMode .input,
612
+ materialType: MaterialType .material3,
613
+ cancelText: 'Very very very long cancel text' ,
614
+ confirmText: 'Very very very long confirm text' ,
615
+ );
616
+
617
+ // Verify that no overflow errors occur.
618
+ expect (tester.takeException (), isNull);
619
+ },
620
+ variant: TargetPlatformVariant .mobile (),
621
+ );
622
+
597
623
testWidgets ('respects MediaQueryData.alwaysUse24HourFormat == false' , (
598
624
WidgetTester tester,
599
625
) async {
@@ -2325,11 +2351,15 @@ class _TimePickerLauncher extends StatefulWidget {
2325
2351
required this .onChanged,
2326
2352
this .entryMode = TimePickerEntryMode .dial,
2327
2353
this .restorationId,
2354
+ this .cancelText,
2355
+ this .confirmText,
2328
2356
});
2329
2357
2330
2358
final ValueChanged <TimeOfDay ?> onChanged;
2331
2359
final TimePickerEntryMode entryMode;
2332
2360
final String ? restorationId;
2361
+ final String ? cancelText;
2362
+ final String ? confirmText;
2333
2363
2334
2364
@override
2335
2365
_TimePickerLauncherState createState () => _TimePickerLauncherState ();
@@ -2346,7 +2376,11 @@ class _TimePickerLauncherState extends State<_TimePickerLauncher> with Restorati
2346
2376
onPresent: (NavigatorState navigator, Object ? arguments) {
2347
2377
return navigator.restorablePush (
2348
2378
_timePickerRoute,
2349
- arguments: < String , String > {'entry_mode' : widget.entryMode.name},
2379
+ arguments: < String , String > {
2380
+ 'entry_mode' : widget.entryMode.name,
2381
+ if (widget.cancelText != null ) 'cancel_text' : widget.cancelText! ,
2382
+ if (widget.confirmText != null ) 'confirm_text' : widget.confirmText! ,
2383
+ },
2350
2384
);
2351
2385
},
2352
2386
);
@@ -2363,13 +2397,17 @@ class _TimePickerLauncherState extends State<_TimePickerLauncher> with Restorati
2363
2397
final TimePickerEntryMode entryMode = TimePickerEntryMode .values.firstWhere (
2364
2398
(TimePickerEntryMode element) => element.name == args['entry_mode' ],
2365
2399
);
2400
+ final String ? cancelText = args['cancel_text' ] as String ? ;
2401
+ final String ? confirmText = args['confirm_text' ] as String ? ;
2366
2402
return DialogRoute <TimeOfDay >(
2367
2403
context: context,
2368
2404
builder: (BuildContext context) {
2369
2405
return TimePickerDialog (
2370
2406
restorationId: 'time_picker_dialog' ,
2371
2407
initialTime: const TimeOfDay (hour: 7 , minute: 0 ),
2372
2408
initialEntryMode: entryMode,
2409
+ cancelText: cancelText,
2410
+ confirmText: confirmText,
2373
2411
);
2374
2412
},
2375
2413
);
@@ -2426,6 +2464,8 @@ Future<Offset?> startPicker(
2426
2464
String ? restorationId,
2427
2465
ThemeData ? theme,
2428
2466
MaterialType ? materialType,
2467
+ String ? cancelText,
2468
+ String ? confirmText,
2429
2469
}) async {
2430
2470
await tester.pumpWidget (
2431
2471
MaterialApp (
@@ -2436,6 +2476,8 @@ Future<Offset?> startPicker(
2436
2476
onChanged: onChanged,
2437
2477
entryMode: entryMode,
2438
2478
restorationId: restorationId,
2479
+ cancelText: cancelText,
2480
+ confirmText: confirmText,
2439
2481
),
2440
2482
),
2441
2483
);
0 commit comments