'Flutter: Error says - Could not find a generator for route RouteSettings while trying to navigate to another screen

Although questions with such error messages exist in this site, none solves my problem. I have a button and on clicking the button, I just need to go to a different screen. But when ever I tap on the screen, the error shows up.

I first setup a route in MaterialApp and then tried to navigate to that route on tapping the button. The full code and the error message are given below:

Code:

import 'livesession1to1.dart';


class NavigationService {
  static GlobalKey<NavigatorState> navigatorKey =
  GlobalKey<NavigatorState>();
}



Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  runApp(MaterialApp(
    home: CountDownTimer(),
    navigatorKey: NavigationService.navigatorKey, // set property// Added by me later from prev project
    // initialRoute: "/",

    routes: <String, WidgetBuilder> {
      '/liveSession1to1': (context) =>LiveSession1to1(),
    },
  )
  );
}// end of main

class CountDownTimer extends StatefulWidget {
  const CountDownTimer();

  final String? title='';

  @override
  _CountDownTimerState createState() => _CountDownTimerState();
}



class _CountDownTimerState extends State<CountDownTimer> {

  @override
  void initState() {
    super.initState();

  }// end of initstate




  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Live Session'),
      ),
      body: Text('Demo Text'),

      floatingActionButton: Row(
        mainAxisAlignment: MainAxisAlignment.center,

        children: [
          _button(title: "Go", onPressed: () =>
          Navigator.of(context ,rootNavigator: true).pushNamed('/liveSession1to1', arguments: {'room_found': 123 } )
          ),


        ],
      ),

      floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
    );
  }

  Widget _button({required String title, VoidCallback? onPressed}) {
    return Expanded(
        child: TextButton(
          child: Text(
            title,
            style: const TextStyle(color: Colors.white),
          ),
          style: ButtonStyle(
            backgroundColor: MaterialStateProperty.all(Colors.red),
          ),

          onPressed: onPressed,
        ));
  }
}

Error found:

The following assertion was thrown while handling a gesture:

Could not find a generator for route RouteSettings("/liveSession1to1", {room_found: 123}) in the _WidgetsAppState.

Make sure your root app widget has provided a way to generate this route. Generators for routes are searched for in the following order:

  1. For the "/" route, the "home" property, if non-null, is used.
  2. Otherwise, the "routes" table is used, if it has an entry for the route.
  3. Otherwise, onGenerateRoute is called. It should return a non-null value for any valid route not handled by "home" and "routes".
  4. Finally if all else fails onUnknownRoute is called. Unfortunately, onUnknownRoute was not set.

So how to solve the problem ?



Solution 1:[1]

   import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:get_it/get_it.dart';

void main() {
  locatorSetup();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  final _navService = locator<NavigationHandler>();
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        debugShowCheckedModeBanner: false,
        onGenerateRoute: generateRoute,
        navigatorKey: _navService.navigatorKey,
        // I don't know what your first screen is, so I'm assuming it's a Splash Screen
        home: SplashScreen());
  }
}

class SplashScreen extends StatefulWidget {
  const SplashScreen({Key? key}) : super(key: key);

  @override
  State<SplashScreen> createState() => _SplashScreenState();
}

class _SplashScreenState extends State<SplashScreen> {
  final _navService = locator<NavigationHandler>();
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Center(
      child: ElevatedButton(
        onPressed: () {
          _navService.pushNamed(Routes.LiveSession1to1);
        },
        child: Text("Go to next page"),
      ),
    ));
  }
}

class LiveSession1to1 extends StatefulWidget {
  const LiveSession1to1({Key? key}) : super(key: key);

  @override
  State<LiveSession1to1> createState() => _LiveSession1to1State();
}

class _LiveSession1to1State extends State<LiveSession1to1> {
  final _navService = locator<NavigationHandler>();
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Center(
      child: ElevatedButton(
        onPressed: () {
          _navService.goBack();
        },
        child: Text("Go to previous page"),
      ),
    ));
  }
}

GetIt locator = GetIt.instance;

void locatorSetup() {
  locator
      .registerLazySingleton<NavigationHandler>(() => NavigationHandlerImpl());
}

Route<dynamic> generateRoute(RouteSettings settings) {
  switch (settings.name) {
    case Routes.LiveSession1to1:
      return _getPageRoute(view: LiveSession1to1(), routeName: settings.name);
    default:
      return MaterialPageRoute(
        builder: (_) => Scaffold(
          body: Center(
            child: Text('No route defined for ${settings.name}'),
          ),
        ),
      );
  }
}

PageRoute _getPageRoute({String? routeName, Widget? view}) {
  return MaterialPageRoute(
    settings: RouteSettings(
      name: routeName,
    ),
    builder: (_) => view!,
  );
}

class Routes {
  static const String LiveSession1to1 = "liveSession1to1";
}

abstract class NavigationHandler {
  ///Pushes `destinationRoute` route onto the stack
  Future<dynamic>? pushNamed(String destinationRoute, {dynamic arg});

  ///Pushes `destinationRoute` onto stack and removes stack items until
  ///`lastRoute` is hit
  Future<dynamic>? pushNamedAndRemoveUntil(
      String destinationRoute, String lastRoute,
      {dynamic arg});

  ///Pushes `destinationRoute` onto stack with replacement
  Future<dynamic>? pushReplacementNamed(String destinationRoute, {dynamic arg});

  ///Pushes `destinationRoute` after popping current route off stack
  Future<dynamic>? popAndPushNamed(String destinationRoute, {dynamic arg});

  ///Pops current route off stack
  void goBack();

  ///Pops routes on stack until `destinationRoute` is hit
  void popUntil(String destinationRoute);

  ///Exits app
  void exitApp();

  late GlobalKey<NavigatorState> navigatorKey;
}

/// Handles navigation
class NavigationHandlerImpl implements NavigationHandler {
  @override
  late GlobalKey<NavigatorState> navigatorKey;

  /// Constructs a NavigationHandler instance
  NavigationHandlerImpl({GlobalKey<NavigatorState>? navigatorKey}) {
    this.navigatorKey = navigatorKey ?? GlobalKey<NavigatorState>();
  }

  NavigatorState? get state => navigatorKey.currentState;

  @override
  void exitApp() {
    SystemChannels.platform.invokeMethod('SystemNavigator.pop');
  }

  @override
  void goBack() {
    if (state != null) {
      return state!.pop();
    }
  }

  @override
  Future? popAndPushNamed(String destinationRoute, {arg}) {
    if (state != null) {
      return state!.popAndPushNamed(destinationRoute, arguments: arg);
    }
  }

  @override
  void popUntil(String destinationRoute) {
    if (state != null) {
      return state!.popUntil(ModalRoute.withName(destinationRoute));
    }
  }

  @override
  Future? pushNamed(String destinationRoute, {arg}) {
    if (state != null) {
      return state!.pushNamed(destinationRoute, arguments: arg);
    }
  }

  @override
  Future? pushNamedAndRemoveUntil(String destinationRoute, String lastRoute,
      {arg}) {
    if (state != null) {
      return state!.pushNamedAndRemoveUntil(
        destinationRoute,
        ModalRoute.withName(lastRoute),
        arguments: arg,
      );
    }
  }

  @override
  Future? pushReplacementNamed(String destinationRoute, {arg}) {
    if (state != null) {
      return state!.pushReplacementNamed(destinationRoute, arguments: arg);
    }
  }
}

Here is a clip

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1