Search code examples
javascriptreactjsreact-nativees6-promisereact-native-component

React Native CameraRoll.getPhotos API doesn't render the results


Hi I have the following class where I am trying to get the photos from camera roll and display it.

class CameraRollProject extends Component {
  constructor(props) {
    super(props);
    this.state = {
     images: []
    };
  }

  componentWillMount() {
    const fetchParams = {
      first: 25,
    };
    CameraRoll.getPhotos(fetchParams, this.storeImages, this.logImageError);
  }

  storeImages(data) {
    const assets = data.edges;
    const images = assets.map((asset) => asset.node.image);
    this.state.images =  images;
  }

  logImageError(err) {
    console.log(err);
  }

  render() {
      return (
        <ScrollView style={styles.container}>
          <View style={styles.imageGrid}>
            { this.state.images.map((image) => <Image style={styles.image} source={{ uri: image.uri }} />) }
          </View>          
        </ScrollView>
      );
  }
};

export default CameraRollProject;

The issue is my render function is getting called before my CameraRoll.getPhotos promise get resolved. So I don't get any photos.

To solve this issue I changed my program into following

render() {
      return CameraRoll.getPhotos(fetchParams, this.storeImages, this.logImageError)
        .then(() => {
          return (
            <ScrollView style={styles.container}>
              <View style={styles.imageGrid}>
                { this.state.images.map((image) => <Image style={styles.image} source={{ uri: image.uri }} />) }
              </View>          
            </ScrollView>
          );
        });
  }

However this give me the following error

Error screen

What can I do in above situation? How can I make sure the render only works after the CameraRoll.getPhotos get resolved.


Solution

  • So I resolved this issue. The main reason for my problem was I was not using CameraRoll.getPhotos properly as a Promise. I was passing incorrect parameter inside the function. To solve this I got rid of the following functions

     storeImages(data) {
        const assets = data.edges;
        const images = assets.map((asset) => asset.node.image);
        this.state.images =  images;
      }
    
      logImageError(err) {
        console.log(err);
      }
    

    And make my CameraRoll.getPhotos like the following

    CameraRoll.getPhotos({first: 5}).then(
      (data) =>{
        const assets = data.edges
        const images = assets.map((asset) => asset.node.image);
            this.setState({
              isCameraLoaded: true,
              images: images
            })
      },
      (error) => {
         console.warn(error);
      }
    );
    

    Here is my complete code to get pictures from CameraRoll in react-native just in case anyone interested

    class CameraRollProject extends Component {
      constructor(props) {
        super(props);
        this.state = {
         images: [],
         isCameraLoaded: false
        };
      }
    
      componentWillMount() {
        CameraRoll.getPhotos({first: 5}).then(
          (data) =>{
            const assets = data.edges;
            const images = assets.map((asset) => asset.node.image);
            this.setState({
              isCameraLoaded: true,
              images: images
            })
          },
          (error) => {
            console.warn(error);
          }
        );
      }
    
      render() {
          if (!this.state.isCameraLoaded) {
            return (
              <View>
                <Text>Loading ...</Text>
              </View>
              );
          }
          return (
            <ScrollView style={styles.container}>
              <View style={styles.imageGrid}>
                { this.state.images.map((image) => <Image style={styles.image} source={{ uri: image.uri }} />) }
              </View>          
            </ScrollView>
          );
      }
    };
    
    export default CameraRollProject;