'Flutter routing after v2 upgrade null check operator

I have recently updated my flutter project to the V2 sdk I am having an issue with the null check operator for my routing when I try and click on a route the following error comes up Null check operator used on a null value I understand what it means but for some reason my navigatorkey.currentState keeps coming back as null even though it is set in the MaterialApp

Below is my navigation file

import 'package:flutter/material.dart';

class Navigation {

  static Navigation instance = Navigation();
  GlobalKey<NavigatorState>? navigatorKey = new GlobalKey<NavigatorState>();


  Future<dynamic> navigateToReplacement(String newRoute) {
    return navigatorKey!.currentState!.pushReplacementNamed(newRoute);
  }

  Future<dynamic> navigateTo(String newRoute) {
    return navigatorKey!.currentState!.pushNamed(newRoute);
  }

  Future<dynamic> navigateToPage(MaterialPageRoute newRoute) {
    return navigatorKey!.currentState!.push(newRoute);
  }

  goBack() {
    return navigatorKey!.currentState!.pop();
  }
}

And this is my main.dart file before the upgrade I was not having this issue

import 'package:eventapp/screens/auth/forgotPassword.dart';
import 'package:eventapp/screens/events/add_event.dart';
import 'package:eventapp/services/messaging.dart';
import 'package:flutter/material.dart';
import 'package:eventapp/services/navigation.dart';
import 'package:eventapp/screens/auth/sign_in.dart';
import 'package:eventapp/screens/auth/register.dart';
import 'package:eventapp/screens/home/home.dart';
import 'package:overlay_support/overlay_support.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:get_it/get_it.dart';

GetIt getIt = GetIt.instance;

void main() async {
  getIt.registerLazySingleton(() => Navigation());
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  final PushNotificationsManager _pushnotifications =
      PushNotificationsManager();
  final Navigation _navigation = Navigation();

  @override
  Widget build(BuildContext context) {
    _pushnotifications.init();
    return OverlaySupport(
        child: MaterialApp(
      navigatorKey: _navigation.navigatorKey,
      theme: ThemeData(
        brightness: Brightness.dark,
        primaryColor: Color.fromRGBO(112, 17, 15, 1),
        backgroundColor: Color.fromRGBO(14, 12, 10, 5),
      ),
      onGenerateRoute: (routeSettings) {
        switch (routeSettings.name) {
          case 'login':
            return MaterialPageRoute(builder: (context) => SignIn());
          case 'register':
            return MaterialPageRoute(builder: (context) => Registration());
          case 'forgotPassword':
            return MaterialPageRoute(builder: (context) => ForgotPassword());
          case 'addEvent':
            return MaterialPageRoute(builder: (context) => AddEvent());
          default:
            return MaterialPageRoute(builder: (context) => EventList());
        }
      },
      initialRoute: 'login',
    ));
  }
}

Could someone tell me if there is something wrong here?



Solution 1:[1]

Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const SignforgotPassword()));

Solution 2:[2]

Did you set navigatorKey in your MaterialApp?

Should be something like navigatorKey: NavigationService.navigatorKey

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 keikai
Solution 2 1encore