Search code examples
react-nativereact-native-image

Image not showing when mapping an array and render an image


I have this array of images in my project.

this.state.destinations = [{
    "destinationId": "001",
    "img": "../../assets/img/destinations/001.png"
  },
  {
    "destinationId": "002",
    "img": "../../assets/img/destinations/002.png"
  },
  {
    "destinationId": "003",
    "img": "../../assets/img/destinations/003.png"
  }]
}

I am trying to repeat each of them inside a View in a Image component like this:

render() {

    var {navigate} = this.props.navigation;

    return (
        <LinearGradient 
          colors={['#514A9D', '#24C6DC']} start={[0.0, 0.5]} end={[1.0, 0.5]} locations={[0.0, 1.0]} style={{flex:1}}>
            <ScrollView>
              {
                <View style={{paddingTop: 24}}>
                  {
                    this.state.destinations.map(dest => {
                      return <Image style={{height: 200, width: 600}} key={dest.destinationId} source={require(dest.img)} resizeMode="contain" />
                    })
                  }
                </View>
              }
            </ScrollView>
        </LinearGradient>
    );
  }

But I getting some crazy error in my phone when trying to run:

Error

I trying to run the app in expo and I am just developing it in react-native mode, not react-native-init mode.


Solution

  • Try refactoring your code in the following way, moving your use of require directly to where your data is defined so that the static resource path is evaluated correctly:

    this.state.destinations = [{
        "destinationId": "001",
        "img": require("../../assets/img/destinations/001.png")
      },
      {
        "destinationId": "002",
        "img": require("../../assets/img/destinations/002.png")
      },
      {
        "destinationId": "003",
        "img": require("../../assets/img/destinations/003.png")
      }]
    }
    

    And then update the way you render <Image /> like so, removing the call to require() and referencing dest.img directly:

    this.state.destinations.map(dest => {
      return <Image source={dest.img}
               key={dest.destinationId}
               style={{height: 200, width: 600}} 
               resizeMode='contain' />
    })
    

    Hope this helps!