我正在将image_picker库https://pub.dartlang.org/packages/image_picker用于选择/拍摄要上传的照片。到目前为止,代码已成功将映像成功上传到Firebase存储,唯一的问题是,在映像上传后,应用程序关闭了(并没有真正崩溃,它只是关闭了,而VS代码松开了与设备的连接)。代码如下:
File _image;
Future _takeProfilePicture() async{
var image = await ImagePicker.pickImage(source: ImageSource.camera);
setState((){
_image = image;
});
}
Future _selectProfilePicture() async{
var image = await ImagePicker.pickImage(source: ImageSource.gallery);
setState((){
_image = image;
});
}
Future<Null> _uploadProfilePicture() async{
FirebaseUser user = await FirebaseAuth.instance.currentUser();
final StorageReference ref = FirebaseStorage.instance.ref().child('${user.email}/${user.email}_profilePicture.jpg');
final StorageUploadTask uploadTask = ref.putFile(_image);
final Uri downloadUrl = (await uploadTask.future).downloadUrl;
}
void _selectAndUploadPicture() async{
await _selectProfilePicture();
await _uploadProfilePicture();
}
void _takeAndUploadPicture() async{
await _takeProfilePicture();
await _uploadProfilePicture();
}
终端将显示以下内容:
W/Firestore( 6873): (0.6.6-dev) [Firestore]: The behavior for java.util.Date objects stored in Firestore is going to change AND YOUR APP MAY BREAK.
W/Firestore( 6873): To hide this warning and ensure your app does not break, you need to add the following code to your app before calling any other Cloud Firestore methods:
W/Firestore( 6873):
W/Firestore( 6873): FirebaseFirestore firestore = FirebaseFirestore.getInstance();
W/Firestore( 6873): FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
W/Firestore( 6873): .setTimestampsInSnapshotsEnabled(true)
W/Firestore( 6873): .build();
W/Firestore( 6873): firestore.setFirestoreSettings(settings);
W/Firestore( 6873):
W/Firestore( 6873): With this change, timestamps stored in Cloud Firestore will be read back as com.google.firebase.Timestamp objects instead of as system java.util.Date objects. So you will also need to update code expecting a java.util.Date to instead expect a Timestamp. For example:
W/Firestore( 6873):
W/Firestore( 6873): // Old:
W/Firestore( 6873): java.util.Date date = snapshot.getDate("created_at");
W/Firestore( 6873): // New:
W/Firestore( 6873): Timestamp timestamp = snapshot.getTimestamp("created_at");
W/Firestore( 6873): java.util.Date date = timestamp.toDate();
W/Firestore( 6873):
W/Firestore( 6873): Please audit all existing usages of java.util.Date when you enable the new behavior. In a future release, the behavior will be changed to the new behavior, so if you do not follow these steps, YOUR APP MAY BREAK.
我尝试从终端实施建议的Java代码,但是我似乎找不到使用cloud_firestore库https://pub.dartlang.org/packages/cloud_firestore在flutter中编写等效代码的方法,它没有与FirebaseFirestoreSettings等效的代码(或者我似乎无法找到一个)。有办法解决吗?
提前谢谢!
答案 0 :(得分:6)
mmccabe答案的更新版本,该版本可与firebase_storage插件的1.0.4
版一起使用
Future<String> _pickSaveImage(String imageId) async {
File imageFile = await ImagePicker.pickImage(source: ImageSource.camera);
StorageReference ref =
FirebaseStorage.instance.ref().child(imageId).child("image.jpg");
StorageUploadTask uploadTask = ref.putFile(imageFile);
return await (await uploadTask.onComplete).ref.getDownloadURL();
}
到目前为止,您必须执行以下操作:
var downloadURL =(等待uploadTask.onComplete).ref.getDownloadURL();
答案 1 :(得分:2)
以下对我有用:
Future<Uri> _pickSaveImage(String imageId) async {
File imageFile = await ImagePicker.pickImage(source: ImageSource.camera);
StorageReference ref =
FirebaseStorage.instance.ref().child(imageId).child("image.jpg");
StorageUploadTask uploadTask = ref.putFile(imageFile);
return (await uploadTask.future).downloadUrl;
}
答案 2 :(得分:0)
Future<String> _pickSaveImage(String imageId) async {
File imageFile = await ImagePicker.pickImage(source: ImageSource.camera);
StorageReference ref =
FirebaseStorage.instance.ref().child(imageId).child("image.jpg");
StorageUploadTask uploadTask = ref.putFile(imageFile);
return await (await uploadTask.onComplete).ref.getDownloadURL();
}
到目前为止,
这会导致错误:
返回等待状态(等待uploadTask.onComplete).ref.getDownloadURL();
这不是
:返回(等待uploadTask.onComplete).ref.getDownloadURL();
错误消息:
The getter 'future' isn't defined for the class 'StorageUploadTask'.
undefined_getter at [timetracker] lib/screens/image_detection.dart:63)
答案 3 :(得分:0)
这对我有用...就我而言,我还需要获取下载URL并推送到firestore集合。经过阅读后,我发现最好使用StorageTaskSnapshot然后获取下载URL
uploadImage(File image) async {
StorageReference reference =
FirebaseStorage.instance.ref().child(image.path.toString());
StorageUploadTask uploadTask = reference.putFile(image);
StorageTaskSnapshot downloadUrl = (await uploadTask.onComplete);
String url = (await downloadUrl.ref.getDownloadURL());
}