Revert "Proposal to add barrier configs for showDatePicker, showTimePicker and showAboutDialog." (#131278)
Reverts flutter/flutter#130484. /cc @ronnnnn Example failure: https://ci.chromium.org/ui/p/flutter/builders/prod/Mac%20framework_tests_libraries/12185/overview <details> <summary>Failure logs...</summary> ``` 04:51 +5379 ~18: /Volumes/Work/s/w/ir/x/w/flutter/packages/flutter/test/material/about_test.dart: Barrier dismissible Barrier is dismissible with default parameter âââ¡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK âââââââââââââââââââââââââââââââââââââââââââââââââââââ The following TestFailure was thrown running a test: Expected: <1> Actual: <2> When the exception was thrown, this was the stack: #4 main.<anonymous closure>.<anonymous closure> (file:///Volumes/Work/s/w/ir/x/w/flutter/packages/flutter/test/material/about_test.dart:776:7) <asynchronous suspension> #5 testWidgets.<anonymous closure>.<anonymous closure> (package:flutter_test/src/widget_tester.dart:165:15) <asynchronous suspension> #6 TestWidgetsFlutterBinding._runTestBody (package:flutter_test/src/binding.dart:1008:5) <asynchronous suspension> <asynchronous suspension> (elided one frame from package:stack_trace) This was caught by the test expectation on the following line: file:///Volumes/Work/s/w/ir/x/w/flutter/packages/flutter/test/material/about_test.dart line 776 The test description was: Barrier is dismissible with default parameter ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ 04:51 +5379 ~18 -1: /Volumes/Work/s/w/ir/x/w/flutter/packages/flutter/test/material/about_test.dart: Barrier dismissible Barrier is dismissible with default parameter [E] Test failed. See exception logs above. The test description was: Barrier is dismissible with default parameter To run this test again: /Volumes/Work/s/w/ir/x/w/flutter/bin/cache/dart-sdk/bin/dart test /Volumes/Work/s/w/ir/x/w/flutter/packages/flutter/test/material/about_test.dart -p vm --plain-name 'Barrier dismissible Barrier is dismissible with default parameter' ``` </details>
This commit is contained in:
parent
2da3bdd472
commit
300c5d8285
@ -170,9 +170,9 @@ class AboutListTile extends StatelessWidget {
|
|||||||
/// The licenses shown on the [LicensePage] are those returned by the
|
/// The licenses shown on the [LicensePage] are those returned by the
|
||||||
/// [LicenseRegistry] API, which can be used to add more licenses to the list.
|
/// [LicenseRegistry] API, which can be used to add more licenses to the list.
|
||||||
///
|
///
|
||||||
/// The [context], [barrierDismissible], [barrierColor], [barrierLabel],
|
/// The [context], [useRootNavigator], [routeSettings] and [anchorPoint]
|
||||||
/// [useRootNavigator], [routeSettings] and [anchorPoint] arguments are
|
/// arguments are passed to [showDialog], the documentation for which discusses
|
||||||
/// passed to [showDialog], the documentation for which discusses how it is used.
|
/// how it is used.
|
||||||
void showAboutDialog({
|
void showAboutDialog({
|
||||||
required BuildContext context,
|
required BuildContext context,
|
||||||
String? applicationName,
|
String? applicationName,
|
||||||
@ -180,18 +180,12 @@ void showAboutDialog({
|
|||||||
Widget? applicationIcon,
|
Widget? applicationIcon,
|
||||||
String? applicationLegalese,
|
String? applicationLegalese,
|
||||||
List<Widget>? children,
|
List<Widget>? children,
|
||||||
bool barrierDismissible = true,
|
|
||||||
Color? barrierColor,
|
|
||||||
String? barrierLabel,
|
|
||||||
bool useRootNavigator = true,
|
bool useRootNavigator = true,
|
||||||
RouteSettings? routeSettings,
|
RouteSettings? routeSettings,
|
||||||
Offset? anchorPoint,
|
Offset? anchorPoint,
|
||||||
}) {
|
}) {
|
||||||
showDialog<void>(
|
showDialog<void>(
|
||||||
context: context,
|
context: context,
|
||||||
barrierDismissible: barrierDismissible,
|
|
||||||
barrierColor: barrierColor,
|
|
||||||
barrierLabel: barrierLabel,
|
|
||||||
useRootNavigator: useRootNavigator,
|
useRootNavigator: useRootNavigator,
|
||||||
builder: (BuildContext context) {
|
builder: (BuildContext context) {
|
||||||
return AboutDialog(
|
return AboutDialog(
|
||||||
|
@ -113,10 +113,9 @@ const double _kMaxTextScaleFactor = 1.3;
|
|||||||
/// [locale] and [textDirection] are non-null, [textDirection] overrides the
|
/// [locale] and [textDirection] are non-null, [textDirection] overrides the
|
||||||
/// direction chosen for the [locale].
|
/// direction chosen for the [locale].
|
||||||
///
|
///
|
||||||
/// The [context], [barrierDismissible], [barrierColor], [barrierLabel],
|
/// The [context], [useRootNavigator] and [routeSettings] arguments are passed to
|
||||||
/// [useRootNavigator] and [routeSettings] arguments are passed to [showDialog],
|
/// [showDialog], the documentation for which discusses how it is used. [context]
|
||||||
/// the documentation for which discusses how it is used.
|
/// and [useRootNavigator] must be non-null.
|
||||||
/// [context], [barrierDismissible] and [useRootNavigator] must be non-null.
|
|
||||||
///
|
///
|
||||||
/// The [builder] parameter can be used to wrap the dialog widget
|
/// The [builder] parameter can be used to wrap the dialog widget
|
||||||
/// to add inherited widgets like [Theme].
|
/// to add inherited widgets like [Theme].
|
||||||
@ -170,9 +169,6 @@ Future<DateTime?> showDatePicker({
|
|||||||
String? cancelText,
|
String? cancelText,
|
||||||
String? confirmText,
|
String? confirmText,
|
||||||
Locale? locale,
|
Locale? locale,
|
||||||
bool barrierDismissible = true,
|
|
||||||
Color? barrierColor,
|
|
||||||
String? barrierLabel,
|
|
||||||
bool useRootNavigator = true,
|
bool useRootNavigator = true,
|
||||||
RouteSettings? routeSettings,
|
RouteSettings? routeSettings,
|
||||||
TextDirection? textDirection,
|
TextDirection? textDirection,
|
||||||
@ -247,9 +243,6 @@ Future<DateTime?> showDatePicker({
|
|||||||
|
|
||||||
return showDialog<DateTime>(
|
return showDialog<DateTime>(
|
||||||
context: context,
|
context: context,
|
||||||
barrierDismissible: barrierDismissible,
|
|
||||||
barrierColor: barrierColor,
|
|
||||||
barrierLabel: barrierLabel,
|
|
||||||
useRootNavigator: useRootNavigator,
|
useRootNavigator: useRootNavigator,
|
||||||
routeSettings: routeSettings,
|
routeSettings: routeSettings,
|
||||||
builder: (BuildContext context) {
|
builder: (BuildContext context) {
|
||||||
@ -974,10 +967,9 @@ class _DatePickerHeader extends StatelessWidget {
|
|||||||
/// [locale] and [textDirection] are non-null, [textDirection] overrides the
|
/// [locale] and [textDirection] are non-null, [textDirection] overrides the
|
||||||
/// direction chosen for the [locale].
|
/// direction chosen for the [locale].
|
||||||
///
|
///
|
||||||
/// The [context], [barrierDismissible], [barrierColor], [barrierLabel],
|
/// The [context], [useRootNavigator] and [routeSettings] arguments are passed
|
||||||
/// [useRootNavigator] and [routeSettings] arguments are passed to [showDialog],
|
/// to [showDialog], the documentation for which discusses how it is used.
|
||||||
/// the documentation for which discusses how it is used.
|
/// [context] and [useRootNavigator] must be non-null.
|
||||||
/// [context], [barrierDismissible] and [useRootNavigator] must be non-null.
|
|
||||||
///
|
///
|
||||||
/// The [builder] parameter can be used to wrap the dialog widget
|
/// The [builder] parameter can be used to wrap the dialog widget
|
||||||
/// to add inherited widgets like [Theme].
|
/// to add inherited widgets like [Theme].
|
||||||
@ -1030,9 +1022,6 @@ Future<DateTimeRange?> showDateRangePicker({
|
|||||||
String? fieldStartLabelText,
|
String? fieldStartLabelText,
|
||||||
String? fieldEndLabelText,
|
String? fieldEndLabelText,
|
||||||
Locale? locale,
|
Locale? locale,
|
||||||
bool barrierDismissible = true,
|
|
||||||
Color? barrierColor,
|
|
||||||
String? barrierLabel,
|
|
||||||
bool useRootNavigator = true,
|
bool useRootNavigator = true,
|
||||||
RouteSettings? routeSettings,
|
RouteSettings? routeSettings,
|
||||||
TextDirection? textDirection,
|
TextDirection? textDirection,
|
||||||
@ -1111,9 +1100,6 @@ Future<DateTimeRange?> showDateRangePicker({
|
|||||||
|
|
||||||
return showDialog<DateTimeRange>(
|
return showDialog<DateTimeRange>(
|
||||||
context: context,
|
context: context,
|
||||||
barrierDismissible: barrierDismissible,
|
|
||||||
barrierColor: barrierColor,
|
|
||||||
barrierLabel: barrierLabel,
|
|
||||||
useRootNavigator: useRootNavigator,
|
useRootNavigator: useRootNavigator,
|
||||||
routeSettings: routeSettings,
|
routeSettings: routeSettings,
|
||||||
useSafeArea: false,
|
useSafeArea: false,
|
||||||
|
@ -1404,7 +1404,7 @@ Future<T?> showDialog<T>({
|
|||||||
required BuildContext context,
|
required BuildContext context,
|
||||||
required WidgetBuilder builder,
|
required WidgetBuilder builder,
|
||||||
bool barrierDismissible = true,
|
bool barrierDismissible = true,
|
||||||
Color? barrierColor,
|
Color? barrierColor = Colors.black54,
|
||||||
String? barrierLabel,
|
String? barrierLabel,
|
||||||
bool useSafeArea = true,
|
bool useSafeArea = true,
|
||||||
bool useRootNavigator = true,
|
bool useRootNavigator = true,
|
||||||
@ -1426,7 +1426,7 @@ Future<T?> showDialog<T>({
|
|||||||
return Navigator.of(context, rootNavigator: useRootNavigator).push<T>(DialogRoute<T>(
|
return Navigator.of(context, rootNavigator: useRootNavigator).push<T>(DialogRoute<T>(
|
||||||
context: context,
|
context: context,
|
||||||
builder: builder,
|
builder: builder,
|
||||||
barrierColor: barrierColor ?? Colors.black54,
|
barrierColor: barrierColor,
|
||||||
barrierDismissible: barrierDismissible,
|
barrierDismissible: barrierDismissible,
|
||||||
barrierLabel: barrierLabel,
|
barrierLabel: barrierLabel,
|
||||||
useSafeArea: useSafeArea,
|
useSafeArea: useSafeArea,
|
||||||
@ -1449,7 +1449,7 @@ Future<T?> showAdaptiveDialog<T>({
|
|||||||
required BuildContext context,
|
required BuildContext context,
|
||||||
required WidgetBuilder builder,
|
required WidgetBuilder builder,
|
||||||
bool? barrierDismissible,
|
bool? barrierDismissible,
|
||||||
Color? barrierColor,
|
Color? barrierColor = Colors.black54,
|
||||||
String? barrierLabel,
|
String? barrierLabel,
|
||||||
bool useSafeArea = true,
|
bool useSafeArea = true,
|
||||||
bool useRootNavigator = true,
|
bool useRootNavigator = true,
|
||||||
|
@ -2874,9 +2874,8 @@ class _TimePickerState extends State<_TimePicker> with RestorationMixin {
|
|||||||
/// ```
|
/// ```
|
||||||
/// {@end-tool}
|
/// {@end-tool}
|
||||||
///
|
///
|
||||||
/// The [context], [barrierDismissible], [barrierColor], [barrierLabel],
|
/// The [context], [useRootNavigator] and [routeSettings] arguments are passed
|
||||||
/// [useRootNavigator] and [routeSettings] arguments are passed to [showDialog],
|
/// to [showDialog], the documentation for which discusses how it is used.
|
||||||
/// the documentation for which discusses how it is used.
|
|
||||||
///
|
///
|
||||||
/// The [builder] parameter can be used to wrap the dialog widget to add
|
/// The [builder] parameter can be used to wrap the dialog widget to add
|
||||||
/// inherited widgets like [Localizations.override], [Directionality], or
|
/// inherited widgets like [Localizations.override], [Directionality], or
|
||||||
@ -2955,9 +2954,6 @@ Future<TimeOfDay?> showTimePicker({
|
|||||||
required BuildContext context,
|
required BuildContext context,
|
||||||
required TimeOfDay initialTime,
|
required TimeOfDay initialTime,
|
||||||
TransitionBuilder? builder,
|
TransitionBuilder? builder,
|
||||||
bool barrierDismissible = true,
|
|
||||||
Color? barrierColor,
|
|
||||||
String? barrierLabel,
|
|
||||||
bool useRootNavigator = true,
|
bool useRootNavigator = true,
|
||||||
TimePickerEntryMode initialEntryMode = TimePickerEntryMode.dial,
|
TimePickerEntryMode initialEntryMode = TimePickerEntryMode.dial,
|
||||||
String? cancelText,
|
String? cancelText,
|
||||||
@ -2987,9 +2983,6 @@ Future<TimeOfDay?> showTimePicker({
|
|||||||
);
|
);
|
||||||
return showDialog<TimeOfDay>(
|
return showDialog<TimeOfDay>(
|
||||||
context: context,
|
context: context,
|
||||||
barrierDismissible: barrierDismissible,
|
|
||||||
barrierColor: barrierColor,
|
|
||||||
barrierLabel: barrierLabel,
|
|
||||||
useRootNavigator: useRootNavigator,
|
useRootNavigator: useRootNavigator,
|
||||||
builder: (BuildContext context) {
|
builder: (BuildContext context) {
|
||||||
return builder == null ? dialog : builder(context, dialog);
|
return builder == null ? dialog : builder(context, dialog);
|
||||||
|
@ -742,160 +742,6 @@ void main() {
|
|||||||
expect(nestedObserver.licensePageCount, 0);
|
expect(nestedObserver.licensePageCount, 0);
|
||||||
});
|
});
|
||||||
|
|
||||||
group('Barrier dismissible', () {
|
|
||||||
late AboutDialogObserver rootObserver;
|
|
||||||
|
|
||||||
setUpAll(() {
|
|
||||||
rootObserver = AboutDialogObserver();
|
|
||||||
});
|
|
||||||
|
|
||||||
testWidgets('Barrier is dismissible with default parameter', (WidgetTester tester) async {
|
|
||||||
await tester.pumpWidget(
|
|
||||||
MaterialApp(
|
|
||||||
navigatorObservers: <NavigatorObserver>[rootObserver],
|
|
||||||
home: Material(
|
|
||||||
child: Center(
|
|
||||||
child: Builder(
|
|
||||||
builder: (BuildContext context) {
|
|
||||||
return ElevatedButton(
|
|
||||||
child: const Text('X'),
|
|
||||||
onPressed: () => showAboutDialog(
|
|
||||||
context: context,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
// Open the dialog.
|
|
||||||
await tester.tap(find.byType(ElevatedButton));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
expect(rootObserver.dialogCount, 1);
|
|
||||||
|
|
||||||
// Tap on the barrier.
|
|
||||||
await tester.tapAt(const Offset(10.0, 10.0));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
expect(rootObserver.dialogCount, 0);
|
|
||||||
});
|
|
||||||
|
|
||||||
testWidgets('Barrier is not dismissible with barrierDismissible is false', (WidgetTester tester) async {
|
|
||||||
await tester.pumpWidget(
|
|
||||||
MaterialApp(
|
|
||||||
navigatorObservers: <NavigatorObserver>[rootObserver],
|
|
||||||
home: Material(
|
|
||||||
child: Center(
|
|
||||||
child: Builder(
|
|
||||||
builder: (BuildContext context) {
|
|
||||||
return ElevatedButton(
|
|
||||||
child: const Text('X'),
|
|
||||||
onPressed: () => showAboutDialog(
|
|
||||||
context: context,
|
|
||||||
barrierDismissible: false
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
// Open the dialog.
|
|
||||||
await tester.tap(find.byType(ElevatedButton));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
expect(rootObserver.dialogCount, 1);
|
|
||||||
|
|
||||||
// Tap on the barrier, which shouldn't do anything this time.
|
|
||||||
await tester.tapAt(const Offset(10.0, 10.0));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
expect(rootObserver.dialogCount, 1);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
testWidgets('Barrier color', (WidgetTester tester) async {
|
|
||||||
await tester.pumpWidget(
|
|
||||||
MaterialApp(
|
|
||||||
home: Material(
|
|
||||||
child: Center(
|
|
||||||
child: Builder(
|
|
||||||
builder: (BuildContext context) {
|
|
||||||
return ElevatedButton(
|
|
||||||
child: const Text('X'),
|
|
||||||
onPressed: () => showAboutDialog(
|
|
||||||
context: context,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
// Open the dialog.
|
|
||||||
await tester.tap(find.byType(ElevatedButton));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
expect(tester.widget<ModalBarrier>(find.byType(ModalBarrier).last).color, Colors.black54);
|
|
||||||
|
|
||||||
// Dismiss the dialog.
|
|
||||||
await tester.tapAt(const Offset(10.0, 10.0));
|
|
||||||
|
|
||||||
await tester.pumpWidget(
|
|
||||||
MaterialApp(
|
|
||||||
home: Material(
|
|
||||||
child: Center(
|
|
||||||
child: Builder(
|
|
||||||
builder: (BuildContext context) {
|
|
||||||
return ElevatedButton(
|
|
||||||
child: const Text('X'),
|
|
||||||
onPressed: () => showAboutDialog(
|
|
||||||
context: context,
|
|
||||||
barrierColor: Colors.pink,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
// Open the dialog.
|
|
||||||
await tester.tap(find.byType(ElevatedButton));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
expect(tester.widget<ModalBarrier>(find.byType(ModalBarrier).last).color, Colors.pink);
|
|
||||||
});
|
|
||||||
|
|
||||||
testWidgets('Barrier Label', (WidgetTester tester) async {
|
|
||||||
await tester.pumpWidget(
|
|
||||||
MaterialApp(
|
|
||||||
home: Material(
|
|
||||||
child: Center(
|
|
||||||
child: Builder(
|
|
||||||
builder: (BuildContext context) {
|
|
||||||
return ElevatedButton(
|
|
||||||
child: const Text('X'),
|
|
||||||
onPressed: () => showAboutDialog(
|
|
||||||
context: context,
|
|
||||||
barrierLabel: 'Custom Label',
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
// Open the dialog.
|
|
||||||
await tester.tap(find.byType(ElevatedButton));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
expect(tester.widget<ModalBarrier>(find.byType(ModalBarrier).last).semanticsLabel, 'Custom Label');
|
|
||||||
});
|
|
||||||
|
|
||||||
testWidgetsWithLeakTracking('showAboutDialog uses root navigator by default', (WidgetTester tester) async {
|
testWidgetsWithLeakTracking('showAboutDialog uses root navigator by default', (WidgetTester tester) async {
|
||||||
final AboutDialogObserver rootObserver = AboutDialogObserver();
|
final AboutDialogObserver rootObserver = AboutDialogObserver();
|
||||||
final AboutDialogObserver nestedObserver = AboutDialogObserver();
|
final AboutDialogObserver nestedObserver = AboutDialogObserver();
|
||||||
@ -1895,12 +1741,4 @@ class AboutDialogObserver extends NavigatorObserver {
|
|||||||
}
|
}
|
||||||
super.didPush(route, previousRoute);
|
super.didPush(route, previousRoute);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
void didPop(Route<dynamic> route, Route<dynamic>? previousRoute) {
|
|
||||||
if (route is DialogRoute) {
|
|
||||||
dialogCount--;
|
|
||||||
}
|
|
||||||
super.didPop(route, previousRoute);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -335,190 +335,6 @@ void main() {
|
|||||||
expect(tester.getBottomLeft(find.text('OK')).dx, 800 - ltrOkRight);
|
expect(tester.getBottomLeft(find.text('OK')).dx, 800 - ltrOkRight);
|
||||||
});
|
});
|
||||||
|
|
||||||
group('Barrier dismissible', () {
|
|
||||||
late _DatePickerObserver rootObserver;
|
|
||||||
|
|
||||||
setUpAll(() {
|
|
||||||
rootObserver = _DatePickerObserver();
|
|
||||||
});
|
|
||||||
|
|
||||||
testWidgets('Barrier is dismissible with default parameter', (WidgetTester tester) async {
|
|
||||||
await tester.pumpWidget(
|
|
||||||
MaterialApp(
|
|
||||||
navigatorObservers: <NavigatorObserver>[rootObserver],
|
|
||||||
home: Material(
|
|
||||||
child: Center(
|
|
||||||
child: Builder(
|
|
||||||
builder: (BuildContext context) {
|
|
||||||
return ElevatedButton(
|
|
||||||
child: const Text('X'),
|
|
||||||
onPressed: () =>
|
|
||||||
showDatePicker(
|
|
||||||
context: context,
|
|
||||||
initialDate: DateTime.now(),
|
|
||||||
firstDate: DateTime(2018),
|
|
||||||
lastDate: DateTime(2030),
|
|
||||||
builder: (BuildContext context,
|
|
||||||
Widget? child) => const SizedBox(),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
// Open the dialog.
|
|
||||||
await tester.tap(find.byType(ElevatedButton));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
expect(rootObserver.datePickerCount, 1);
|
|
||||||
|
|
||||||
// Tap on the barrier.
|
|
||||||
await tester.tapAt(const Offset(10.0, 10.0));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
expect(rootObserver.datePickerCount, 0);
|
|
||||||
});
|
|
||||||
|
|
||||||
testWidgets('Barrier is not dismissible with barrierDismissible is false', (WidgetTester tester) async {
|
|
||||||
await tester.pumpWidget(
|
|
||||||
MaterialApp(
|
|
||||||
navigatorObservers: <NavigatorObserver>[rootObserver],
|
|
||||||
home: Material(
|
|
||||||
child: Center(
|
|
||||||
child: Builder(
|
|
||||||
builder: (BuildContext context) {
|
|
||||||
return ElevatedButton(
|
|
||||||
child: const Text('X'),
|
|
||||||
onPressed: () =>
|
|
||||||
showDatePicker(
|
|
||||||
context: context,
|
|
||||||
initialDate: DateTime.now(),
|
|
||||||
firstDate: DateTime(2018),
|
|
||||||
lastDate: DateTime(2030),
|
|
||||||
barrierDismissible: false,
|
|
||||||
builder: (BuildContext context,
|
|
||||||
Widget? child) => const SizedBox(),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
// Open the dialog.
|
|
||||||
await tester.tap(find.byType(ElevatedButton));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
expect(rootObserver.datePickerCount, 1);
|
|
||||||
|
|
||||||
// Tap on the barrier, which shouldn't do anything this time.
|
|
||||||
await tester.tapAt(const Offset(10.0, 10.0));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
expect(rootObserver.datePickerCount, 1);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
testWidgets('Barrier color', (WidgetTester tester) async {
|
|
||||||
await tester.pumpWidget(
|
|
||||||
MaterialApp(
|
|
||||||
home: Material(
|
|
||||||
child: Center(
|
|
||||||
child: Builder(
|
|
||||||
builder: (BuildContext context) {
|
|
||||||
return ElevatedButton(
|
|
||||||
child: const Text('X'),
|
|
||||||
onPressed: () =>
|
|
||||||
showDatePicker(
|
|
||||||
context: context,
|
|
||||||
initialDate: DateTime.now(),
|
|
||||||
firstDate: DateTime(2018),
|
|
||||||
lastDate: DateTime(2030),
|
|
||||||
builder: (BuildContext context,
|
|
||||||
Widget? child) => const SizedBox(),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
// Open the dialog.
|
|
||||||
await tester.tap(find.byType(ElevatedButton));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
expect(tester.widget<ModalBarrier>(find.byType(ModalBarrier).last).color, Colors.black54);
|
|
||||||
|
|
||||||
// Dismiss the dialog.
|
|
||||||
await tester.tapAt(const Offset(10.0, 10.0));
|
|
||||||
|
|
||||||
await tester.pumpWidget(
|
|
||||||
MaterialApp(
|
|
||||||
home: Material(
|
|
||||||
child: Center(
|
|
||||||
child: Builder(
|
|
||||||
builder: (BuildContext context) {
|
|
||||||
return ElevatedButton(
|
|
||||||
child: const Text('X'),
|
|
||||||
onPressed: () =>
|
|
||||||
showDatePicker(
|
|
||||||
context: context,
|
|
||||||
barrierColor: Colors.pink,
|
|
||||||
initialDate: DateTime.now(),
|
|
||||||
firstDate: DateTime(2018),
|
|
||||||
lastDate: DateTime(2030),
|
|
||||||
builder: (BuildContext context,
|
|
||||||
Widget? child) => const SizedBox(),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
// Open the dialog.
|
|
||||||
await tester.tap(find.byType(ElevatedButton));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
expect(tester.widget<ModalBarrier>(find.byType(ModalBarrier).last).color, Colors.pink);
|
|
||||||
});
|
|
||||||
|
|
||||||
testWidgets('Barrier Label', (WidgetTester tester) async {
|
|
||||||
await tester.pumpWidget(
|
|
||||||
MaterialApp(
|
|
||||||
home: Material(
|
|
||||||
child: Center(
|
|
||||||
child: Builder(
|
|
||||||
builder: (BuildContext context) {
|
|
||||||
return ElevatedButton(
|
|
||||||
child: const Text('X'),
|
|
||||||
onPressed: () =>
|
|
||||||
showDatePicker(
|
|
||||||
context: context,
|
|
||||||
barrierLabel: 'Custom Label',
|
|
||||||
initialDate: DateTime.now(),
|
|
||||||
firstDate: DateTime(2018),
|
|
||||||
lastDate: DateTime(2030),
|
|
||||||
builder: (BuildContext context,
|
|
||||||
Widget? child) => const SizedBox(),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
// Open the dialog.
|
|
||||||
await tester.tap(find.byType(ElevatedButton));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
expect(tester.widget<ModalBarrier>(find.byType(ModalBarrier).last).semanticsLabel, 'Custom Label');
|
|
||||||
});
|
|
||||||
|
|
||||||
testWidgets('uses nested navigator if useRootNavigator is false', (WidgetTester tester) async {
|
testWidgets('uses nested navigator if useRootNavigator is false', (WidgetTester tester) async {
|
||||||
final _DatePickerObserver rootObserver = _DatePickerObserver();
|
final _DatePickerObserver rootObserver = _DatePickerObserver();
|
||||||
final _DatePickerObserver nestedObserver = _DatePickerObserver();
|
final _DatePickerObserver nestedObserver = _DatePickerObserver();
|
||||||
@ -2219,12 +2035,4 @@ class _DatePickerObserver extends NavigatorObserver {
|
|||||||
}
|
}
|
||||||
super.didPush(route, previousRoute);
|
super.didPush(route, previousRoute);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
void didPop(Route<dynamic> route, Route<dynamic>? previousRoute) {
|
|
||||||
if (route is DialogRoute) {
|
|
||||||
datePickerCount--;
|
|
||||||
}
|
|
||||||
super.didPop(route, previousRoute);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -668,167 +668,6 @@ void main() {
|
|||||||
expect(tester.getBottomLeft(find.text(okString)).dx, 800 - ltrOkRight);
|
expect(tester.getBottomLeft(find.text(okString)).dx, 800 - ltrOkRight);
|
||||||
});
|
});
|
||||||
|
|
||||||
group('Barrier dismissible', () {
|
|
||||||
late PickerObserver rootObserver;
|
|
||||||
|
|
||||||
setUpAll(() {
|
|
||||||
rootObserver = PickerObserver();
|
|
||||||
});
|
|
||||||
|
|
||||||
testWidgets('Barrier is dismissible with default parameter', (WidgetTester tester) async {
|
|
||||||
await tester.pumpWidget(
|
|
||||||
MaterialApp(
|
|
||||||
navigatorObservers: <NavigatorObserver>[rootObserver],
|
|
||||||
home: Material(
|
|
||||||
child: Center(
|
|
||||||
child: Builder(
|
|
||||||
builder: (BuildContext context) {
|
|
||||||
return ElevatedButton(
|
|
||||||
child: const Text('X'),
|
|
||||||
onPressed: () =>
|
|
||||||
showTimePicker(
|
|
||||||
context: context,
|
|
||||||
initialTime: const TimeOfDay(hour: 7, minute: 0),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
// Open the dialog.
|
|
||||||
await tester.tap(find.byType(ElevatedButton));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
expect(rootObserver.pickerCount, 1);
|
|
||||||
|
|
||||||
// Tap on the barrier.
|
|
||||||
await tester.tapAt(const Offset(10.0, 10.0));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
expect(rootObserver.pickerCount, 0);
|
|
||||||
});
|
|
||||||
|
|
||||||
testWidgets('Barrier is not dismissible with barrierDismissible is false', (WidgetTester tester) async {
|
|
||||||
await tester.pumpWidget(
|
|
||||||
MaterialApp(
|
|
||||||
navigatorObservers: <NavigatorObserver>[rootObserver],
|
|
||||||
home: Material(
|
|
||||||
child: Center(
|
|
||||||
child: Builder(
|
|
||||||
builder: (BuildContext context) {
|
|
||||||
return ElevatedButton(
|
|
||||||
child: const Text('X'),
|
|
||||||
onPressed: () =>
|
|
||||||
showTimePicker(
|
|
||||||
context: context,
|
|
||||||
barrierDismissible: false,
|
|
||||||
initialTime: const TimeOfDay(hour: 7, minute: 0),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
// Open the dialog.
|
|
||||||
await tester.tap(find.byType(ElevatedButton));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
expect(rootObserver.pickerCount, 1);
|
|
||||||
|
|
||||||
// Tap on the barrier, which shouldn't do anything this time.
|
|
||||||
await tester.tapAt(const Offset(10.0, 10.0));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
expect(rootObserver.pickerCount, 1);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
testWidgets('Barrier color', (WidgetTester tester) async {
|
|
||||||
await tester.pumpWidget(
|
|
||||||
MaterialApp(
|
|
||||||
home: Material(
|
|
||||||
child: Center(
|
|
||||||
child: Builder(
|
|
||||||
builder: (BuildContext context) {
|
|
||||||
return ElevatedButton(
|
|
||||||
child: const Text('X'),
|
|
||||||
onPressed: () => showTimePicker(
|
|
||||||
context: context,
|
|
||||||
initialTime: const TimeOfDay(hour: 7, minute: 0),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
// Open the dialog.
|
|
||||||
await tester.tap(find.byType(ElevatedButton));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
expect(tester.widget<ModalBarrier>(find.byType(ModalBarrier).last).color, Colors.black54);
|
|
||||||
|
|
||||||
// Dismiss the dialog.
|
|
||||||
await tester.tapAt(const Offset(10.0, 10.0));
|
|
||||||
|
|
||||||
await tester.pumpWidget(
|
|
||||||
MaterialApp(
|
|
||||||
home: Material(
|
|
||||||
child: Center(
|
|
||||||
child: Builder(
|
|
||||||
builder: (BuildContext context) {
|
|
||||||
return ElevatedButton(
|
|
||||||
child: const Text('X'),
|
|
||||||
onPressed: () => showTimePicker(
|
|
||||||
context: context,
|
|
||||||
barrierColor: Colors.pink,
|
|
||||||
initialTime: const TimeOfDay(hour: 7, minute: 0),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
// Open the dialog.
|
|
||||||
await tester.tap(find.byType(ElevatedButton));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
expect(tester.widget<ModalBarrier>(find.byType(ModalBarrier).last).color, Colors.pink);
|
|
||||||
});
|
|
||||||
|
|
||||||
testWidgets('Barrier Label', (WidgetTester tester) async {
|
|
||||||
await tester.pumpWidget(
|
|
||||||
MaterialApp(
|
|
||||||
home: Material(
|
|
||||||
child: Center(
|
|
||||||
child: Builder(
|
|
||||||
builder: (BuildContext context) {
|
|
||||||
return ElevatedButton(
|
|
||||||
child: const Text('X'),
|
|
||||||
onPressed: () => showTimePicker(
|
|
||||||
context: context,
|
|
||||||
barrierLabel: 'Custom Label',
|
|
||||||
initialTime: const TimeOfDay(hour: 7, minute: 0),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
// Open the dialog.
|
|
||||||
await tester.tap(find.byType(ElevatedButton));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
expect(tester.widget<ModalBarrier>(find.byType(ModalBarrier).last).semanticsLabel, 'Custom Label');
|
|
||||||
});
|
|
||||||
|
|
||||||
testWidgets('uses root navigator by default', (WidgetTester tester) async {
|
testWidgets('uses root navigator by default', (WidgetTester tester) async {
|
||||||
final PickerObserver rootObserver = PickerObserver();
|
final PickerObserver rootObserver = PickerObserver();
|
||||||
final PickerObserver nestedObserver = PickerObserver();
|
final PickerObserver nestedObserver = PickerObserver();
|
||||||
@ -1968,14 +1807,6 @@ class PickerObserver extends NavigatorObserver {
|
|||||||
}
|
}
|
||||||
super.didPush(route, previousRoute);
|
super.didPush(route, previousRoute);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
void didPop(Route<dynamic> route, Route<dynamic>? previousRoute) {
|
|
||||||
if (route is DialogRoute) {
|
|
||||||
pickerCount--;
|
|
||||||
}
|
|
||||||
super.didPop(route, previousRoute);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> mediaQueryBoilerplate(
|
Future<void> mediaQueryBoilerplate(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user