What is GoRouter?
GoRouter is a powerful and flexible routing package for Flutter, developed by the Flutter team. It makes navigation in Flutter apps easier by providing a simple, declarative way to define routes and handle navigation. Unlike Flutter's default Navigator
(which can be a bit complex for beginners), GoRouter uses a URL-based approach, similar to how websites work, making it intuitive and scalable.
Why Use GoRouter?
- Simple Syntax: GoRouter lets you define routes using easy-to-understand code.
-
URL-Based Navigation: It supports web-like URLs (e.g.,
/home
or/profile/123
), which is great for web apps and deep linking. - Nested Routes: You can create nested navigation (like tabs or subtabs) easily.
-
Parameter Support: Pass data like IDs (e.g.,
/product/42
) directly in the URL. - Redirects: Handle navigation logic, like redirecting users to a login page if they're not signed in.
- Beginner-Friendly: It reduces the complexity of managing navigation stacks.
Setting Up GoRouter
Let’s walk through how to set up and use GoRouter in a Flutter app. We’ll create a simple app with two screens: a Home screen and a Profile screen.
Step 1: Add GoRouter to Your Project
First, you need to add the go_router
package to your Flutter project. Open your pubspec.yaml
file and add the following dependency:
dependencies:
go_router: ^16.2.1
Then, run flutter pub get
in your terminal to install the package. (Note: The version number might change, so check pub.dev for the latest version.)
Step 2: Create Your Screens
Let’s create two simple screens for our app: HomeScreen
and ProfileScreen
.
import 'package:flutter/material.dart';
class HomeScreen extends StatelessWidget {
const HomeScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Home')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text('Welcome to the Home Screen!'),
ElevatedButton(
onPressed: () {
// We'll navigate to the Profile screen later
},
child: const Text('Go to Profile'),
),
],
),
),
);
}
}
class ProfileScreen extends StatelessWidget {
final String? userId; // Optional parameter for user ID
const ProfileScreen({super.key, this.userId});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Profile')),
body: Center(
child: Text('Profile Screen${userId != null ? ' for User $userId' : ''}'),
),
);
}
}
Step 3: Set Up GoRouter
Now, let’s configure GoRouter to handle navigation between these screens. In your main.dart
, set up the router and define the routes.
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'home_screen.dart';
import 'profile_screen.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
MyApp({super.key});
// Define the GoRouter configuration
final GoRouter _router = GoRouter(
routes: [
GoRoute(
path: '/', // Root route (Home screen)
builder: (context, state) => const HomeScreen(),
),
GoRoute(
path: '/profile/:userId', // Profile route with a parameter
builder: (context, state) {
final userId = state.pathParameters['userId'];
return ProfileScreen(userId: userId);
},
),
],
);
@override
Widget build(BuildContext context) {
return MaterialApp.router(
title: 'Flutter GoRouter Demo',
routerConfig: _router, // Use GoRouter for navigation
);
}
}
Explanation of the Code
-
GoRouter Configuration: We create a
GoRouter
instance and define two routes:-
/
: The root route, which shows theHomeScreen
. -
/profile/:userId
: A route for theProfileScreen
with a dynamicuserId
parameter (e.g.,/profile/123
).
-
-
MaterialApp.router: Instead of the usual
MaterialApp
, we useMaterialApp.router
to integrate GoRouter. -
Path Parameters: The
:userId
in/profile/:userId
allows us to pass dynamic data, like a user ID, to theProfileScreen
.
Step 4: Add Navigation
Let’s update the HomeScreen
to navigate to the ProfileScreen
when the button is pressed. Modify the ElevatedButton
in HomeScreen
:
ElevatedButton(
onPressed: () {
context.go('/profile/123'); // Navigate to Profile with userId 123
},
child: const Text('Go to Profile'),
)
Here, context.go('/profile/123')
tells GoRouter to navigate to the /profile/123
route, passing 123
as the userId
.
Step 5: Run the App
Run your app using flutter run
. You should see:
- The Home screen with a button.
- Clicking the button takes you to the Profile screen, displaying “Profile Screen for User 123”.
Key GoRouter Features for Beginners
1. Navigating Between Screens
Use context.go()
to navigate to a new route. For example:
context.go('/profile/456'); // Navigates to ProfileScreen with userId 456
2. Going Back
To go back to the previous screen, use:
context.pop();
Add a back button to the ProfileScreen
’s body:
ElevatedButton(
onPressed: () {
context.pop();
},
child: const Text('Go Back'),
)
3. Passing Parameters
You’ve already seen how to pass a userId
in the route (/profile/:userId
). You can access it in the builder
using state.pathParameters['userId']
.
4. Nested Routes
If your app has nested navigation (e.g., a dashboard with tabs), you can define subroutes. For example:
GoRoute(
path: '/dashboard',
builder: (context, state) => const DashboardScreen(),
routes: [
GoRoute(
path: 'settings',
builder: (context, state) => const SettingsScreen(),
),
],
)
Now, /dashboard/settings
will show the SettingsScreen
as a subroute of the DashboardScreen
.
5. Redirects
You can redirect users based on conditions, like sending them to a login page if they’re not authenticated:
final GoRouter _router = GoRouter(
routes: [
GoRoute(
path: '/',
builder: (context, state) => const HomeScreen(),
),
],
redirect: (context, state) {
bool isLoggedIn = false; // Replace with your auth logic
if (!isLoggedIn && state.uri.toString() != '/login') {
return '/login';
}
return null; // No redirect
},
);
Tips for Beginners
- Start Simple: Begin with basic routes like we did above before exploring nested routes or redirects.
-
Use Descriptive Paths: Make your route paths clear, like
/home
or/profile
, to keep your code readable. - Test Navigation: Always test your routes to ensure they work as expected, especially when passing parameters.
- Read the Docs: The GoRouter documentation is beginner-friendly and has more examples.
Try experimenting with more routes or adding redirects to enhance your app. Happy coding!
Top comments (0)