'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 |
