javascript - React Native: Console Error Can't find variable: task (Image upload and store with Firebase)
问题描述
I have followed a tutorial on uploading photos to Firebase storage using react-native and although it is over a year old and I have had to make a couple of small changes I believe it should still work (for example showImagePicker no longer exists so I replaced it with launchImageLibrary).
This is my UploadScreen.js file:
import * as React from 'react';
import {useState} from 'react';
import {
View,
SafeAreaView,
Text,
TouchableOpacity,
StyleSheet,
Platform,
Alert,
Image,
} from 'react-native';
import * as ImagePicker from 'react-native-image-picker';
import storage from '@react-native-firebase/storage';
import * as Progress from 'react-native-progress';
export default function UploadScreen() {
const [image, setImage] = useState('');
const [uploading, setUploading] = useState(false);
const [transferred, setTransferred] = useState(0);
const selectImage = () => {
const options = {
maxWidth: 2000,
maxHeight: 2000,
storageOptions: {
skipBackup: true,
path: 'images',
},
};
ImagePicker.launchImageLibrary(options, response => {
if (response.didCancel) {
console.log('User cancelled image picker');
} else if (response.error) {
console.log('ImagePicker Error: ', response.error);
} else if (response.customButton) {
console.log('User tapped custom button: ', response.customButton);
} else {
const source = {uri: response?.uri};
console.log(source);
setImage(source);
}
});
};
const uploadImage = async () => {
const {uri} = image;
if (uri) {
const filename = uri.substring(uri.lastIndexOf('/') + 1);
const uploadUri =
Platform.OS === 'ios' ? uri.replace('file://', '') : uri;
setUploading(true);
setTransferred(0);
const task = storage().ref(filename).putFile(uploadUri);
// set progress state
task.on('state_changed', snapshot => {
setTransferred(
Math.round(snapshot.bytesTransferred / snapshot.totalBytes) * 10000,
);
});
}
try {
await task;
} catch (e) {
console.error(e);
}
setUploading(false);
Alert.alert(
'Photo uploaded!',
'Your photo has been uploaded to Firebase Cloud Storage!',
);
setImage('');
};
return (
<SafeAreaView style={styles.container}>
<TouchableOpacity style={styles.selectButton} onPress={selectImage}>
<Text style={styles.buttonText}>Pick an image</Text>
</TouchableOpacity>
<View style={styles.imageContainer}>
{image !== '' && image !== undefined && (
<Image source={{uri: image?.uri}} style={styles.imageBox} />
)}
{uploading ? (
<View style={styles.progressBarContainer}>
<Progress.Bar progress={transferred} width={300} />
</View>
) : (
<TouchableOpacity style={styles.uploadButton} onPress={uploadImage}>
<Text style={styles.buttonText}>Upload image</Text>
</TouchableOpacity>
)}
</View>
</SafeAreaView>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
backgroundColor: '#bbded6',
},
selectButton: {
borderRadius: 5,
width: 150,
height: 50,
backgroundColor: '#8ac6d1',
alignItems: 'center',
justifyContent: 'center',
},
selectButton2: {
borderRadius: 5,
width: 150,
height: 50,
backgroundColor: '#8ac6d1',
alignItems: 'center',
justifyContent: 'center',
marginTop: 20,
},
uploadButton: {
borderRadius: 5,
width: 150,
height: 50,
backgroundColor: '#ffb6b9',
alignItems: 'center',
justifyContent: 'center',
marginTop: 20,
},
buttonText: {
color: 'white',
fontSize: 18,
fontWeight: 'bold',
},
imageContainer: {
marginTop: 30,
marginBottom: 50,
alignItems: 'center',
},
progressBarContainer: {
marginTop: 20,
},
imageBox: {
width: 300,
height: 300,
},
});
When I run this as an ios app on my phone I get this error once pressing the Upload File button:
which seems to be something to do with this code here...
I'm not really sure what to do from here as I'm fairly new to React Native so any help with what the error means and how to fix it would be appreciated! Thank you.
解决方案
您将task
中的第一个块定义为局部常量uploadImage
,这意味着第二个块中的代码找不到它。
为了解决这个问题,我将task
向上拉到一个函数级变量中:
const uploadImage = async () => {
const {uri} = image;
let task; // Add this
if (uri) {
const filename = uri.substring(uri.lastIndexOf('/') + 1);
const uploadUri =
Platform.OS === 'ios' ? uri.replace('file://', '') : uri;
setUploading(true);
setTransferred(0);
task = storage().ref(filename).putFile(uploadUri); // Remove const here
// set progress state
task.on('state_changed', snapshot => {
setTransferred(
Math.round(snapshot.bytesTransferred / snapshot.totalBytes) * 10000,
);
});
}
try {
await task;
} catch (e) {
console.error(e);
}
推荐阅读
- c# - 如何更改标签文本的日期格式
- c++ - CfSetInSyncState 的行为不像记录的那样。(CfAPI)
- ruby - gem安装openssl冲突?
- javascript - How can I toggle my sidebar by using just javascript?
- php - 如何使用 PHP 开发工具包在 AWS Pinpoint 中发送简单的电子邮件?
- angular - 角度的引导轮播
- php - 如何修复保存到数据库字符 è 变成 `e
- python-3.x - 为什么在文本文件中写入数字需要很多时间?
- c# - 避免使用 SQLite 锁定表
- netsuite - NetSuite 通过客户端脚本设置销售订单项目价格