skip to Main Content

I am new to React native and i am trying to create a simple flatlist and fill it from Api https://dummyjson.com/products but it never show results …
here is my App.tsx code

import React from 'react';
import type {PropsWithChildren} from 'react';
import {
  FlatList,
  SafeAreaView,
  ScrollView,
  StatusBar,
  StyleSheet,
  Text,
  useColorScheme,
  View,
} from 'react-native';
import ShopList from './ReusableComponents/ShopList';
import axios from 'axios';
import {
  Colors,
  DebugInstructions,
  Header,
  LearnMoreLinks,
  ReloadInstructions,
} from 'react-native/Libraries/NewAppScreen';

type SectionProps = PropsWithChildren<{
  title: string;
}>;


function App(): JSX.Element {
  const isDarkMode = useColorScheme() === 'dark';

  const backgroundStyle = {
    backgroundColor: isDarkMode ? Colors.darker : Colors.lighter,
  };

  const shops: ArrayLike<any> | null | undefined = []




    fetch('https://dummyjson.com/products')
    .then(response => response.json())//hat el jsonresponse law rege3
    .then(result => { shops })

    console.log({shops})

  
  return (
    
    <SafeAreaView style={backgroundStyle}>
      <StatusBar
        barStyle={isDarkMode ? 'light-content' : 'dark-content'}
        backgroundColor={backgroundStyle.backgroundColor}
      />
     
     <ShopList />
      
    </SafeAreaView>
  );
}

const styles = StyleSheet.create({
  sectionContainer: {
    marginTop: 32,
    paddingHorizontal: 24,
  },
  sectionTitle: {
    fontSize: 24,
    fontWeight: '600',
  },
  sectionDescription: {
    marginTop: 8,
    fontSize: 18,
    fontWeight: '400',
  },
  highlight: {
    fontWeight: '700',
  },
  edges: {
    flex: 1,
    alignItems: 'center',
    justifyContent: 'center',
    padding: 5,
    minWidth: 50
  }
});

export default App;

And here is ShopList code

import React, {Component} from 'react';

import {
  View,
  FlatList,
  Image
} from 'react-native'
import ShopListRow from '/Users/nb29042/Desktop/React/DemoShop/ReusableComponents/ShopListRow';
import { ListItem, Avatar } from 'react-native-elements';

export default class ShopList extends Component {
  constructor(props){
    super(props);
    this.state = {
      shops: []
    }
  }


      fetchItem() {
        requestAnimationFrame(() =>
          fetch(`https://dummyjson.com/products`, {
            method: 'GET',
          })
            .then(response => response.json())
            .then(responseJson => {
              this.setState({shops: responseJson})
              // console.warn(this.state.shops);
            })
            .catch(error => {
              {
                alert(error)
              }
            }),
        );
    }
  
    componentDidMount(){
      this.fetchItem()
    }

    
      render() {
        return (

          <View style={{
            flex: 1,
            backgroundColor: '#FFFFFF'
          }}>
    
            
    
            <FlatList
              data = {
                this.state.shops
              }
              renderItem={({ item, index }) => 
                {
                  return <ShopListRow 
                  shop={item} 
                  index={index} 
              
                />}
                
    
              }
              keyExtractor={item => item.id}
              initialNumToRender={16}
              extraData={this.state}
            />

    
          </View>
        );
      }
}

And the ShopListRow Code is:

import React, {Component} from 'react';

import {
  View,
  Text,
  StyleSheet,
  TextInput,
  TouchableHighlight,
  FlatList,
  Image
} from 'react-native'
//import Stars from './Stars';
export default class ShopListRow extends Component {
    render() {

        const {
          shop,
          index
        } = this.props
        
        return (
          <View key={shop.id} style={{ backgroundColor: index % 2 === 0 ? 'white' : '#F3F3F7' }}>
    
            <View style={styles.row}>
              
    
              <View >
                <Text>{shop.title}</Text>
                <Text >{shop.description}</Text>
              </View>
    
              <View style={styles.edges}>
                
                <TouchableHighlight 
                  //onPress={this.infoPressed}
                  style={styles.button}
                  underlayColor='#5398DC'
                >
                  <Text style={styles.buttonText}>Info</Text>
                </TouchableHighlight>
    
    
              </View>
            </View>
    
          </View>
        )
      }
}


const styles = StyleSheet.create({
    row: {
      flexDirection: 'row'
    },
    edges: {
      flex: 1,
      alignItems: 'center',
      justifyContent: 'center',
      padding: 5,
      minWidth: 50
    },
    stars: {
      flex: 1,
      alignItems: 'center',
      flexDirection: 'row',
      justifyContent: 'flex-start',
      padding: 5,
      minWidth: 50
    },
    nameAddress: {
      flexDirection: 'column',
      flex: 8,
      padding: 5
    },
    addressText: {
      color: 'grey'
    },
    button: {
      borderWidth: 1,
      borderColor: '#0066CC',
      borderRadius: 14,
      paddingHorizontal: 10,
      paddingVertical: 3,
      backgroundColor: '#fff',
    },
    buttonText: {
      color: '#0066CC',
      fontSize: 12
    },
    info: {
      marginHorizontal: 40,
      marginVertical: 10,
      padding: 10,
      backgroundColor: '#fff',
      borderWidth: 1,
      borderColor: '#ddd',
      borderRadius: 4
    }
  })
  

if anyone can help me why flatlist results not shown any results i will be thankful…
best regards

2

Answers


  1. In App.tsx you need to: remove the shops array declaration and fetch call from the top-level of your functional component; move the fetch call inside a useEffect hook to fetch the data when the component mounts.

    In ShopList.tsx:

    1. Remove the fetchItem() function.
    2. Replace the constructor with initial state declaration using
      useState hook.
    3. Move the API call to useEffect hook to fetch the data when the
      component mounts.

    To resolve this issue, you can update your code as follows:

    In App.tsx:

    import React, { useState, useEffect } from 'react';
    import type { PropsWithChildren } from 'react';
    import {
      FlatList,
      SafeAreaView,
      StatusBar,
      StyleSheet,
      Text,
      useColorScheme,
      View,
    } from 'react-native';
    import ShopList from './ReusableComponents/ShopList';
    
    type SectionProps = PropsWithChildren<{
      title: string;
    }>;
    
    function App(): JSX.Element {
      const isDarkMode = useColorScheme() === 'dark';
      const backgroundStyle = {
        backgroundColor: isDarkMode ? Colors.darker : Colors.lighter,
      };
    
      const [shops, setShops] = useState<any[]>([]);
    
      useEffect(() => {
        fetch('https://dummyjson.com/products')
          .then((response) => response.json())
          .then((result) => {
            setShops(result);
          })
          .catch((error) => {
            console.error(error);
          });
      }, []);
    
      return (
        <SafeAreaView style={backgroundStyle}>
          <StatusBar
            barStyle={isDarkMode ? 'light-content' : 'dark-content'}
            backgroundColor={backgroundStyle.backgroundColor}
          />
          <ShopList shops={shops} />
        </SafeAreaView>
      );
    }
    
    export default App;
    

    In ShopList.tsx:

    import React, { Component } from 'react';
    import { View, FlatList, Image } from 'react-native';
    import ShopListRow from '/Users/nb29042/Desktop/React/DemoShop/ReusableComponents/ShopListRow';
    import { ListItem, Avatar } from 'react-native-elements';
    
    interface ShopListProps {
      shops: any[];
    }
    
    class ShopList extends Component<ShopListProps> {
      render() {
        const { shops } = this.props;
    
        return (
          <View style={{ flex: 1, backgroundColor: '#FFFFFF' }}>
            <FlatList
              data={shops}
              renderItem={({ item, index }) => {
                return <ShopListRow shop={item} index={index} />;
              }}
              keyExtractor={(item) => item.id.toString()}
              initialNumToRender={16}
            />
          </View>
        );
      }
    }
    
    export default ShopList;
    
    Login or Signup to reply.
  2. The response from https://dummyjson.com/products is an object.

    {
         products: [....]
     }
    

    In your ShopList component, you’re setting the shop’s array to an object. Update your fetch items function and use the products array.

    fetchItem() {
      requestAnimationFrame(() =>
        fetch(`https://dummyjson.com/products`, {
          method: 'GET',
        })
          .then(response => response.json())
          .then(responseJson => {
            this.setState({shops: responseJson.products}) // <--- here
          })
          .catch(error => {
            {
              alert(error)
            }
          }),
      );
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search