flutterflutter-dependenciesflutter-go-routerflutter-routes

How to use pushReplacment method using go-router package?


How can we use pushReplacment using go-router package

I tried this but didn't work

context.pushReplacement("register"); 

To use the Navigator API with named routes (pushNamed, pushReplacementNamed, or pushNamedAndRemoveUntil), the Navigator must be provided with an onGenerateRoute handler.

Here is my setup

final GoRouter _router = GoRouter(
    debugLogDiagnostics: true,

  routes: <RouteBase>[
    GoRoute(
      path: '/',
      builder: (BuildContext context, GoRouterState state) {
        return const MainPage();
      },
      routes: <RouteBase>[
        GoRoute(
          path: 'login',
          builder: (BuildContext context, GoRouterState state) {
            return const Login();
          },
        ),
        GoRoute(
          path: 'register',
          builder: (BuildContext context, GoRouterState state) {
            return const SignUp();
          },
        ),
        
      ],
    ),
  ],
);

I want to navigate between routes in flutter.


Solution

  • Navigate and Replace: Use the go method of GoRouter to navigate to the new route while ensuring the current route is replaced. Example:

    import 'package:flutter/material.dart';
    import 'package:go_router/go_router.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      MyApp({Key? key}) : super(key: key);
    
      final GoRouter _router = GoRouter(
        routes: [
          GoRoute(
            path: '/',
            builder: (BuildContext context, GoRouterState state) => HomeScreen(),
          ),
          GoRoute(
            path: '/details',
            builder: (BuildContext context, GoRouterState state) => DetailsScreen(),
          ),
        ],
      );
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp.router(
          routerConfig: _router,
          title: 'GoRouter Example',
        );
      }
    }
    
    class HomeScreen extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(title: Text('Home')),
          body: Center(
            child: ElevatedButton(
              onPressed: () {
                // This replaces the current route with the details route
                context.go('/details');
              },
              child: Text('Go to Details'),
            ),
          ),
        );
      }
    }
    
    class DetailsScreen extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(title: Text('Details')),
          body: Center(
            child: Text('Welcome to the Details Screen!'),
          ),
        );
      }
    }
    

    In this example, when you press the button on the HomeScreen, it navigates to the DetailsScreen using context.go('/details'). This effectively replaces the current route in the navigation stack.