Firebase 如何删除保存在Flatter登录区内Firestorage上的图像?

Firebase 如何删除保存在Flatter登录区内Firestorage上的图像?,firebase,flutter,dart,google-cloud-firestore,firebase-storage,Firebase,Flutter,Dart,Google Cloud Firestore,Firebase Storage,我有一个注册区,用户可以在其中选择个人资料图片等。如果用户不喜欢图片,用户可以选择删除现有图片并插入新图片。Firestore中图片的Url将被删除并替换为新Url。此外,当然,还应该从Firestore存储中删除该图像,并替换为新图像。不幸的是,这里只插入了一张新图片,因此用户有两张个人资料图片 这是我的方法。我知道跑步会给我一条错误信息。然而,我根本无法解释它们,或者我不理解它们 void _deleteImage() async { FirebaseUser user = awai

我有一个注册区,用户可以在其中选择个人资料图片等。如果用户不喜欢图片,用户可以选择删除现有图片并插入新图片。Firestore中图片的Url将被删除并替换为新Url。此外,当然,还应该从Firestore存储中删除该图像,并替换为新图像。不幸的是,这里只插入了一张新图片,因此用户有两张个人资料图片

这是我的方法。我知道跑步会给我一条错误信息。然而,我根本无法解释它们,或者我不理解它们

void _deleteImage() async {
    FirebaseUser user = await FirebaseAuth.instance.currentUser();
    String imgUrl;
    DocumentReference documentReference =
        Firestore.instance.collection("Users").document(user.uid);

    await documentReference.get().then((snapshot) {
      imgUrl = snapshot.data['Pictures'].toString();
    });
    print("This is the imgUrl: " + imgUrl);
    StorageReference _ref =
        await FirebaseStorage.instance.getReferenceFromUrl(imgUrl);
    await _ref.delete();
}

void _deleteUrl() async {
    FirebaseUser user = await FirebaseAuth.instance.currentUser();
    await Firestore.instance
        .collection("Users")
        .document(user.uid)
        .updateData({"Pictures": FieldValue.delete()});
}
这是一次跑步:

E/MethodChannel#plugins.flutter.io/firebase_storage( 8724): Failed to handle method call
E/MethodChannel#plugins.flutter.io/firebase_storage( 8724): java.lang.IllegalArgumentException: The storage Uri could not be parsed.
E/MethodChannel#plugins.flutter.io/firebase_storage( 8724):     at com.google.firebase.storage.FirebaseStorage.getReferenceFromUrl(FirebaseStorage.java:265)
E/MethodChannel#plugins.flutter.io/firebase_storage( 8724):     at io.flutter.plugins.firebase.storage.FirebaseStoragePlugin.getReferenceFromUrl(FirebaseStoragePlugin.java:172)
E/MethodChannel#plugins.flutter.io/firebase_storage( 8724):     at io.flutter.plugins.firebase.storage.FirebaseStoragePlugin.onMethodCall(FirebaseStoragePlugin.java:102)
E/MethodChannel#plugins.flutter.io/firebase_storage( 8724):     at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:233)
E/MethodChannel#plugins.flutter.io/firebase_storage( 8724):     at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:85)
E/MethodChannel#plugins.flutter.io/firebase_storage( 8724):     at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:818)
E/MethodChannel#plugins.flutter.io/firebase_storage( 8724):     at android.os.MessageQueue.nativePollOnce(Native Method)
E/MethodChannel#plugins.flutter.io/firebase_storage( 8724):     at android.os.MessageQueue.next(MessageQueue.java:379)
E/MethodChannel#plugins.flutter.io/firebase_storage( 8724):     at android.os.Looper.loop(Looper.java:144)
E/MethodChannel#plugins.flutter.io/firebase_storage( 8724):     at android.app.ActivityThread.main(ActivityThread.java:7523)
E/MethodChannel#plugins.flutter.io/firebase_storage( 8724):     at java.lang.reflect.Method.invoke(Native Method)
E/MethodChannel#plugins.flutter.io/firebase_storage( 8724):     at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
E/MethodChannel#plugins.flutter.io/firebase_storage( 8724):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
E/flutter ( 8724): [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: PlatformException(error, The storage Uri could not be parsed., null, java.lang.IllegalArgumentException: The storage Uri could not be parsed.
E/flutter ( 8724):  at com.google.firebase.storage.FirebaseStorage.getReferenceFromUrl(FirebaseStorage.java:265)
E/flutter ( 8724):  at io.flutter.plugins.firebase.storage.FirebaseStoragePlugin.getReferenceFromUrl(FirebaseStoragePlugin.java:172)
E/flutter ( 8724):  at io.flutter.plugins.firebase.storage.FirebaseStoragePlugin.onMethodCall(FirebaseStoragePlugin.java:102)
E/flutter ( 8724):  at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:233)
E/flutter ( 8724):  at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:85)
E/flutter ( 8724):  at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:818)
E/flutter ( 8724):  at android.os.MessageQueue.nativePollOnce(Native Method)
E/flutter ( 8724):  at android.os.MessageQueue.next(MessageQueue.java:379)
E/flutter ( 8724):  at android.os.Looper.loop(Looper.java:144)
E/flutter ( 8724):  at android.app.ActivityThread.main(ActivityThread.java:7523)
E/flutter ( 8724):  at java.lang.reflect.Method.invoke(Native Method)
E/flutter ( 8724):  at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
E/flutter ( 8724):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
也许这会有帮助。我发现代码的以下部分导致了错误:

 StorageReference _ref =
        await FirebaseStorage.instance.getReferenceFromUrl(imgUrl);
    await _ref.delete();

我没有编写代码flatter,但是您的问题很可能与
\u deleteUrl()
函数有关,该函数使用FieldValue.delete()更新用户的图片对象。我建议将其设置为默认图像或提示用户提交新图像以替换已删除的图像。然而,我可能误解了这个问题。如果你能展示更多的代码,我们可以提供更好的帮助

此外,以下运行时错误消息对我来说尤为突出:
未处理的异常:PlatformException(错误,无法分析存储Uri),null,java.lang.IllegalArgumentException:无法分析存储Uri。


对我来说,这意味着你的
\u deleteImage()
函数在从firebase请求URL时遇到问题。我建议查看文档,看看请求URL时出现了什么问题:

经过长时间的编码后,我终于想出了一个解决方案。需要一个保存图像URL的列表。然后在“删除”中简单地清理该列表图像方法:)

所以我不知道如何格式化这里的代码,但这就是我所做的。这很简单。我只是定义列表。然后我有两个函数,用于从firestore中删除URL,并通过存储在firestore上的URL从存储器中删除孔图像。我只需要在一个butten压力机上就可以得到这个函数的存在


如果有什么不清楚的地方,尽管问,我会尽量解释得更好。:)

谢谢你的回答!有趣的是,如果我手动输入url,它工作得很好。如果我用print输出url,我也没有问题。但是用上面的方法,它给了我这个错误。我知道问题出在deleteImage方法上,但我不理解它背后的逻辑。这些函数单独工作,但不能一起工作。
List loginImageUrl = [];


FirebaseUser user = await FirebaseAuth.instance.currentUser();

DocumentSnapshot documentSnapshot = await Firestore.instance
                                          .collection("Users")
                                          .document(user.uid)
                                          .get();

                                  if (documentSnapshot.data['Pictures'] !=
                                      null) {
                                    loginImageUrl.insert(
                                        0,
                                        documentSnapshot.data['Pictures']
                                            [0]);

                                    await _deleteImage();
                                    await _deleteUrl();

_deleteImage() async {
if (loginImageUrl[0] != null) {
  StorageReference storageReference =
      await FirebaseStorage.instance.getReferenceFromUrl(loginImageUrl[0]);
  storageReference.delete();
  loginImageUrl.clear();
}
}

_deleteUrl() async {
FirebaseUser user = await FirebaseAuth.instance.currentUser();
await Firestore.instance
    .collection("Users")
    .document(user.uid)
    .updateData({"Pictures": FieldValue.delete()});
}