So I’m building an app where i send notification to the user when there’s an update. Once the user receives it, on clicking, I want to navigate to a specific screen in my app.
The problem is, to do that I have to use a navigation reference to be able to access the navigation object. I did read the doc, but once applying it I get the following error:
JavaScript
x
3
1
The action 'NAVIGATE' with payload {"name":"HomeScreen","params":{"userName":"Lucy"}} was not handled by any navigator.
2
Do you have a screen named 'HomeScreen'?
3
RootNavigation.js:
JavaScript
1
10
10
1
import * as React from 'react';
2
import { createNavigationContainerRef } from '@react-navigation/native';
3
4
export const navigationRef = createNavigationContainerRef()
5
6
export function navigate(name, params) {
7
navigationRef.current?.navigate(name, params);
8
}
9
}
10
App.js:
JavaScript
1
19
19
1
import React, { useState } from "react";
2
import { StyleSheet, Text, View } from "react-native";
3
4
5
import AppNavigator from "./app/navigation/AppNavigator";
6
import { NavigationContainer } from "@react-navigation/native";
7
import {navigationRef} from "./app/navigation/rootNavigation";
8
9
export default function App() {
10
11
return (
12
<AuthContext.Provider>
13
<NavigationContainer ref={navigationRef}>
14
<AppNavigator />
15
</NavigationContainer>
16
</AuthContext.Provider>
17
);
18
}
19
AppNavigator.js:
JavaScript
1
55
55
1
import React, {useEffect, useContext} from "react";
2
import HomeScreen from "../screens/Home/HomeScreen";
3
import DashboardScreen from "../screens/Home/DashboardScreen";
4
5
import { createDrawerNavigator } from "@react-navigation/drawer";
6
import FolderNavigator from "./FolderNavigator";
7
import * as Notifications from "expo-notifications";
8
import * as RootNavigation from "./rootNavigation";
9
import AuthNavigator from "./AuthNavigator";
10
const Drawer = createDrawerNavigator();
11
12
13
const AppNavigator = ({}) => {
14
15
useEffect(() =>{
16
registerForPushNotifications()
17
Notifications.addNotificationReceivedListener(notification =>{
18
RootNavigation.navigate('HomeScreen', { userName: 'Lucy' });
19
})
20
21
},[])
22
23
const registerForPushNotifications = async ( ) => {
24
try {
25
const permissions = await Notifications.getPermissionsAsync();
26
if (!permissions.granted) return;
27
/*const token = await Notifications.getExpoPushTokenAsync()*/
28
const token = (await Notifications.getExpoPushTokenAsync()).data;
29
/*await expoPushTokenApi.register(token, user.guid)*/
30
/*console.log(token)*/
31
} catch (error){
32
console.log(error)
33
}
34
35
};
36
37
return (
38
<Drawer.Navigator>
39
<Drawer.Screen
40
name="Dashboard"
41
component={DashboardScreen}
42
/>
43
<Drawer.Screen
44
name="Liste des dossiers"
45
component={FolderNavigator}
46
/>
47
<Drawer.Screen
48
name="Liste des clients"
49
component={HomeScreen}
50
/>
51
</Drawer.Navigator>
52
)};
53
54
export default AppNavigator;
55
FolderNavigator.js:
JavaScript
1
24
24
1
import React from "react";
2
import { createNativeStackNavigator } from "@react-navigation/native-stack";
3
import HomeScreen from "../screens/Home/HomeScreen";
4
import FolderDetails from "../screens/FolderDetails";
5
6
const Stack = createNativeStackNavigator();
7
8
const FolderNavigator = () => (
9
<Stack.Navigator>
10
<Stack.Screen
11
name="Liste des dossiers"
12
component={HomeScreen}
13
options={{ headerShown: false }}
14
/>
15
<Stack.Screen
16
name="Détails"
17
component={FolderDetails}
18
options={{ headerTitle: "", headerBackTitle: "" }}
19
/>
20
</Stack.Navigator>
21
);
22
23
export default FolderNavigator;
24
Directory structure:
Advertisement
Answer
This line RootNavigation.navigate('HomeScreen', { userName: 'Lucy' })
is causing the error, because when setting up your navigation, you didn’t name any screen HomeScreen
, I’m talking about Stack.Screen
‘s name
property and Drawer.Screen
‘s name
property.