mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
Date picker dialog state should dispose members. (#134804)
This commit is contained in:
parent
0b9551e6a6
commit
72b69f9449
@ -416,6 +416,14 @@ class _DatePickerDialogState extends State<DatePickerDialog> with RestorationMix
|
||||
late final _RestorableDatePickerEntryMode _entryMode = _RestorableDatePickerEntryMode(widget.initialEntryMode);
|
||||
final _RestorableAutovalidateMode _autovalidateMode = _RestorableAutovalidateMode(AutovalidateMode.disabled);
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_selectedDate.dispose();
|
||||
_entryMode.dispose();
|
||||
_autovalidateMode.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
String? get restorationId => widget.restorationId;
|
||||
|
||||
|
@ -8,6 +8,7 @@ import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
|
||||
|
||||
void main() {
|
||||
TestWidgetsFlutterBinding.ensureInitialized();
|
||||
@ -122,7 +123,7 @@ void main() {
|
||||
}
|
||||
|
||||
group('showDatePicker Dialog', () {
|
||||
testWidgets('Default dialog size', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Default dialog size', (WidgetTester tester) async {
|
||||
Future<void> showPicker(WidgetTester tester, Size size) async {
|
||||
tester.view.physicalSize = size;
|
||||
tester.view.devicePixelRatio = 1.0;
|
||||
@ -149,7 +150,7 @@ void main() {
|
||||
expect(dialogContainerSize, calendarPortraitDialogSizeM3);
|
||||
});
|
||||
|
||||
testWidgets('Default dialog properties', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Default dialog properties', (WidgetTester tester) async {
|
||||
final ThemeData theme = ThemeData(useMaterial3: true);
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
final Material dialogMaterial = tester.widget<Material>(
|
||||
@ -172,13 +173,13 @@ void main() {
|
||||
}, useMaterial3: theme.useMaterial3);
|
||||
});
|
||||
|
||||
testWidgets('Material3 uses sentence case labels', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Material3 uses sentence case labels', (WidgetTester tester) async {
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
expect(find.text('Select date'), findsOneWidget);
|
||||
}, useMaterial3: true);
|
||||
});
|
||||
|
||||
testWidgets('Cancel, confirm, and help text is used', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Cancel, confirm, and help text is used', (WidgetTester tester) async {
|
||||
cancelText = 'nope';
|
||||
confirmText = 'yep';
|
||||
helpText = 'help';
|
||||
@ -189,21 +190,21 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Initial date is the default', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Initial date is the default', (WidgetTester tester) async {
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
await tester.tap(find.text('OK'));
|
||||
expect(await date, DateTime(2016, DateTime.january, 15));
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Can cancel', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Can cancel', (WidgetTester tester) async {
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
await tester.tap(find.text('CANCEL'));
|
||||
expect(await date, isNull);
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Can switch from calendar to input entry mode', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Can switch from calendar to input entry mode', (WidgetTester tester) async {
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
expect(find.byType(TextField), findsNothing);
|
||||
await tester.tap(find.byIcon(Icons.edit));
|
||||
@ -212,7 +213,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Can switch from input to calendar entry mode', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Can switch from input to calendar entry mode', (WidgetTester tester) async {
|
||||
initialEntryMode = DatePickerEntryMode.input;
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
expect(find.byType(TextField), findsOneWidget);
|
||||
@ -222,7 +223,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Can not switch out of calendarOnly mode', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Can not switch out of calendarOnly mode', (WidgetTester tester) async {
|
||||
initialEntryMode = DatePickerEntryMode.calendarOnly;
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
expect(find.byType(TextField), findsNothing);
|
||||
@ -230,7 +231,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Can not switch out of inputOnly mode', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Can not switch out of inputOnly mode', (WidgetTester tester) async {
|
||||
initialEntryMode = DatePickerEntryMode.inputOnly;
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
expect(find.byType(TextField), findsOneWidget);
|
||||
@ -238,7 +239,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Switching to input mode keeps selected date', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Switching to input mode keeps selected date', (WidgetTester tester) async {
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
await tester.tap(find.text('12'));
|
||||
await tester.tap(find.byIcon(Icons.edit));
|
||||
@ -248,7 +249,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Input only mode should validate date', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Input only mode should validate date', (WidgetTester tester) async {
|
||||
initialEntryMode = DatePickerEntryMode.inputOnly;
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
// Enter text input mode and type an invalid date to get error.
|
||||
@ -259,7 +260,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Switching to input mode resets input error state', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Switching to input mode resets input error state', (WidgetTester tester) async {
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
// Enter text input mode and type an invalid date to get error.
|
||||
await tester.tap(find.byIcon(Icons.edit));
|
||||
@ -283,7 +284,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('builder parameter', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('builder parameter', (WidgetTester tester) async {
|
||||
Widget buildFrame(TextDirection textDirection) {
|
||||
return MaterialApp(
|
||||
home: Material(
|
||||
@ -340,7 +341,7 @@ void main() {
|
||||
rootObserver = _DatePickerObserver();
|
||||
});
|
||||
|
||||
testWidgets('Barrier is dismissible with default parameter', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Barrier is dismissible with default parameter', (WidgetTester tester) async {
|
||||
await tester.pumpWidget(
|
||||
MaterialApp(
|
||||
navigatorObservers: <NavigatorObserver>[rootObserver],
|
||||
@ -378,7 +379,7 @@ void main() {
|
||||
expect(rootObserver.datePickerCount, 0);
|
||||
});
|
||||
|
||||
testWidgets('Barrier is not dismissible with barrierDismissible is false', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Barrier is not dismissible with barrierDismissible is false', (WidgetTester tester) async {
|
||||
await tester.pumpWidget(
|
||||
MaterialApp(
|
||||
navigatorObservers: <NavigatorObserver>[rootObserver],
|
||||
@ -418,7 +419,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Barrier color', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Barrier color', (WidgetTester tester) async {
|
||||
await tester.pumpWidget(
|
||||
MaterialApp(
|
||||
home: Material(
|
||||
@ -484,7 +485,7 @@ void main() {
|
||||
expect(tester.widget<ModalBarrier>(find.byType(ModalBarrier).last).color, Colors.pink);
|
||||
});
|
||||
|
||||
testWidgets('Barrier Label', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Barrier Label', (WidgetTester tester) async {
|
||||
await tester.pumpWidget(
|
||||
MaterialApp(
|
||||
home: Material(
|
||||
@ -517,7 +518,7 @@ void main() {
|
||||
expect(tester.widget<ModalBarrier>(find.byType(ModalBarrier).last).semanticsLabel, 'Custom Label');
|
||||
});
|
||||
|
||||
testWidgets('uses nested navigator if useRootNavigator is false', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('uses nested navigator if useRootNavigator is false', (WidgetTester tester) async {
|
||||
final _DatePickerObserver rootObserver = _DatePickerObserver();
|
||||
final _DatePickerObserver nestedObserver = _DatePickerObserver();
|
||||
|
||||
@ -554,7 +555,7 @@ void main() {
|
||||
expect(nestedObserver.datePickerCount, 1);
|
||||
});
|
||||
|
||||
testWidgets('honors DialogTheme for shape and elevation', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('honors DialogTheme for shape and elevation', (WidgetTester tester) async {
|
||||
// Test that the defaults work
|
||||
const DialogTheme datePickerDefaultDialogTheme = DialogTheme(
|
||||
shape: RoundedRectangleBorder(
|
||||
@ -627,7 +628,7 @@ void main() {
|
||||
expect(themeDialogMaterial.elevation, customDialogTheme.elevation);
|
||||
});
|
||||
|
||||
testWidgets('OK Cancel button layout', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('OK Cancel button layout', (WidgetTester tester) async {
|
||||
Widget buildFrame(TextDirection textDirection) {
|
||||
return MaterialApp(
|
||||
theme: ThemeData(useMaterial3: false),
|
||||
@ -703,7 +704,7 @@ void main() {
|
||||
await tester.pumpAndSettle();
|
||||
});
|
||||
|
||||
testWidgets('honors switchToInputEntryModeIcon', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('honors switchToInputEntryModeIcon', (WidgetTester tester) async {
|
||||
Widget buildApp({bool? useMaterial3, Icon? switchToInputEntryModeIcon}) {
|
||||
return MaterialApp(
|
||||
theme: ThemeData(
|
||||
@ -759,7 +760,7 @@ void main() {
|
||||
await tester.pumpAndSettle();
|
||||
});
|
||||
|
||||
testWidgets('honors switchToCalendarEntryModeIcon', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('honors switchToCalendarEntryModeIcon', (WidgetTester tester) async {
|
||||
Widget buildApp({bool? useMaterial3, Icon? switchToCalendarEntryModeIcon}) {
|
||||
return MaterialApp(
|
||||
theme: ThemeData(
|
||||
@ -818,7 +819,7 @@ void main() {
|
||||
});
|
||||
|
||||
group('Calendar mode', () {
|
||||
testWidgets('Default Calendar mode layout (Landscape)', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Default Calendar mode layout (Landscape)', (WidgetTester tester) async {
|
||||
final Finder helpText = find.text('Select date');
|
||||
final Finder headerText = find.text('Fri, Jan 15');
|
||||
final Finder subHeaderText = find.text('January 2016');
|
||||
@ -917,7 +918,7 @@ void main() {
|
||||
expect(cancelButtonTopRight.dx, okButtonTopLeft.dx - 8);
|
||||
});
|
||||
|
||||
testWidgets('Default Calendar mode layout (Portrait)', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Default Calendar mode layout (Portrait)', (WidgetTester tester) async {
|
||||
final Finder helpText = find.text('Select date');
|
||||
final Finder headerText = find.text('Fri, Jan 15');
|
||||
final Finder subHeaderText = find.text('January 2016');
|
||||
@ -1016,7 +1017,7 @@ void main() {
|
||||
expect(cancelButtonTopRight.dx, okButtonTopLeft.dx - 8);
|
||||
});
|
||||
|
||||
testWidgets('Can select a day', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Can select a day', (WidgetTester tester) async {
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
await tester.tap(find.text('12'));
|
||||
await tester.tap(find.text('OK'));
|
||||
@ -1024,7 +1025,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Can select a month', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Can select a month', (WidgetTester tester) async {
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
await tester.tap(previousMonthIcon);
|
||||
await tester.pumpAndSettle(const Duration(seconds: 1));
|
||||
@ -1034,7 +1035,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Can select a year', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Can select a year', (WidgetTester tester) async {
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
await tester.tap(find.text('January 2016')); // Switch to year mode.
|
||||
await tester.pump();
|
||||
@ -1044,7 +1045,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Can select a day with no initial date', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Can select a day with no initial date', (WidgetTester tester) async {
|
||||
initialDate = null;
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
await tester.tap(find.text('12'));
|
||||
@ -1053,7 +1054,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Can select a month with no initial date', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Can select a month with no initial date', (WidgetTester tester) async {
|
||||
initialDate = null;
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
await tester.tap(previousMonthIcon);
|
||||
@ -1064,7 +1065,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Can select a year with no initial date', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Can select a year with no initial date', (WidgetTester tester) async {
|
||||
initialDate = null;
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
await tester.tap(find.text('January 2016')); // Switch to year mode.
|
||||
@ -1075,7 +1076,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Selecting date does not change displayed month', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Selecting date does not change displayed month', (WidgetTester tester) async {
|
||||
initialDate = DateTime(2020, DateTime.march, 15);
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
await tester.tap(nextMonthIcon);
|
||||
@ -1089,7 +1090,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Changing year does change selected date', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Changing year does change selected date', (WidgetTester tester) async {
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
await tester.tap(find.text('January 2016'));
|
||||
await tester.pump();
|
||||
@ -1100,7 +1101,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Changing year does not change the month', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Changing year does not change the month', (WidgetTester tester) async {
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
await tester.tap(nextMonthIcon);
|
||||
await tester.pumpAndSettle();
|
||||
@ -1114,7 +1115,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Can select a year and then a day', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Can select a year and then a day', (WidgetTester tester) async {
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
await tester.tap(find.text('January 2016')); // Switch to year mode.
|
||||
await tester.pump();
|
||||
@ -1126,7 +1127,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Current year is visible in year picker', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Current year is visible in year picker', (WidgetTester tester) async {
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
await tester.tap(find.text('January 2016')); // Switch to year mode.
|
||||
await tester.pump();
|
||||
@ -1134,7 +1135,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Cannot select a day outside bounds', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Cannot select a day outside bounds', (WidgetTester tester) async {
|
||||
initialDate = DateTime(2017, DateTime.january, 15);
|
||||
firstDate = initialDate!;
|
||||
lastDate = initialDate!;
|
||||
@ -1149,7 +1150,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Cannot select a month past last date', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Cannot select a month past last date', (WidgetTester tester) async {
|
||||
initialDate = DateTime(2017, DateTime.january, 15);
|
||||
firstDate = initialDate!;
|
||||
lastDate = DateTime(2017, DateTime.february, 20);
|
||||
@ -1161,7 +1162,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Cannot select a month before first date', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Cannot select a month before first date', (WidgetTester tester) async {
|
||||
initialDate = DateTime(2017, DateTime.january, 15);
|
||||
firstDate = DateTime(2016, DateTime.december, 10);
|
||||
lastDate = initialDate!;
|
||||
@ -1173,7 +1174,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Cannot select disabled year', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Cannot select disabled year', (WidgetTester tester) async {
|
||||
initialDate = DateTime(2018, DateTime.july, 4);
|
||||
firstDate = DateTime(2018, DateTime.june, 9);
|
||||
lastDate = DateTime(2018, DateTime.december, 15);
|
||||
@ -1188,7 +1189,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Selecting firstDate year respects firstDate', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Selecting firstDate year respects firstDate', (WidgetTester tester) async {
|
||||
initialDate = DateTime(2018, DateTime.may, 4);
|
||||
firstDate = DateTime(2016, DateTime.june, 9);
|
||||
lastDate = DateTime(2019, DateTime.january, 15);
|
||||
@ -1202,7 +1203,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Selecting lastDate year respects lastDate', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Selecting lastDate year respects lastDate', (WidgetTester tester) async {
|
||||
initialDate = DateTime(2018, DateTime.may, 4);
|
||||
firstDate = DateTime(2016, DateTime.june, 9);
|
||||
lastDate = DateTime(2019, DateTime.january, 15);
|
||||
@ -1216,7 +1217,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Only predicate days are selectable', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Only predicate days are selectable', (WidgetTester tester) async {
|
||||
initialDate = DateTime(2017, DateTime.january, 16);
|
||||
firstDate = DateTime(2017, DateTime.january, 10);
|
||||
lastDate = DateTime(2017, DateTime.january, 20);
|
||||
@ -1230,7 +1231,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Can select initial calendar picker mode', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Can select initial calendar picker mode', (WidgetTester tester) async {
|
||||
initialDate = DateTime(2014, DateTime.january, 15);
|
||||
initialCalendarMode = DatePickerMode.year;
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
@ -1243,7 +1244,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('currentDate is highlighted', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('currentDate is highlighted', (WidgetTester tester) async {
|
||||
today = DateTime(2016, 1, 2);
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
await tester.pump();
|
||||
@ -1256,7 +1257,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Date picker dayOverlayColor resolves pressed state', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Date picker dayOverlayColor resolves pressed state', (WidgetTester tester) async {
|
||||
today = DateTime(2023, 5, 4);
|
||||
final ThemeData theme = ThemeData();
|
||||
final bool material3 = theme.useMaterial3;
|
||||
@ -1288,7 +1289,7 @@ void main() {
|
||||
}, theme: theme);
|
||||
});
|
||||
|
||||
testWidgets('Selecting date does not switch picker to year selection', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Selecting date does not switch picker to year selection', (WidgetTester tester) async {
|
||||
initialDate = DateTime(2020, DateTime.may, 10);
|
||||
initialCalendarMode = DatePickerMode.year;
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
@ -1312,7 +1313,7 @@ void main() {
|
||||
initialEntryMode = DatePickerEntryMode.input;
|
||||
});
|
||||
|
||||
testWidgets('Default InputDecoration', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Default InputDecoration', (WidgetTester tester) async {
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
final InputDecoration decoration = tester.widget<TextField>(
|
||||
find.byType(TextField)).decoration!;
|
||||
@ -1324,13 +1325,13 @@ void main() {
|
||||
}, useMaterial3: true);
|
||||
});
|
||||
|
||||
testWidgets('Initial entry mode is used', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Initial entry mode is used', (WidgetTester tester) async {
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
expect(find.byType(TextField), findsOneWidget);
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Hint, label, and help text is used', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Hint, label, and help text is used', (WidgetTester tester) async {
|
||||
cancelText = 'nope';
|
||||
confirmText = 'yep';
|
||||
fieldHintText = 'hint';
|
||||
@ -1345,7 +1346,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('KeyboardType is used', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('KeyboardType is used', (WidgetTester tester) async {
|
||||
keyboardType = TextInputType.text;
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
final TextField field = textField(tester);
|
||||
@ -1353,14 +1354,14 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Initial date is the default', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Initial date is the default', (WidgetTester tester) async {
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
await tester.tap(find.text('OK'));
|
||||
expect(await date, DateTime(2016, DateTime.january, 15));
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Can toggle to calendar entry mode', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Can toggle to calendar entry mode', (WidgetTester tester) async {
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
expect(find.byType(TextField), findsOneWidget);
|
||||
await tester.tap(find.byIcon(Icons.calendar_today));
|
||||
@ -1369,7 +1370,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Toggle to calendar mode keeps selected date', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Toggle to calendar mode keeps selected date', (WidgetTester tester) async {
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
final TextField field = textField(tester);
|
||||
field.controller!.clear();
|
||||
@ -1382,7 +1383,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Entered text returns date', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Entered text returns date', (WidgetTester tester) async {
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
final TextField field = textField(tester);
|
||||
field.controller!.clear();
|
||||
@ -1393,7 +1394,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Too short entered text shows error', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Too short entered text shows error', (WidgetTester tester) async {
|
||||
errorFormatText = 'oops';
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
final TextField field = textField(tester);
|
||||
@ -1409,7 +1410,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Bad format entered text shows error', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Bad format entered text shows error', (WidgetTester tester) async {
|
||||
errorFormatText = 'oops';
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
final TextField field = textField(tester);
|
||||
@ -1426,7 +1427,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Invalid entered text shows error', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Invalid entered text shows error', (WidgetTester tester) async {
|
||||
errorInvalidText = 'oops';
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
final TextField field = textField(tester);
|
||||
@ -1442,7 +1443,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Invalid entered text shows error on autovalidate', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Invalid entered text shows error on autovalidate', (WidgetTester tester) async {
|
||||
// This is a regression test for https://github.com/flutter/flutter/issues/126397.
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
final TextField field = textField(tester);
|
||||
@ -1471,7 +1472,7 @@ void main() {
|
||||
});
|
||||
|
||||
// This is a regression test for https://github.com/flutter/flutter/issues/131989.
|
||||
testWidgets('Dialog contents do not overflow when resized from landscape to portrait',
|
||||
testWidgetsWithLeakTracking('Dialog contents do not overflow when resized from landscape to portrait',
|
||||
(WidgetTester tester) async {
|
||||
addTearDown(tester.view.reset);
|
||||
// Initial window size is wide for landscape mode.
|
||||
@ -1488,7 +1489,7 @@ void main() {
|
||||
});
|
||||
|
||||
group('Semantics', () {
|
||||
testWidgets('calendar mode', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('calendar mode', (WidgetTester tester) async {
|
||||
final SemanticsHandle semantics = tester.ensureSemantics();
|
||||
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
@ -1537,7 +1538,7 @@ void main() {
|
||||
semantics.dispose();
|
||||
});
|
||||
|
||||
testWidgets('input mode', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('input mode', (WidgetTester tester) async {
|
||||
final SemanticsHandle semantics = tester.ensureSemantics();
|
||||
|
||||
initialEntryMode = DatePickerEntryMode.input;
|
||||
@ -1582,7 +1583,7 @@ void main() {
|
||||
});
|
||||
|
||||
group('Keyboard navigation', () {
|
||||
testWidgets('Can toggle to calendar entry mode', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Can toggle to calendar entry mode', (WidgetTester tester) async {
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
expect(find.byType(TextField), findsNothing);
|
||||
// Navigate to the entry toggle button and activate it
|
||||
@ -1598,7 +1599,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Can toggle to year mode', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Can toggle to year mode', (WidgetTester tester) async {
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
expect(find.text('2016'), findsNothing);
|
||||
// Navigate to the year selector and activate it
|
||||
@ -1610,7 +1611,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Can navigate next/previous months', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Can navigate next/previous months', (WidgetTester tester) async {
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
expect(find.text('January 2016'), findsOneWidget);
|
||||
// Navigate to the previous month button and activate it twice
|
||||
@ -1638,7 +1639,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Can navigate date grid with arrow keys', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Can navigate date grid with arrow keys', (WidgetTester tester) async {
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
// Navigate to the grid
|
||||
await tester.sendKeyEvent(LogicalKeyboardKey.tab);
|
||||
@ -1674,7 +1675,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('Navigating with arrow keys scrolls months', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Navigating with arrow keys scrolls months', (WidgetTester tester) async {
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
// Navigate to the grid
|
||||
await tester.sendKeyEvent(LogicalKeyboardKey.tab);
|
||||
@ -1722,7 +1723,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('RTL text direction reverses the horizontal arrow key navigation', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('RTL text direction reverses the horizontal arrow key navigation', (WidgetTester tester) async {
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
// Navigate to the grid
|
||||
await tester.sendKeyEvent(LogicalKeyboardKey.tab);
|
||||
@ -1787,49 +1788,49 @@ void main() {
|
||||
await tester.pumpAndSettle();
|
||||
}
|
||||
|
||||
testWidgets('common screen size - portrait', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('common screen size - portrait', (WidgetTester tester) async {
|
||||
await showPicker(tester, kCommonScreenSizePortrait);
|
||||
expect(tester.takeException(), isNull);
|
||||
});
|
||||
|
||||
testWidgets('common screen size - landscape', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('common screen size - landscape', (WidgetTester tester) async {
|
||||
await showPicker(tester, kCommonScreenSizeLandscape);
|
||||
expect(tester.takeException(), isNull);
|
||||
});
|
||||
|
||||
testWidgets('common screen size - portrait - textScale 1.3', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('common screen size - portrait - textScale 1.3', (WidgetTester tester) async {
|
||||
await showPicker(tester, kCommonScreenSizePortrait, 1.3);
|
||||
expect(tester.takeException(), isNull);
|
||||
});
|
||||
|
||||
testWidgets('common screen size - landscape - textScale 1.3', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('common screen size - landscape - textScale 1.3', (WidgetTester tester) async {
|
||||
await showPicker(tester, kCommonScreenSizeLandscape, 1.3);
|
||||
expect(tester.takeException(), isNull);
|
||||
});
|
||||
|
||||
testWidgets('small screen size - portrait', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('small screen size - portrait', (WidgetTester tester) async {
|
||||
await showPicker(tester, kSmallScreenSizePortrait);
|
||||
expect(tester.takeException(), isNull);
|
||||
});
|
||||
|
||||
testWidgets('small screen size - landscape', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('small screen size - landscape', (WidgetTester tester) async {
|
||||
await showPicker(tester, kSmallScreenSizeLandscape);
|
||||
expect(tester.takeException(), isNull);
|
||||
});
|
||||
|
||||
testWidgets('small screen size - portrait -textScale 1.3', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('small screen size - portrait -textScale 1.3', (WidgetTester tester) async {
|
||||
await showPicker(tester, kSmallScreenSizePortrait, 1.3);
|
||||
expect(tester.takeException(), isNull);
|
||||
});
|
||||
|
||||
testWidgets('small screen size - landscape - textScale 1.3', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('small screen size - landscape - textScale 1.3', (WidgetTester tester) async {
|
||||
await showPicker(tester, kSmallScreenSizeLandscape, 1.3);
|
||||
expect(tester.takeException(), isNull);
|
||||
});
|
||||
});
|
||||
|
||||
group('showDatePicker avoids overlapping display features', () {
|
||||
testWidgets('positioning with anchorPoint', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('positioning with anchorPoint', (WidgetTester tester) async {
|
||||
await tester.pumpWidget(
|
||||
MaterialApp(
|
||||
builder: (BuildContext context, Widget? child) {
|
||||
@ -1867,7 +1868,7 @@ void main() {
|
||||
expect(tester.getBottomRight(find.byType(DatePickerDialog)), const Offset(800.0, 600.0));
|
||||
});
|
||||
|
||||
testWidgets('positioning with Directionality', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('positioning with Directionality', (WidgetTester tester) async {
|
||||
await tester.pumpWidget(
|
||||
MaterialApp(
|
||||
builder: (BuildContext context, Widget? child) {
|
||||
@ -1907,7 +1908,7 @@ void main() {
|
||||
expect(tester.getBottomRight(find.byType(DatePickerDialog)), const Offset(800.0, 600.0));
|
||||
});
|
||||
|
||||
testWidgets('positioning with defaults', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('positioning with defaults', (WidgetTester tester) async {
|
||||
await tester.pumpWidget(
|
||||
MaterialApp(
|
||||
builder: (BuildContext context, Widget? child) {
|
||||
@ -1945,7 +1946,7 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
testWidgets('DatePickerDialog is state restorable', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('DatePickerDialog is state restorable', (WidgetTester tester) async {
|
||||
await tester.pumpWidget(
|
||||
const MaterialApp(
|
||||
restorationScopeId: 'app',
|
||||
@ -1998,7 +1999,7 @@ void main() {
|
||||
expect(find.text('30/7/2021'), findsOneWidget);
|
||||
}, skip: isBrowser); // https://github.com/flutter/flutter/issues/33615
|
||||
|
||||
testWidgets('DatePickerDialog state restoration - DatePickerEntryMode', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('DatePickerDialog state restoration - DatePickerEntryMode', (WidgetTester tester) async {
|
||||
await tester.pumpWidget(
|
||||
const MaterialApp(
|
||||
restorationScopeId: 'app',
|
||||
@ -2047,7 +2048,7 @@ void main() {
|
||||
expect(find.byIcon(Icons.edit), findsNothing);
|
||||
}, skip: isBrowser); // https://github.com/flutter/flutter/issues/33615
|
||||
|
||||
testWidgets('Test Callback on Toggle of DatePicker Mode', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Test Callback on Toggle of DatePicker Mode', (WidgetTester tester) async {
|
||||
prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
await tester.tap(find.byIcon(Icons.edit));
|
||||
expect(currentMode, DatePickerEntryMode.input);
|
||||
@ -2075,14 +2076,14 @@ void main() {
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async { }, useMaterial3: true);
|
||||
}
|
||||
|
||||
testWidgets('portrait', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('portrait', (WidgetTester tester) async {
|
||||
await showPicker(tester, kCommonScreenSizePortrait);
|
||||
expect(tester.widget<Text>(find.text('Fri, Jan 15')).style?.fontSize, 32);
|
||||
await tester.tap(find.text('Cancel'));
|
||||
await tester.pumpAndSettle();
|
||||
});
|
||||
|
||||
testWidgets('landscape', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('landscape', (WidgetTester tester) async {
|
||||
await showPicker(tester, kCommonScreenSizeLandscape);
|
||||
expect(tester.widget<Text>(find.text('Fri, Jan 15')).style?.fontSize, 24);
|
||||
await tester.tap(find.text('Cancel'));
|
||||
@ -2096,7 +2097,7 @@ void main() {
|
||||
// can be deleted.
|
||||
|
||||
group('showDatePicker Dialog', () {
|
||||
testWidgets('Default dialog size', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Default dialog size', (WidgetTester tester) async {
|
||||
Future<void> showPicker(WidgetTester tester, Size size) async {
|
||||
tester.view.physicalSize = size;
|
||||
tester.view.devicePixelRatio = 1.0;
|
||||
@ -2125,7 +2126,7 @@ void main() {
|
||||
expect(dialogContainerSize, calendarPortraitDialogSizeM2);
|
||||
});
|
||||
|
||||
testWidgets('Default dialog properties', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Default dialog properties', (WidgetTester tester) async {
|
||||
final ThemeData theme = ThemeData(useMaterial3: false);
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
final Material dialogMaterial = tester.widget<Material>(
|
||||
@ -2157,7 +2158,7 @@ void main() {
|
||||
initialEntryMode = DatePickerEntryMode.input;
|
||||
});
|
||||
|
||||
testWidgets('Default InputDecoration', (WidgetTester tester) async {
|
||||
testWidgetsWithLeakTracking('Default InputDecoration', (WidgetTester tester) async {
|
||||
await prepareDatePicker(tester, (Future<DateTime?> date) async {
|
||||
final InputDecoration decoration = tester.widget<TextField>(
|
||||
find.byType(TextField)).decoration!;
|
||||
@ -2201,6 +2202,13 @@ class _RestorableDatePickerDialogTestWidgetState extends State<_RestorableDatePi
|
||||
},
|
||||
);
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_selectedDate.dispose();
|
||||
_restorableDatePickerRouteFuture.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
void restoreState(RestorationBucket? oldBucket, bool initialRestore) {
|
||||
registerForRestoration(_selectedDate, 'selected_date');
|
||||
|
Loading…
Reference in New Issue
Block a user