From 11d21e066b576f8117af315db55100058226cc49 Mon Sep 17 00:00:00 2001 From: Michael Goderbauer Date: Wed, 18 Jan 2023 14:56:24 -0800 Subject: [PATCH] Add @pragma('vm:entry-point') to RestorableRouteBuilder arguments (#118738) --- .../lib/cupertino/route/show_cupertino_dialog.0.dart | 1 + .../route/show_cupertino_modal_popup.0.dart | 1 + .../lib/material/date_picker/show_date_picker.0.dart | 1 + .../date_picker/show_date_range_picker.0.dart | 1 + examples/api/lib/material/dialog/show_dialog.2.dart | 1 + .../navigator/navigator.restorable_push.0.dart | 1 + ...navigator.restorable_push_and_remove_until.0.dart | 1 + .../navigator.restorable_push_replacement.0.dart | 1 + .../navigator/navigator_state.restorable_push.0.dart | 1 + ...tor_state.restorable_push_and_remove_until.0.dart | 1 + ...avigator_state.restorable_push_replacement.0.dart | 1 + .../widgets/navigator/restorable_route_future.0.dart | 1 + .../lib/widgets/routes/show_general_dialog.0.dart | 1 + packages/flutter/lib/src/widgets/navigator.dart | 12 +++++++----- packages/flutter/test/cupertino/dialog_test.dart | 1 + packages/flutter/test/cupertino/route_test.dart | 1 + packages/flutter/test/material/date_picker_test.dart | 1 + .../test/material/date_range_picker_test.dart | 1 + packages/flutter/test/material/dialog_test.dart | 1 + packages/flutter/test/material/time_picker_test.dart | 1 + .../test/widgets/navigator_restoration_test.dart | 2 ++ packages/flutter/test/widgets/routes_test.dart | 1 + 22 files changed, 29 insertions(+), 5 deletions(-) diff --git a/examples/api/lib/cupertino/route/show_cupertino_dialog.0.dart b/examples/api/lib/cupertino/route/show_cupertino_dialog.0.dart index 1f68bcd645dd..a846728260b5 100644 --- a/examples/api/lib/cupertino/route/show_cupertino_dialog.0.dart +++ b/examples/api/lib/cupertino/route/show_cupertino_dialog.0.dart @@ -41,6 +41,7 @@ class CupertinoDialogExample extends StatelessWidget { ); } + @pragma('vm:entry-point') static Route _dialogBuilder( BuildContext context, Object? arguments) { return CupertinoDialogRoute( diff --git a/examples/api/lib/cupertino/route/show_cupertino_modal_popup.0.dart b/examples/api/lib/cupertino/route/show_cupertino_modal_popup.0.dart index 3f263122df1e..60cd006d7219 100644 --- a/examples/api/lib/cupertino/route/show_cupertino_modal_popup.0.dart +++ b/examples/api/lib/cupertino/route/show_cupertino_modal_popup.0.dart @@ -41,6 +41,7 @@ class ModalPopupExample extends StatelessWidget { ); } + @pragma('vm:entry-point') static Route _modalBuilder(BuildContext context, Object? arguments) { return CupertinoModalPopupRoute( builder: (BuildContext context) { diff --git a/examples/api/lib/material/date_picker/show_date_picker.0.dart b/examples/api/lib/material/date_picker/show_date_picker.0.dart index 2fdb4970e759..ab2cdc305b9c 100644 --- a/examples/api/lib/material/date_picker/show_date_picker.0.dart +++ b/examples/api/lib/material/date_picker/show_date_picker.0.dart @@ -53,6 +53,7 @@ class _MyStatefulWidgetState extends State }, ); + @pragma('vm:entry-point') static Route _datePickerRoute( BuildContext context, Object? arguments, diff --git a/examples/api/lib/material/date_picker/show_date_range_picker.0.dart b/examples/api/lib/material/date_picker/show_date_range_picker.0.dart index f7cfa9c0dbc9..ef4b6d4d01f8 100644 --- a/examples/api/lib/material/date_picker/show_date_range_picker.0.dart +++ b/examples/api/lib/material/date_picker/show_date_range_picker.0.dart @@ -74,6 +74,7 @@ class _MyStatefulWidgetState extends State _restorableDateRangePickerRouteFuture, 'date_picker_route_future'); } + @pragma('vm:entry-point') static Route _dateRangePickerRoute( BuildContext context, Object? arguments, diff --git a/examples/api/lib/material/dialog/show_dialog.2.dart b/examples/api/lib/material/dialog/show_dialog.2.dart index b68bdbb00b67..3cb875507ec9 100644 --- a/examples/api/lib/material/dialog/show_dialog.2.dart +++ b/examples/api/lib/material/dialog/show_dialog.2.dart @@ -38,6 +38,7 @@ class DialogExample extends StatelessWidget { ); } + @pragma('vm:entry-point') static Route _dialogBuilder( BuildContext context, Object? arguments) { return DialogRoute( diff --git a/examples/api/lib/widgets/navigator/navigator.restorable_push.0.dart b/examples/api/lib/widgets/navigator/navigator.restorable_push.0.dart index 6d440037570a..f44ff6efd726 100644 --- a/examples/api/lib/widgets/navigator/navigator.restorable_push.0.dart +++ b/examples/api/lib/widgets/navigator/navigator.restorable_push.0.dart @@ -30,6 +30,7 @@ class MyStatefulWidget extends StatefulWidget { } class _MyStatefulWidgetState extends State { + @pragma('vm:entry-point') static Route _myRouteBuilder(BuildContext context, Object? arguments) { return MaterialPageRoute( builder: (BuildContext context) => const MyStatefulWidget(), diff --git a/examples/api/lib/widgets/navigator/navigator.restorable_push_and_remove_until.0.dart b/examples/api/lib/widgets/navigator/navigator.restorable_push_and_remove_until.0.dart index c66393a5fe6f..3e7c7551be3c 100644 --- a/examples/api/lib/widgets/navigator/navigator.restorable_push_and_remove_until.0.dart +++ b/examples/api/lib/widgets/navigator/navigator.restorable_push_and_remove_until.0.dart @@ -30,6 +30,7 @@ class MyStatefulWidget extends StatefulWidget { } class _MyStatefulWidgetState extends State { + @pragma('vm:entry-point') static Route _myRouteBuilder(BuildContext context, Object? arguments) { return MaterialPageRoute( builder: (BuildContext context) => const MyStatefulWidget(), diff --git a/examples/api/lib/widgets/navigator/navigator.restorable_push_replacement.0.dart b/examples/api/lib/widgets/navigator/navigator.restorable_push_replacement.0.dart index 7a6cccde4d42..a210aefa721f 100644 --- a/examples/api/lib/widgets/navigator/navigator.restorable_push_replacement.0.dart +++ b/examples/api/lib/widgets/navigator/navigator.restorable_push_replacement.0.dart @@ -30,6 +30,7 @@ class MyStatefulWidget extends StatefulWidget { } class _MyStatefulWidgetState extends State { + @pragma('vm:entry-point') static Route _myRouteBuilder(BuildContext context, Object? arguments) { return MaterialPageRoute( builder: (BuildContext context) => const MyStatefulWidget(), diff --git a/examples/api/lib/widgets/navigator/navigator_state.restorable_push.0.dart b/examples/api/lib/widgets/navigator/navigator_state.restorable_push.0.dart index dcb2126f7c27..330514402847 100644 --- a/examples/api/lib/widgets/navigator/navigator_state.restorable_push.0.dart +++ b/examples/api/lib/widgets/navigator/navigator_state.restorable_push.0.dart @@ -30,6 +30,7 @@ class MyStatefulWidget extends StatefulWidget { } class _MyStatefulWidgetState extends State { + @pragma('vm:entry-point') static Route _myRouteBuilder(BuildContext context, Object? arguments) { return MaterialPageRoute( builder: (BuildContext context) => const MyStatefulWidget(), diff --git a/examples/api/lib/widgets/navigator/navigator_state.restorable_push_and_remove_until.0.dart b/examples/api/lib/widgets/navigator/navigator_state.restorable_push_and_remove_until.0.dart index d95104b41520..7634cee90243 100644 --- a/examples/api/lib/widgets/navigator/navigator_state.restorable_push_and_remove_until.0.dart +++ b/examples/api/lib/widgets/navigator/navigator_state.restorable_push_and_remove_until.0.dart @@ -30,6 +30,7 @@ class MyStatefulWidget extends StatefulWidget { } class _MyStatefulWidgetState extends State { + @pragma('vm:entry-point') static Route _myRouteBuilder(BuildContext context, Object? arguments) { return MaterialPageRoute( builder: (BuildContext context) => const MyStatefulWidget(), diff --git a/examples/api/lib/widgets/navigator/navigator_state.restorable_push_replacement.0.dart b/examples/api/lib/widgets/navigator/navigator_state.restorable_push_replacement.0.dart index cd98e500a71e..15827da47b90 100644 --- a/examples/api/lib/widgets/navigator/navigator_state.restorable_push_replacement.0.dart +++ b/examples/api/lib/widgets/navigator/navigator_state.restorable_push_replacement.0.dart @@ -30,6 +30,7 @@ class MyStatefulWidget extends StatefulWidget { } class _MyStatefulWidgetState extends State { + @pragma('vm:entry-point') static Route _myRouteBuilder(BuildContext context, Object? arguments) { return MaterialPageRoute( builder: (BuildContext context) => const MyStatefulWidget(), diff --git a/examples/api/lib/widgets/navigator/restorable_route_future.0.dart b/examples/api/lib/widgets/navigator/restorable_route_future.0.dart index 34d6b457ff5c..7318bfbb89ab 100644 --- a/examples/api/lib/widgets/navigator/restorable_route_future.0.dart +++ b/examples/api/lib/widgets/navigator/restorable_route_future.0.dart @@ -73,6 +73,7 @@ class _MyHomeState extends State with RestorationMixin { // A static `RestorableRouteBuilder` that can re-create the route during // state restoration. + @pragma('vm:entry-point') static Route _counterRouteBuilder( BuildContext context, Object? arguments) { return MaterialPageRoute( diff --git a/examples/api/lib/widgets/routes/show_general_dialog.0.dart b/examples/api/lib/widgets/routes/show_general_dialog.0.dart index fd735ddf0abe..33073c8e73a7 100644 --- a/examples/api/lib/widgets/routes/show_general_dialog.0.dart +++ b/examples/api/lib/widgets/routes/show_general_dialog.0.dart @@ -38,6 +38,7 @@ class GeneralDialogExample extends StatelessWidget { ); } + @pragma('vm:entry-point') static Route _dialogBuilder( BuildContext context, Object? arguments) { return RawDialogRoute( diff --git a/packages/flutter/lib/src/widgets/navigator.dart b/packages/flutter/lib/src/widgets/navigator.dart index a17382045f58..f8c5d591f4df 100644 --- a/packages/flutter/lib/src/widgets/navigator.dart +++ b/packages/flutter/lib/src/widgets/navigator.dart @@ -55,8 +55,9 @@ typedef RouteListFactory = List> Function(NavigatorState navigato /// /// Used by the restorable methods of the [Navigator] that add anonymous routes /// (e.g. [NavigatorState.restorablePush]). For this use case, the -/// [RestorableRouteBuilder] must be static function as the [Navigator] will -/// call it again during state restoration to re-create the route. +/// [RestorableRouteBuilder] must be static function annotated with +/// `@pragma('vm:entry-point')`. The [Navigator] will call it again during +/// state restoration to re-create the route. typedef RestorableRouteBuilder = Route Function(BuildContext context, Object? arguments); /// Signature for the [Navigator.popUntil] predicate argument. @@ -2108,9 +2109,10 @@ class Navigator extends StatefulWidget { /// {@macro flutter.widgets.navigator.push} /// /// {@template flutter.widgets.Navigator.restorablePush} - /// The method takes a _static_ [RestorableRouteBuilder] as argument, which - /// must instantiate and return a new [Route] object that will be added to - /// the navigator. The provided `arguments` object is passed to the + /// The method takes a [RestorableRouteBuilder] as argument, which must be a + /// _static_ function annotated with `@pragma('vm:entry-point')`. It must + /// instantiate and return a new [Route] object that will be added to the + /// navigator. The provided `arguments` object is passed to the /// `routeBuilder`. The navigator calls the static `routeBuilder` function /// again during state restoration to re-create the route object. /// diff --git a/packages/flutter/test/cupertino/dialog_test.dart b/packages/flutter/test/cupertino/dialog_test.dart index 441e4465aecb..1231a6e0b7bd 100644 --- a/packages/flutter/test/cupertino/dialog_test.dart +++ b/packages/flutter/test/cupertino/dialog_test.dart @@ -1566,6 +1566,7 @@ Widget createAppWithCenteredButton(Widget child) { class _RestorableDialogTestWidget extends StatelessWidget { const _RestorableDialogTestWidget(); + @pragma('vm:entry-point') static Route _dialogBuilder(BuildContext context, Object? arguments) { return CupertinoDialogRoute( context: context, diff --git a/packages/flutter/test/cupertino/route_test.dart b/packages/flutter/test/cupertino/route_test.dart index d01a99e825c7..5122ee9f61cb 100644 --- a/packages/flutter/test/cupertino/route_test.dart +++ b/packages/flutter/test/cupertino/route_test.dart @@ -2314,6 +2314,7 @@ class _TestPostRouteCancelState extends State<_TestPostRouteCancel> { class _RestorableModalTestWidget extends StatelessWidget { const _RestorableModalTestWidget(); + @pragma('vm:entry-point') static Route _modalBuilder(BuildContext context, Object? arguments) { return CupertinoModalPopupRoute( builder: (BuildContext context) { diff --git a/packages/flutter/test/material/date_picker_test.dart b/packages/flutter/test/material/date_picker_test.dart index 1f49edb3a026..648080cfad3a 100644 --- a/packages/flutter/test/material/date_picker_test.dart +++ b/packages/flutter/test/material/date_picker_test.dart @@ -1412,6 +1412,7 @@ class _RestorableDatePickerDialogTestWidgetState extends State<_RestorableDatePi } } + @pragma('vm:entry-point') static Route _datePickerRoute( BuildContext context, Object? arguments, diff --git a/packages/flutter/test/material/date_range_picker_test.dart b/packages/flutter/test/material/date_range_picker_test.dart index ea844cacede5..e434329f2fa2 100644 --- a/packages/flutter/test/material/date_range_picker_test.dart +++ b/packages/flutter/test/material/date_range_picker_test.dart @@ -1150,6 +1150,7 @@ class _RestorableDateRangePickerDialogTestWidgetState extends State<_RestorableD } } + @pragma('vm:entry-point') static Route _dateRangePickerRoute( BuildContext context, Object? arguments, diff --git a/packages/flutter/test/material/dialog_test.dart b/packages/flutter/test/material/dialog_test.dart index 2f72e18c5d3c..fc9949989cb7 100644 --- a/packages/flutter/test/material/dialog_test.dart +++ b/packages/flutter/test/material/dialog_test.dart @@ -2710,6 +2710,7 @@ void main() { class _RestorableDialogTestWidget extends StatelessWidget { const _RestorableDialogTestWidget(); + @pragma('vm:entry-point') static Route _materialDialogBuilder(BuildContext context, Object? arguments) { return DialogRoute( context: context, diff --git a/packages/flutter/test/material/time_picker_test.dart b/packages/flutter/test/material/time_picker_test.dart index a957881f662b..630ab51cd209 100644 --- a/packages/flutter/test/material/time_picker_test.dart +++ b/packages/flutter/test/material/time_picker_test.dart @@ -1628,6 +1628,7 @@ class _TimePickerLauncherState extends State<_TimePickerLauncher> with Restorati }, ); + @pragma('vm:entry-point') static Route _timePickerRoute( BuildContext context, Object? arguments, diff --git a/packages/flutter/test/widgets/navigator_restoration_test.dart b/packages/flutter/test/widgets/navigator_restoration_test.dart index 41d8087d4e5a..0096ef811057 100644 --- a/packages/flutter/test/widgets/navigator_restoration_test.dart +++ b/packages/flutter/test/widgets/navigator_restoration_test.dart @@ -1015,6 +1015,7 @@ void main() { }); } +@pragma('vm:entry-point') Route _routeBuilder(BuildContext context, Object? arguments) { return MaterialPageRoute( builder: (BuildContext context) { @@ -1025,6 +1026,7 @@ Route _routeBuilder(BuildContext context, Object? arguments) { ); } +@pragma('vm:entry-point') Route _routeFutureBuilder(BuildContext context, Object? arguments) { return MaterialPageRoute( builder: (BuildContext context) { diff --git a/packages/flutter/test/widgets/routes_test.dart b/packages/flutter/test/widgets/routes_test.dart index 3d96cb607e07..fff423ba925c 100644 --- a/packages/flutter/test/widgets/routes_test.dart +++ b/packages/flutter/test/widgets/routes_test.dart @@ -2153,6 +2153,7 @@ class WidgetWithNoLocalHistoryState extends State { class _RestorableDialogTestWidget extends StatelessWidget { const _RestorableDialogTestWidget(); + @pragma('vm:entry-point') static Route _dialogBuilder(BuildContext context, Object? arguments) { return RawDialogRoute( pageBuilder: (