diff --git a/packages/go_router/lib/src/route_data.dart b/packages/go_router/lib/src/route_data.dart index 1d156afca729..4a832d15c5a7 100644 --- a/packages/go_router/lib/src/route_data.dart +++ b/packages/go_router/lib/src/route_data.dart @@ -90,19 +90,22 @@ class _GoRouteParameters { required this.builder, required this.pageBuilder, required this.redirect, - required this.onExit, + this.onExit, }); final GoRouterWidgetBuilder builder; final GoRouterPageBuilder pageBuilder; final GoRouterRedirect redirect; - final ExitCallback onExit; + final ExitCallback? onExit; } /// Helper to create [GoRoute] parameters from a factory function and an Expando. +/// +/// When [hasOverriddenOnExit] is null, treat it the same as true for backward compatibility. _GoRouteParameters _createGoRouteParameters({ required T Function(GoRouterState) factory, required Expando<_GoRouteDataBase> expando, + bool? hasOverriddenOnExit, }) { T factoryImpl(GoRouterState state) { final Object? extra = state.extra; @@ -123,8 +126,10 @@ _GoRouteParameters _createGoRouteParameters({ factoryImpl(state).buildPage(context, state), redirect: (BuildContext context, GoRouterState state) => factoryImpl(state).redirect(context, state), - onExit: (BuildContext context, GoRouterState state) => - factoryImpl(state).onExit(context, state), + onExit: hasOverriddenOnExit == null || hasOverriddenOnExit + ? (BuildContext context, GoRouterState state) => + factoryImpl(state).onExit(context, state) + : null, ); } @@ -156,10 +161,12 @@ abstract class GoRouteData extends _GoRouteDataBase { required T Function(GoRouterState) factory, GlobalKey? parentNavigatorKey, List routes = const [], + bool? hasOverriddenOnExit, }) { final _GoRouteParameters params = _createGoRouteParameters( factory: factory, expando: _GoRouteDataBase.stateObjectExpando, + hasOverriddenOnExit: hasOverriddenOnExit, ); return GoRoute( @@ -227,10 +234,12 @@ abstract class RelativeGoRouteData extends _GoRouteDataBase { required T Function(GoRouterState) factory, GlobalKey? parentNavigatorKey, List routes = const [], + bool? hasOverriddenOnExit, }) { final _GoRouteParameters params = _createGoRouteParameters( factory: factory, expando: _GoRouteDataBase.stateObjectExpando, + hasOverriddenOnExit: hasOverriddenOnExit, ); return GoRoute( diff --git a/packages/go_router/pending_changelogs/11150-allow-onexit-as-optional.yaml b/packages/go_router/pending_changelogs/11150-allow-onexit-as-optional.yaml new file mode 100644 index 000000000000..24c045618c6d --- /dev/null +++ b/packages/go_router/pending_changelogs/11150-allow-onexit-as-optional.yaml @@ -0,0 +1,3 @@ +changelog: | + - Adds `hasOverriddenOnExit` parameter to `GoRouteData.$route` and `RelativeGoRouteData.$route` helper methods for type-safe routes. When set to `true`, enables custom `onExit` callback invocation from route data classes extending `GoRouteData` or `RelativeGoRouteData` when the route is removed from the navigation stack. +version: minor \ No newline at end of file