-
Notifications
You must be signed in to change notification settings - Fork 3.5k
[go_router] Support for top level onEnter
callback.
#8339
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
omar-hanafy
wants to merge
54
commits into
flutter:main
Choose a base branch
from
omar-hanafy:main
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
+2,729
−172
Open
Changes from 5 commits
Commits
Show all changes
54 commits
Select commit
Hold shift + click to select a range
6be9a5d
[go_router] Added top level onEnter callback.
omar-hanafy 171b639
added version 14.7.0
omar-hanafy f52a269
Merge branch 'main' into main
omar-hanafy 3bbd241
Merge branch 'main' into main
omar-hanafy 6a60006
Merge branch 'main' into main
omar-hanafy d1e1fc2
[go_router] added nextState, and currentState to OnEnter signature, a…
omar-hanafy 516db13
Merge branch 'main' into main
omar-hanafy e1f10b1
Merge branch 'main' into main
omar-hanafy 7a847b8
Merge branch 'main' into main
omar-hanafy b08d804
Merge branch 'main' into main
omar-hanafy 1e25466
Merge branch 'main' into main
omar-hanafy aec8e47
Add router instance to OnEnter callback
omar-hanafy 2bdc147
Merge branch 'main' into main
omar-hanafy 1bd3c18
[go_router] Async onEnter, improved redirection, and loop prevention.
omar-hanafy 61729b2
Merge branch 'main' into main
omar-hanafy 8334a64
Merge branch 'main' into main
omar-hanafy f28337e
improved redirection and async handling.
omar-hanafy 4092405
extracting the onEnter logic into its own helper class.
omar-hanafy c1c09d0
added named params to handleTopOnEnter.
omar-hanafy d9e6ea6
move tests
cedvdb 07c15f0
Merge pull request #3 from cedvdb/move_tests
omar-hanafy 3fbe011
Merge branch 'main' into main
omar-hanafy 67df52a
added tests
cedvdb eef39b1
Merge pull request #4 from cedvdb/omar-add-on-enter-tests
omar-hanafy 359eb0e
Merge branch 'flutter:main' into main
omar-hanafy cc57519
[go_router] Fix onEnter callback exception handling and enhance tests
omar-hanafy d4f2416
[go_router] updated Should allow redirection with query parameters te…
omar-hanafy 56f2dbe
Merge branch 'main' into main
omar-hanafy c458982
Merge branch 'main' into main
omar-hanafy 921dcb3
Merge branch 'main' into main
omar-hanafy 757f5a1
[go_router] Use specific imports in on_enter.dart
omar-hanafy b5e1e9e
Merge branch 'main' of https://github.com/omar-hanafy/packages
omar-hanafy 86c506b
Merge branch 'main' into main
omar-hanafy 3c4a85f
Merge branch 'main' into main
omar-hanafy 9d52c0d
Merge branch 'main' into main
omar-hanafy 97c5ed8
Merge branch 'main' into main
omar-hanafy 0323a45
Merge branch 'main' into main
omar-hanafy 4a9e6ff
[go_router] Replace boolean return with sealed class API for onEnter
omar-hanafy 3b2df49
[go_router] Make OnEnterHandler private and ensure onEnter priority o…
omar-hanafy 1dd95d8
Merge branch 'main' into main
omar-hanafy ade3f54
Merge branch 'main' into main
omar-hanafy ed43b0b
Merge branch 'main' into main
omar-hanafy d0d5e6d
[go_router] added allow/block factories for the OnEnterResult
omar-hanafy a484965
[go_router] ran dart format
omar-hanafy 10404f8
[go_router] returned back missing docs in GoRouterRedirect
omar-hanafy 2b3d0be
[go_router] Fix license headers to match repository standards
omar-hanafy b554e6c
[go_router] sealed `onEnter` (Allow/Block.then) + compose legacy redi…
omar-hanafy 99ab3c3
[go_router] Fix license headers to match repository standards
omar-hanafy 265f26f
[go_router] Refactor parser and on_enter for clarity and type safety
omar-hanafy 01f7ea6
[go_router] Remove unused initialLocation parameter from parser.
omar-hanafy 22a29bd
[go_router] Ensure onEnter runs during state restoration, and unified…
omar-hanafy 887c528
Merge branch 'main' into main
omar-hanafy 37712e5
Merge branch 'main' into main
omar-hanafy ee55004
Merge branch 'main' into main
omar-hanafy File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,154 @@ | ||
// Copyright 2013 The Flutter Authors. | ||
// Use of this source code is governed by a BSD-style license | ||
// that can be found in the LICENSE file. | ||
|
||
import 'package:flutter/material.dart'; | ||
import 'package:go_router/go_router.dart'; | ||
|
||
void main() => runApp(const App()); | ||
|
||
/// The main application widget. | ||
class App extends StatelessWidget { | ||
/// Constructs an [App]. | ||
const App({super.key}); | ||
|
||
/// The title of the app. | ||
static const String title = 'GoRouter Example: Top-level onEnter'; | ||
|
||
@override | ||
Widget build(BuildContext context) => MaterialApp.router( | ||
routerConfig: GoRouter( | ||
initialLocation: '/home', | ||
|
||
/// A callback invoked for every route navigation attempt. | ||
/// | ||
/// If the callback returns `false`, the navigation is blocked. | ||
/// Use this to handle authentication, referrals, or other route-based logic. | ||
onEnter: (BuildContext context, GoRouterState state) { | ||
// Save the referral code (if provided) and block navigation to the /referral route. | ||
if (state.uri.path == '/referral') { | ||
saveReferralCode(context, state.uri.queryParameters['code']); | ||
return false; | ||
} | ||
|
||
return true; // Allow navigation for all other routes. | ||
}, | ||
|
||
/// The list of application routes. | ||
routes: <GoRoute>[ | ||
GoRoute( | ||
path: '/login', | ||
builder: (BuildContext context, GoRouterState state) => | ||
const LoginScreen(), | ||
), | ||
GoRoute( | ||
path: '/home', | ||
builder: (BuildContext context, GoRouterState state) => | ||
const HomeScreen(), | ||
), | ||
GoRoute( | ||
path: '/settings', | ||
builder: (BuildContext context, GoRouterState state) => | ||
const SettingsScreen(), | ||
), | ||
], | ||
), | ||
title: title, | ||
); | ||
} | ||
|
||
/// The login screen widget. | ||
class LoginScreen extends StatelessWidget { | ||
/// Constructs a [LoginScreen]. | ||
const LoginScreen({super.key}); | ||
|
||
@override | ||
Widget build(BuildContext context) => Scaffold( | ||
appBar: AppBar(title: const Text(App.title)), | ||
body: Center( | ||
child: Column( | ||
mainAxisAlignment: MainAxisAlignment.center, | ||
children: <Widget>[ | ||
ElevatedButton( | ||
onPressed: () => context.go('/home'), | ||
child: const Text('Go to Home'), | ||
), | ||
ElevatedButton( | ||
onPressed: () => context.go('/settings'), | ||
child: const Text('Go to Settings'), | ||
), | ||
], | ||
), | ||
), | ||
); | ||
} | ||
|
||
/// The home screen widget. | ||
class HomeScreen extends StatelessWidget { | ||
/// Constructs a [HomeScreen]. | ||
const HomeScreen({super.key}); | ||
|
||
@override | ||
Widget build(BuildContext context) => Scaffold( | ||
appBar: AppBar(title: const Text(App.title)), | ||
body: Center( | ||
child: Column( | ||
mainAxisAlignment: MainAxisAlignment.center, | ||
children: <Widget>[ | ||
ElevatedButton( | ||
onPressed: () => context.go('/login'), | ||
child: const Text('Go to Login'), | ||
), | ||
ElevatedButton( | ||
onPressed: () => context.go('/settings'), | ||
child: const Text('Go to Settings'), | ||
), | ||
ElevatedButton( | ||
// This would typically be triggered by an incoming deep link. | ||
onPressed: () => context.go('/referral?code=12345'), | ||
child: const Text('Save Referral Code'), | ||
), | ||
], | ||
), | ||
), | ||
); | ||
} | ||
|
||
/// The settings screen widget. | ||
class SettingsScreen extends StatelessWidget { | ||
/// Constructs a [SettingsScreen]. | ||
const SettingsScreen({super.key}); | ||
|
||
@override | ||
Widget build(BuildContext context) => Scaffold( | ||
appBar: AppBar(title: const Text(App.title)), | ||
body: Center( | ||
child: Column( | ||
mainAxisAlignment: MainAxisAlignment.center, | ||
children: <Widget>[ | ||
ElevatedButton( | ||
onPressed: () => context.go('/login'), | ||
child: const Text('Go to Login'), | ||
), | ||
ElevatedButton( | ||
onPressed: () => context.go('/home'), | ||
child: const Text('Go to Home'), | ||
), | ||
], | ||
), | ||
), | ||
); | ||
} | ||
|
||
/// Saves a referral code. | ||
/// | ||
/// Displays a [SnackBar] with the referral code for demonstration purposes. | ||
/// Replace this with real referral handling logic. | ||
void saveReferralCode(BuildContext context, String? code) { | ||
if (code != null) { | ||
// Here you can implement logic to save the referral code as needed. | ||
ScaffoldMessenger.of(context).showSnackBar( | ||
SnackBar(content: Text('Referral code saved: $code')), | ||
); | ||
} | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.