4

I just updated to react native navigation version 5. Now I am trying to send data back to previous screen on goBack() call.

I push next view with

const onSelectCountry = item => {
    console.log(item);
};

navigation.navigate('SelectionScreen', {
        onSelect: onSelectCountry});

And making move back after selecting item from FlatList with call:

function onSelectedItem(item) {
    route.params.onSelect(item);
    navigation.goBack();
}

But by sending function over with params I get a warning: Non-serializable valuse were found in the navigation state...

Can someone please tell me correct way to do this.

schmru
  • 591
  • 3
  • 8
  • 29

3 Answers3

6

heres is an implementaion

scereen A

const Screen1 = ({navigation, route}) => {
  const [item, setItem] = useState(null);

  useEffect(() => {
    navigation.addListener('focus', () => {
      console.log(route.params)
    })
  }, [])  

  const onPress = () => {
    navigation.navigate('Screen2', {onReturn: (item) => {
      setItem(item)
    }})
  }
  return (
    // Components
  )
}

Screen2:

const Screen2 = ({navigation, route}) => {

  useEffect(() => {
    navigation.addListener('focus', () => {
      console.log(route.params)
    })
  }, [])  

  // back Press
  const onPress = () => {
    route.params.onReturn(item);
    navigation.goBack()
  }

  return (
    // Components
  )
}
Ashwith Saldanha
  • 1,700
  • 1
  • 5
  • 15
0

navigation send data to screens.

onPress={() => {
          // Pass params back to home screen
          navigation.navigate('Home', { post: postText });

follow official documentation React Native

Raushan Singh
  • 1,070
  • 1
  • 9
  • 18
  • Was trying to find a way to work with goBack() function, but it looks like this is the only way or using global state (something like Redux), which I don't want to do for this kind of data. Thanks anyway. – schmru Mar 03 '20 at 10:03
0

I visited this post because I wanted to use the same common component in 2 stacks. How to know how to go back and pass params?

I solved it by passing first a parameter to go there, which will identify where the component is accessed from. Then, instead of using goBack(), which doesn't accept parameters, I navigate to the previous route and pass the parameter.

//in Stack1
navigation.navigate('commonComponent', isStack1: true)
//in Stack2
navigation.navigate('commonComponent', isStack1: false)
//in CommonComponent, instead of goback(), use navivation.navigate

function CommonComponent({ navigation, route }) {
  const {isStack1} = route.params
  const customRoute = isStack1 ? 'routeNameInStack1' : 'routeNameInStack2'
  return (
    <Button title="Go back" onPress={() => navigation.navigate('customRoute', {myParams: 'blabla...') />
  )
}
Raphael Pinel
  • 2,352
  • 24
  • 26