【问题标题】:react native make reuseable function for image picker反应原生使图像选择器的可重用功能
【发布时间】:2019-05-22 03:51:41
【问题描述】:

我正在尝试使用 react-native imagepicker 库进行可重复使用的功能,但是当我导入该功能时,我从导入它的组件中得到了未定义。使用console.log,我看到它确实在工作。它只是没有显示上传的图像。

我尝试返回源和实际功能,但它不起作用

helperfunction.js

import ImagePicker from 'react-native-image-picker';


export const photoUpload =()=>{
    const options = {
        title: 'Select Avatar',
        camera: [{ name: 'fb', title: 'Take a picture' }],
        storageOptions: {
          skipBackup: true,
          path: 'images',
        },
      };


     const action = ImagePicker.showImagePicker(options, (response) => {
        console.log('Response = ', response);

        if (response.didCancel) {
          console.log('User cancelled image picker');
        } else if (response.error) {
          console.log('ImagePicker Error: ', response.error);
        } else if (response.camera) {
          console.log('User tapped custom button: ', response.camera);
        } else {
          const source = { uri: response.uri };
          console.log(source)
           return  source; 

        }
      })
      return action;



}

App.js

import {photoUpload} from '../../../utilities/helper/photoUpload'

handlePhotoUpload =  async () =>{

    const data = await photoUpload()

    console.log(data) (this comes back undefined)
    if (data){
      this.setState({
        photo: data

      });
    }

  }

【问题讨论】:

    标签: react-native react-native-image-picker


    【解决方案1】:

    如果您从文档中查看 showImagePicker 函数的签名,您会发现它没有返回值:

    静态showImagePicker(选项?,回调)

    您仍然可以从控制台日志中看到结果的原因是,当您调用 showImagePicker 函数时,它正在异步调用您的回调函数。要解决此问题,您可以使用如下承诺:

    export const photoUpload = () => {
        const options = {
            title: 'Select Avatar',
            camera: [{name: 'fb', title: 'Take a picture'}],
            storageOptions: {
                skipBackup: true,
                path: 'images',
            },
        };
        return new Promise(((resolve, reject) => {
            ImagePicker.showImagePicker(options, (response) => {
                if (response.didCancel) {
                    reject('User cancelled image picker');
                } else if (response.error) {
                    reject('ImagePicker Error: ', response.error);
                } else if (response.camera) {
                    reject('User tapped custom button: ', response.camera);
                } else {
                    const source = {uri: response.uri};
                    resolve(source);
                }
            })
        }))
    }
    

    您可以保留您的 app.js,因为您已经在等待 promise 解决,使用 'await' 表示数据变量将产生来自 promise 的源结果对象

    【讨论】:

    • 谢谢,这行得通,问题是我不能用 await 代替 resolve reject 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多