I have a problem here, I am doing my project to make a Daily Fashion apps but I got stuck with that error that happen because my route.params
I have 2 files right here:
HomeScreen.js:
import {
View,
Text,
StyleSheet,
Image,
FlatList,
TouchableOpacity,
} from 'react-native';
import React from 'react';
import {imageSlider} from '../../data/Data';
import {SliderBox} from 'react-native-image-slider-box';
import {categoryList} from '../../data/Data';
const HomeScreen = props => {
const {navigation} = props;
return (
<View style={styles.mainContainer}>
<SliderBox
images={imageSlider}
autoplay={true}
circleLoop={true}
sliderBoxHeight={250}
/>
<View style={styles.titleContainer}>
<Text style={styles.text}>Categories</Text>
</View>
<FlatList
data={categoryList}
key={3}
numColumns={3}
keyExtractor={item => item.id}
contentContainerStyle={styles.flatListContainer}
showsVerticalScrollIndicator={false}
renderItem={({item}) => {
return (
<TouchableOpacity
style={styles.button}
onPress={() =>
navigation.navigate('ShowProduct', {categoryId: item.id})
}>
<Image source={{uri: item.icon}} style={styles.icon} />
<Text style={styles.itemName}>{item.name}</Text>
</TouchableOpacity>
);
}}
/>
</View>
);
};
const styles = StyleSheet.create({
mainContainer: {
backgroundColor: 'white',
flex: 1,
},
titleContainer: {
marginTop: 16,
alignItems: 'center',
},
text: {
fontSize: 18,
fontWeight: 'bold',
color: 'black',
},
flatListContainer: {
padding: 8,
},
button: {
flex: 1,
margin: 8,
borderWidth: 1,
borderColor: '#7CAF58',
borderRadius: 10,
height: 130,
justifyContent: 'center',
alignItems: 'center',
},
icon: {
width: 100,
height: 100,
resizeMode: 'contain',
},
itemName: {
color: 'black',
},
});
export default HomeScreen;
and also I have ShowProductScreen.js right here:
import {
StyleSheet,
Text,
View,
FlatList,
Image,
TextInput,
TouchableOpacity,
} from 'react-native';
import {Icon} from 'react-native-elements';
import React, {useEffect, useState} from 'react';
import realm from '../../store/realm';
const ShowProductScreen = props => {
const {route} = props;
const category = route.params.categoryId;
const [data, setData] = useState([]);
const collectData = () => {
const allData = realm.objects('Product').filtered(`category = ${category}`);
setData(allData);
};
useEffect(() => {
const productPage = navigation.addListener('focus', () => {
collectData();
});
return productPage;
}, []);
return (
<View style={styles.mainContainer}>
<FlatList
data={data}
contentContainerStyle={styles.flatListContainer}
keyExtractor={item => item.id}
renderItem={({item}) => {
return (
<TouchableOpacity style={styles.itemButton}>
<View style={styles.productContainer}>
<Image style={styles.image} source={{uri: item.imagePath}} />
<View style={styles.textContainer}>
<Text style={styles.title}>{item.productName}</Text>
<Text style={styles.text}>{item.description}</Text>
<Text style={styles.text}>$ {item.price}</Text>
</View>
</View>
<TouchableOpacity>
<Icon name="shoppingcart" type="antdesign" size={30} />
</TouchableOpacity>
</TouchableOpacity>
);
}}
/>
</View>
);
};
export default ShowProductScreen;
const styles = StyleSheet.create({
mainContainer: {
flex: 1,
backgroundColor: 'white',
},
flatListContainer: {
padding: 8,
},
itemButton: {
margin: 8,
padding: 16,
borderColor: '#7CAF58',
borderWidth: 1,
borderRadius: 10,
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
},
productContainer: {
flex: 1,
flexDirection: 'row',
},
image: {
width: 100,
height: 100,
},
textContainer: {
flex: 1,
marginLeft: 16,
justifyContent: 'center',
},
title: {
color: 'black',
fontSize: 18,
fontWeight: 'bold',
},
text: {
color: 'black',
fontSize: 16,
},
});
and the error is navigating to the line that contains:
const category = route.params.categoryId
I really confused to solve that right now because I have tried so many ways to solve that from Stack Overflow and until now I don’t know how to solve that so I consider to ask in this forum. Can you help me to solve that?
2
Answers
if it’s saying ‘Cannot read property ‘categoryId’ of undefined’, is not the categoryId that is undefined but the params.
try: route?.params?.categoryId
maybe in the first render the property isn’t available.
i also recommend to put everything that is coming undefined in a useEffect hook with console.log, helps a lot to understand whats is happening.
Use hooks i.e. useRoute() instead of props routes