0

Ok so the problem is in title, i update a state value to use it right after into a React Navigation object who will be send as params to next page.

here my state declaration :

const [dataForDetailsPage, setDataForDetailsPage] = useState('')

here my onPress :

{results.map((item, i) =>
              <ListItem thumbnail key={i} style={{ marginBottom: 5, marginTop: 5 }}>
                    <Left>
                        {itemPicture !== undefined ?
                            <Thumbnail square large source={{ uri: results[i].media.logo.big }} />
                         : <Thumbnail square large source={{ uri: results[i].media.logo.small }} />
                                              }
                   </Left>
                     <Body>
                        <Text style={{ fontWeight: 'bold', fontSize: 16 }}>{item.name}</Text>
                        <Text note numberOfLines={1}>{item.address}</Text>
                        <Text note numberOfLines={1}>{item.postalcode} {item.city}</Text>
                     </Body>
                     <Right >
                        <Text style={s.voirPlusBtnTxt} onPress={() => { goToDetailPage(item.name) }}>Voir +</Text>
                     </Right>
                    </ListItem>
                                    )}

and here my function called onPress event :(had to found a trick but only works on double click cause first time i click i don't enter in second condition somehow even if i change my state value before)

function goToDetailPage(itemName) {
    
    setDataForDetailsPage(itemName)
    console.log('itemName : '+itemName) //itemName return the value i want
    if(dataForDetailsPage === ''){
        setDataForDetailsPage(itemName)
    }

    if(dataForDetailsPage != ''){
        console.log('DataForDetailsPage : '+ dataForDetailsPage) 
        navigation.navigate('Details', {
            nameFromResultsPage: dataForDetailsPage
        })
    }  
}

i tryed to put the function as async function and do a await before setDataForDetailPage but same problem.

Arnaud Rey
  • 25
  • 6

1 Answers1

2

The reason this is happening because the setter function of useState (setDataForDetailsPage) is async which meant that the rest of the code doesn't wait to run until it finishes.

You need to setup a useEffect to run every time dataForDetailsPage is updated.

Like this

useEffect(() => {

    if(dataForDetailsPage != ''){
        console.log('DataForDetailsPage : '+ dataForDetailsPage) 
        navigation.navigate('Details', {
            nameFromResultsPage: dataForDetailsPage
        })
    } 
},[dataForDetailsPage])
Shmili Breuer
  • 3,927
  • 2
  • 17
  • 26