Passing Data Using React-Native Navigation
Solution 1:
In your code, props.navigation
and this.props.navigation.state
are two different things. You should try this in your second screen:
const {state} = props.navigation;
console.log("PROPS " + state.params.user);
the const {state}
line is only here to get an easy to read code.
Solution 2:
All the other answers now seem outdated. In the current react navigation version, ("@react-navigation/native": "^5.0.8",
), you first pass value between one screen from another like this:
function HomeScreen({ navigation }) {
return (
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
<Text>Home Screen</Text>
<Button
title="Go to Details"
onPress={() => {
/* 1. Navigate to the Details route with params, passing the params as an object in the method navigate */
navigation.navigate('Details', {
itemId: 86,
otherParam: 'anything you want here',
});
}}
/>
</View>
);
}
and then in the component you are redirecting, you get the data you passed like this:
function DetailsScreen({ route, navigation }) {
/* 2. Get the param */
const { itemId } = route.params;
const { otherParam } = route.params;
return (
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
<Text>Details Screen</Text>
<Text>itemId: {JSON.stringify(itemId)}</Text>
<Text>otherParam: {JSON.stringify(otherParam)}</Text>
</View>
);
}
So, basically, the data now is inside this.props.route.params
. In those examples above, I showed how to get them from functional components, but in class components is similar, I did something like this:
First I passed the data from this ProfileButton, within it's handleNavigate
function, like this:
// these ProfileButton and ProfileButtonText, are a Button and a Text, respectively,
// they were just styled with styled-components
<ProfileButton
onPress={() => this.handleNavigate(item)
<ProfileButtonText>
check profile
</ProfileButtonText>
</ProfileButton>
where the handleNavigate
goes like this:
handleNavigate = user => {
// the same way that the data is passed in props.route,
// the navigation and it's method to navigate is passed in the props.
const {navigation} = this.props;
navigation.navigate('User', {user});
};
Then, the function HandleNavigate redirects to the user page, which is a class component, and I get the data like this:
import React, {Component} from 'react';
import {View, Text} from 'react-native';
export default class User extends Component {
state = {
title: this.props.route.params.user.name,
};
render() {
const {title} = this.state;
return (
<View>
<Text>{title}</Text>
</View>
);
}
}
In class components, the way I found out is making this quite long line title: this.props.route.params.user.name,
but it works. If anyone knows how to make it shorter in the current version of react-native navigation, please enlighten me. I hope this solves your problem.
Solution 3:
First Class
<Button onPress = {
() => navigate("ScreenName", {name:'Jane'})
} />
Second Class
const {params} = this.props.navigation.state