Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
6be9a5d
[go_router] Added top level onEnter callback.
omar-hanafy Dec 22, 2024
171b639
added version 14.7.0
omar-hanafy Dec 22, 2024
f52a269
Merge branch 'main' into main
omar-hanafy Dec 25, 2024
3bbd241
Merge branch 'main' into main
omar-hanafy Dec 27, 2024
6a60006
Merge branch 'main' into main
omar-hanafy Jan 3, 2025
d1e1fc2
[go_router] added nextState, and currentState to OnEnter signature, a…
omar-hanafy Jan 24, 2025
516db13
Merge branch 'main' into main
omar-hanafy Jan 24, 2025
e1f10b1
Merge branch 'main' into main
omar-hanafy Jan 26, 2025
7a847b8
Merge branch 'main' into main
omar-hanafy Jan 28, 2025
b08d804
Merge branch 'main' into main
omar-hanafy Feb 2, 2025
1e25466
Merge branch 'main' into main
omar-hanafy Feb 4, 2025
aec8e47
Add router instance to OnEnter callback
omar-hanafy Feb 4, 2025
2bdc147
Merge branch 'main' into main
omar-hanafy Feb 8, 2025
1bd3c18
[go_router] Async onEnter, improved redirection, and loop prevention.
omar-hanafy Feb 15, 2025
61729b2
Merge branch 'main' into main
omar-hanafy Feb 15, 2025
8334a64
Merge branch 'main' into main
omar-hanafy Feb 17, 2025
f28337e
improved redirection and async handling.
omar-hanafy Feb 18, 2025
4092405
extracting the onEnter logic into its own helper class.
omar-hanafy Feb 18, 2025
c1c09d0
added named params to handleTopOnEnter.
omar-hanafy Feb 18, 2025
d9e6ea6
move tests
cedvdb Feb 20, 2025
07c15f0
Merge pull request #3 from cedvdb/move_tests
omar-hanafy Feb 22, 2025
3fbe011
Merge branch 'main' into main
omar-hanafy Mar 28, 2025
67df52a
added tests
cedvdb Apr 6, 2025
eef39b1
Merge pull request #4 from cedvdb/omar-add-on-enter-tests
omar-hanafy Apr 7, 2025
359eb0e
Merge branch 'flutter:main' into main
omar-hanafy Apr 7, 2025
cc57519
[go_router] Fix onEnter callback exception handling and enhance tests
omar-hanafy Apr 8, 2025
d4f2416
[go_router] updated Should allow redirection with query parameters te…
omar-hanafy Apr 9, 2025
56f2dbe
Merge branch 'main' into main
omar-hanafy Apr 16, 2025
c458982
Merge branch 'main' into main
omar-hanafy Apr 28, 2025
921dcb3
Merge branch 'main' into main
omar-hanafy May 30, 2025
757f5a1
[go_router] Use specific imports in on_enter.dart
omar-hanafy May 30, 2025
b5e1e9e
Merge branch 'main' of https://github.com/omar-hanafy/packages
omar-hanafy May 30, 2025
86c506b
Merge branch 'main' into main
omar-hanafy Jun 10, 2025
3c4a85f
Merge branch 'main' into main
omar-hanafy Jun 11, 2025
9d52c0d
Merge branch 'main' into main
omar-hanafy Jun 18, 2025
97c5ed8
Merge branch 'main' into main
omar-hanafy Jun 24, 2025
0323a45
Merge branch 'main' into main
omar-hanafy Jul 9, 2025
4a9e6ff
[go_router] Replace boolean return with sealed class API for onEnter
omar-hanafy Jul 9, 2025
3b2df49
[go_router] Make OnEnterHandler private and ensure onEnter priority o…
omar-hanafy Aug 2, 2025
1dd95d8
Merge branch 'main' into main
omar-hanafy Aug 2, 2025
ade3f54
Merge branch 'main' into main
omar-hanafy Aug 19, 2025
ed43b0b
Merge branch 'main' into main
omar-hanafy Aug 19, 2025
d0d5e6d
[go_router] added allow/block factories for the OnEnterResult
omar-hanafy Aug 19, 2025
a484965
[go_router] ran dart format
omar-hanafy Aug 19, 2025
10404f8
[go_router] returned back missing docs in GoRouterRedirect
omar-hanafy Aug 19, 2025
2b3d0be
[go_router] Fix license headers to match repository standards
omar-hanafy Aug 19, 2025
b554e6c
[go_router] sealed `onEnter` (Allow/Block.then) + compose legacy redi…
omar-hanafy Aug 20, 2025
99ab3c3
[go_router] Fix license headers to match repository standards
omar-hanafy Aug 20, 2025
265f26f
[go_router] Refactor parser and on_enter for clarity and type safety
omar-hanafy Aug 22, 2025
01f7ea6
[go_router] Remove unused initialLocation parameter from parser.
omar-hanafy Aug 22, 2025
22a29bd
[go_router] Ensure onEnter runs during state restoration, and unified…
omar-hanafy Aug 27, 2025
887c528
Merge branch 'main' into main
omar-hanafy Aug 28, 2025
37712e5
Merge branch 'main' into main
omar-hanafy Aug 30, 2025
ee55004
Merge branch 'main' into main
omar-hanafy Sep 21, 2025
9e37af9
[go_router] polish onEnter handling and docs
omar-hanafy Sep 22, 2025
faa9d81
Merge branch 'main' into main
omar-hanafy Sep 25, 2025
20c4148
[go_router] Refine onEnter documentation and API adjustments
omar-hanafy Sep 25, 2025
2b4c348
[go_router] Improve context safety and docs in navigation logic
omar-hanafy Sep 27, 2025
d1bc684
[go_router] Improve documentation for legacy redirect method
omar-hanafy Oct 13, 2025
54afc72
Merge branch 'main' into main
omar-hanafy Oct 15, 2025
33996c6
Merge remote-tracking branch 'upstream/main'
omar-hanafy Oct 16, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
[go_router] Refactor parser and on_enter for clarity and type safety
Simplified the OnEnterResult class documentation and removed factory constructors from the sealed class. Introduced type aliases for navigation callbacks and route information state in parser.dart, and updated method signatures to use these aliases for improved readability and type safety. Also streamlined fallback logic when navigation is blocked.
  • Loading branch information
omar-hanafy committed Aug 22, 2025
commit 265f26f9d7aefaddb8893da82c17a38b8a69a76f
18 changes: 4 additions & 14 deletions packages/go_router/lib/src/on_enter.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,24 +7,14 @@ import 'dart:async';
/// The result of an onEnter callback.
///
/// This sealed class represents the possible outcomes of navigation interception.
/// Being sealed, it can only be extended within this library, ensuring a controlled
/// set of result types while still allowing construction via factory constructors
/// and the public concrete subtypes [Allow] and [Block].
/// This class can't be extended. One must use one of its subtypes, [Allow] or
/// [Block], to indicate the result.
sealed class OnEnterResult {
Copy link
Contributor Author

@omar-hanafy omar-hanafy Jul 17, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this should probably be abstract.

Why it should be abstract ? I thought it would be better to allow this class to be extended only through the package, since we only support allow and block!

It would also be helpful for discoverability if static members allow and block would be added

I do not get that, can u clarify what u want here.

Copy link
Contributor

@cedvdb cedvdb Jul 17, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes right

Just a suggestion, this helps with discoverability, but since the documentation is already pretty clear, it may not be necessary

static OnEnterResult allow() => Allow();
static OnEnterResult block() => Block()

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You mean u want that static methods to be inside the OnEnterResult, so users be able to OnEnterResult.allow() or OnEnterResult.block()? okay good one, @chunhtai what do you think ?

Copy link
Contributor

@cedvdb cedvdb Jul 26, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you mark this as resolved ? Forget about my suggestion, this can be done later if necessary. Let's avoid noise because back and forth take weeks

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am ok either way.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thinking a bit more it feels adding OnEnterResult.allow and OnEnterResult.block may be more confusing than it worth, I suggest we remove them

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

/// Creates an [OnEnterResult].
const OnEnterResult({this.then});

/// Creates an [Allow] result that allows navigation to proceed.
///
/// The [then] callback is executed after the navigation is allowed.
const factory OnEnterResult.allow({FutureOr<void> Function()? then}) = Allow;

/// Creates a [Block] result that blocks navigation from proceeding.
///
/// The [then] callback is executed after the navigation is blocked.
const factory OnEnterResult.block({FutureOr<void> Function()? then}) = Block;

/// Executed after the decision is committed. Errors are reported and do not revert navigation.
/// Executed after the decision is committed.
/// Errors are reported and do not revert navigation.
final FutureOr<void> Function()? then;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we need to type def this

}

Expand Down
26 changes: 13 additions & 13 deletions packages/go_router/lib/src/parser.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,12 @@ typedef ParserExceptionHandler =
RouteMatchList routeMatchList,
);

/// The function signature for navigation callbacks in [_OnEnterHandler].
typedef NavigationCallback = Future<RouteMatchList> Function();

/// Type alias for route information state with dynamic type parameter.
typedef RouteInfoState = RouteInformationState<dynamic>;

/// Converts between incoming URLs and a [RouteMatchList] using [RouteMatcher].
///
/// Also integrates the top-level `onEnter` guard and then performs legacy
Expand Down Expand Up @@ -121,17 +127,11 @@ class GoRouteInformationParser extends RouteInformationParser<RouteMatchList> {
infoState: infoState,
onCanEnter: () => _navigate(routeInformation, context, infoState),
onCanNotEnter: () {
// If navigation is blocked, return the last successful match or a fallback.
// If navigation is blocked, return the last successful match or empty.
if (_lastMatchList != null) {
return SynchronousFuture<RouteMatchList>(_lastMatchList!);
} else {
final Uri defaultUri = Uri.parse(_initialLocation ?? '/');
final RouteMatchList fallbackMatches = configuration.findMatch(
defaultUri,
extra: infoState.extra,
);
_lastMatchList = fallbackMatches;
return SynchronousFuture<RouteMatchList>(fallbackMatches);
return SynchronousFuture<RouteMatchList>(RouteMatchList.empty);
}
},
);
Expand All @@ -145,7 +145,7 @@ class GoRouteInformationParser extends RouteInformationParser<RouteMatchList> {
Future<RouteMatchList> _navigate(
RouteInformation routeInformation,
BuildContext context,
RouteInformationState<dynamic> infoState,
RouteInfoState infoState,
) {
// Normalize the URI: ensure it has a valid path and remove trailing slashes.
Uri uri = routeInformation.uri;
Expand Down Expand Up @@ -375,9 +375,9 @@ class _OnEnterHandler {
Future<RouteMatchList> handleTopOnEnter({
required BuildContext context,
required RouteInformation routeInformation,
required RouteInformationState<dynamic> infoState,
required Future<RouteMatchList> Function() onCanEnter,
required Future<RouteMatchList> Function() onCanNotEnter,
required RouteInfoState infoState,
required NavigationCallback onCanEnter,
required NavigationCallback onCanNotEnter,
}) {
final OnEnter? topOnEnter = _configuration.topOnEnter;
// If no onEnter is configured, allow navigation immediately.
Expand Down Expand Up @@ -577,7 +577,7 @@ class _OnEnterHandler {
RouteMatchList? _redirectionErrorMatchList(
BuildContext context,
Uri redirectedUri,
RouteInformationState<dynamic> infoState,
RouteInfoState infoState,
) {
_redirectionHistory.add(redirectedUri);
if (_redirectionHistory.length > _configuration.redirectLimit) {
Expand Down