Playx Navigation is a robust and flexible Flutter package that enhances the navigation capabilities of your Flutter applications. It builds on the go_router
package to provide powerful features like route-specific lifecycle management with bindings, extensive route configuration options, and custom page transitions. With Playx Navigation
, you can create a highly modular and maintainable navigation system for your apps.
- Route Bindings: Attach custom logic to specific routes, handling lifecycle events such as entering or exiting a route.
- Advanced Route Configuration: Fine-tune the behavior of your routes with extensive configuration options, including custom transitions, modal behavior, and state management.
- Route Management: Easily navigate to routes, replace routes, and handle navigation stacks without the need for buildcontext.
- Custom Page Transitions: Use predefined transitions or create your own to enhance the user experience.
Add Playx Navigation
to your pubspec.yaml
:
dependencies:
playx_navigation: ^0.0.1
Then, run:
flutter pub get
You can optionally define your route names and paths for easier management:
abstract class Routes {
static const home = 'home';
static const products = 'products';
static const details = 'productDetails';
}
abstract class Paths {
static const home = '/home';
static const products = '/products';
static const details = ':id';
}
Create bindings for each route to handle lifecycle events such as entering or exiting a route. This ensures that your app's logic is properly managed.
class ProductsBinding extends PlayxBinding {
@override
Future<void> onEnter(BuildContext context, GoRouterState state) async {
// Initialize resources for the products page.
}
@override
Future<void> onExit(BuildContext context) async {
// Clean up resources when leaving the products page.
}
}
Use the PlayxRoute
to define your app's navigation structure:
final router = GoRouter(
initialLocation: Paths.home,
debugLogDiagnostics: true,
routes: [
PlayxRoute(
path: Paths.home,
name: Routes.home,
builder: (context, state) => const HomePage(),
binding: HomeBinding(),
),
PlayxRoute(
path: Paths.products,
name: Routes.products,
builder: (context, state) => ProductsPage(),
binding: ProductsBinding(),
routes: [
PlayxRoute(
path: Paths.details,
name: Routes.details,
builder: (context, state) =>
ProductDetailsPage(product: state.extra as Product),
binding: DetailsBinding(),
),
],
),
],
);
Wrap your MaterialApp
or CupertionApp
in PlayxNavigationBuilder
and pass the router instance to it to enable Playx Navigation and manage route changes:
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return PlayxNavigationBuilder(
router: router,
builder: (context) {
return MaterialApp.router(
title: 'Playx',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
),
routerDelegate: router.routerDelegate,
routeInformationParser: router.routeInformationParser,
routeInformationProvider: router.routeInformationProvider,
backButtonDispatcher: router.backButtonDispatcher,
);
});
}
}
PlayxNavigationBuilder
simplifies the setup process by providing a centralized way to configure and manage routes, bindings, and other navigation-related settings.
The PlayxNavigation
class offers a variety of static methods for managing navigation within your Flutter application using the GoRouter
package. Before utilizing any of these methods, ensure that PlayxNavigation
has been initialized by calling PlayxNavigation.boot()
or by including the PlayxNavigationBuilder
widget in your widget tree.
Before using any navigation methods, initialize PlayxNavigation
:
PlayxNavigation.boot(router: yourGoRouterInstance);
Alternatively, use PlayxNavigationBuilder
to automatically initialize the navigation system:
return PlayxNavigationBuilder(
router: router,
builder: (context) {
return MaterialApp.router(
routerDelegate: router.routerDelegate,
routeInformationParser: router.routeInformationParser,
);
});
-
Navigating to Routes No need of BuildContext as you can call the navigation methods from anywhere.
-
to
: Pushes a new route onto the navigation stack.await PlayxNavigation.to('/details', extra: {'id': 1});
-
offAll
: Replaces all previous routes in the stack with a new route.await PlayxNavigation.offAll('/home', extra: {'clearHistory': true});
-
offAndTo
: Replaces the current route with a new route.await PlayxNavigation.offAndTo('/profile', extra: {'userId': 123});
-
-
Named Route Navigation
-
`toNamed: Pushes a named route onto the navigation stack.
await PlayxNavigation.toNamed('details', pathParameters: {'id': '1'});
-
offAllNamed
: Replaces all previous routes in the stack with a named route.await PlayxNavigation.offAllNamed('home');
-
offAndToNamed
: Replaces the current route with a named route.await PlayxNavigation.offAndToNamed('profile', pathParameters: {'userId': '123'});
-
-
Navigation Control
-
goToBranch
: Navigates to the current location of the branch at the provided index ofStatefulShellRoute
. -
pop([T? result])
: Pops the top-most route off the navigation stack.PlayxNavigation.pop();`
-
canPop()
: Returnstrue
if there are routes in the navigation stack that can be popped.if (PlayxNavigation.canPop()) { PlayxNavigation.pop(); }
-
-
currentRoute
: Gets the currentRouteMatch
object representing the current route in the navigation stack. -
currentRouteName
: Gets the name of the current route, if available. -
addRouteChangeListener(VoidCallback listener)
: Adds a listener for route changes. -
removeRouteChangeListener(VoidCallback listener)
: Removes a previously added route change listener.
PlayxBinding
is an abstract class in the PlayxNavigation package designed to manage actions during a route's lifecycle. This includes initializing resources when a route is entered, handling tasks when it's revisited, pausing actions when it's hidden, and cleaning up when it's removed from the navigation stack.
Key Features:
- Comprehensive Lifecycle Management: Handle route lifecycle events such as entering, re-entering, hiding, and exiting.
- Subroute Awareness: The
onExit
method of a main route is called only when the main route and all its subroutes are removed, ensuring effective resource management.
- onEnter: Triggered when the route is first entered. Use this to initialize resources or fetch data.
- onReEnter: Called when revisiting a route that is still in the stack but temporarily hidden.
- onHidden: Triggered when the route is hidden but not removed. Useful for pausing tasks or releasing temporary resources.
- onExit: Triggered when the route is permanently removed from the stack. Use this to clean up resources or save the state.
Example:
class MyRouteBinding extends PlayxBinding {
@override
Future<void> onEnter(BuildContext context, GoRouterState state) async {
// Initialize resources or fetch data for the route.
}
@override
Future<void> onReEnter(
BuildContext context,
GoRouterState? state,
bool wasPoppedAndReentered,
) async {
// Handle special cases when the route is revisited.
}
@override
Future<void> onHidden(BuildContext context) async {
// Pause tasks or release temporary resources.
}
@override
Future<void> onExit(BuildContext context) async {
// Cleanup resources or save state when the route is exited.
}
}
- Data Fetching: Fetch required data when a route is entered for the first time.
- Resource Cleanup: Release heavy resources when the route is completely exited.
- Temporary Pauses: Pause animations or background tasks when the route is hidden.
- Revisit Handling: Refresh UI or state when the route is re-entered after being hidden.
By extending PlayxBinding
, you can efficiently manage the lifecycle of your application's routes and ensure that resources are used optimally.
The PlayxRoute
class extends the functionality of the GoRoute
class, providing advanced features that allow developers to have granular control over routing in Flutter applications. With PlayxRoute
, you can implement custom page transitions, bind route-specific lifecycle events, and configure page settings with ease.
PlayxRoute
is designed to enhance navigation by offering:
- Lifecycle Management: Attach custom logic that runs when a route is entered or exited, enabling better control over the state and behavior of your app.
- Page Configuration: Customize various settings like page title, transition duration, and modal behavior.
- Custom Transitions: Apply predefined or custom animations for transitioning between pages.
-
Lifecycle Management with PlayxBinding
- onEnter and onExit: Attach custom logic to handle what happens when a route is entered or exited. This is useful for managing resources, fetching data, or other setup/teardown tasks.
- Redirection Handling: Implement custom redirection logic that can dynamically change the navigation flow based on your app's state.
Example:
PlayxRoute(
path: '/dashboard',
name: 'dashboard',
builder: (context, state) => DashboardPage(),
binding: DashboardBinding(),
);
As discussed in the previous Route Bindings section.
The PlayxPageConfiguration class allows you to fine-tune the behavior, transitions, and appearance of routes in your application. Whether you need to customize transition durations, manage the modal behavior of a route, or configure state management, PlayxPageConfiguration has you covered.
Key Configuration Options:
- Flexible Settings: Adjust properties such as transition duration, modal behavior, and whether the route should be maintained in memory (
maintainState
). - Comprehensive Configuration: Use
PlayxPageConfiguration
to set up the page title, key, and other important settings. This allows for detailed customization of each route.
Example:
final config = PlayxPageConfiguration.customTransition(
transitionsBuilder: (context, animation, secondaryAnimation, child) {
return FadeTransition(opacity: animation, child: child);
},
transitionDuration: Duration(milliseconds: 500),
opaque: true,
fullscreenDialog: true,
);
With PlayxPageConfiguration, you have the flexibility to adjust nearly every aspect of how your routes are displayed and managed, ensuring that the navigation experience matches your application's needs.
One of the standout features of PlayxRoute is its ability to define custom page transitions or leverage existing transition types like Material, Cupertino, and fade transitions.
Predefined Transition Types:
- Material: Standard Android-style transition.
- Cupertino: iOS-style transition.
- Fade: A simple fade in/out transition.
- Native: Automatically selects the appropriate transition based on the platform.
- None: Disables any transition effects.
Creating a Custom Transition:
To create a custom transition, use the PlayxPageConfiguration.customTransition
constructor. This allows you
to define how the route should animate when it is pushed or popped.
Example:
PlayxRoute(
path: '/custom',
name: 'customRoute',
builder: (context, state) => CustomPage(),
binding: CustomBinding(),
pageConfiguration: PlayxPageConfiguration.customTransition(
transitionsBuilder: (context, animation, secondaryAnimation, child) {
return ScaleTransition(scale: animation, child: child);
},
transitionDuration: Duration(milliseconds: 400),
),
)
In this example, the route uses a ScaleTransition to animate the page with a custom scale effect. The transition duration is set to 400 milliseconds, providing a smooth and customized animation.
For questions, issues, or feature requests, visit the GitHub repository. Contributions are welcome!
- Playx: Ecosystem for redundant features, less code, more productivity, better organizing.
- Playx_core: Core of the Playx ecosystem, helping with app theming and localization.
- Playx_localization: Localization and internationalization for Flutter apps from the Playx ecosystem.
This project is licensed under the MIT License - see the LICENSE file for details.