2

在我的 Flutter 应用程序中,我正在尝试将图像上传到 Firebase 存储,然后获取 URL。图像正在上传,我可以在 Web 界面中看到它,但是当我在有效引用上调用 getDownloadUrl() 时(我可以使用调试器看到相对路径),我得到type 'NoSuchMethodError' is not a subtype of type 'Exception'并且实际错误发生在method_channel_reference.dart其中出于某种原因, wherestorage为 null 并因此storage.app引发错误。

 @override
  Future<String /*!*/ > getDownloadURL() async {
    try {
      Map<String, dynamic> data = await MethodChannelFirebaseStorage.channel
          .invokeMapMethod<String, dynamic>(
              'Reference#getDownloadURL', <String, dynamic>{
        'appName': storage.app.name,
        'maxOperationRetryTime': storage.maxOperationRetryTime,
        'maxUploadRetryTime': storage.maxUploadRetryTime,
        'maxDownloadRetryTime': storage.maxDownloadRetryTime,
        'bucket': storage.bucket,
        'path': fullPath,
      });

      return data['downloadURL'];
    } catch (e) {
      throw convertPlatformException(e);
    }
  }

上传代码是这样的:

final uploadTask = _firebaseStorage.ref().child(storagePath).putFile(recipeImage);

    try {
      await uploadTask.whenComplete(() {});
      final url = await uploadTask.snapshot.ref.getDownloadURL();
      return right<RecipeFailure, String>(url);
    } catch (e) {
      return left<RecipeFailure, String>(RecipeFailure.imageUploadFailed());
    }

我正在使用

firebase_core: ^0.7.0
firebase_auth: ^0.20.0+1
firebase_storage: ^7.0.0
cloud_firestore: ^0.16.0

我尝试清理、重建和降级依赖项。在这一点上,我不知道在哪里看。我想问题是存储实例被删除或根本没有初始化,但为什么上传工作呢?欢迎任何帮助。

4

2 回答 2

0

我希望这可以帮助您,但是您可以将链接存储在document每个产品或用户的每次上传中,无论它在哪里。

例如,在这种方法中,您可以从相同的 中检索链接文件document,并且不需要其他方法来检索它。

在此代码中,您可以上传文件并在downloadUrl完成上传文件后恢复。

 static Future<dynamic> uploadFile(
      {@required File imageFile, @required String folderPath}) async {
    String fileName = DateTime.now().millisecondsSinceEpoch.toString();

    Reference reference =
    FirebaseStorage.instance.ref().child(folderPath).child(fileName);

    TaskSnapshot storageTaskSnapshot = await reference.putFile(imageFile);
    // TaskSnapshot storageTaskSnapshot =  uploadTask.snapshot;

    print(storageTaskSnapshot.ref.getDownloadURL());

    var dounloadUrl = await storageTaskSnapshot.ref.getDownloadURL();

    return dounloadUrl;
  }
于 2021-01-20T08:35:21.940 回答
0

当我从

@lazySingleton
FirebaseStorage get firebaseStorage => FirebaseStorage.instanceFor(bucket: "bucket-url");

对此

@lazySingleton
FirebaseStorage get firebaseStorage => FirebaseStorage.instance;

错误消失了,一切正常。

我有存储桶 URL 的主要原因是因为我正在处理项目风格和两个 Firebase 项目。对于 Android 来说,单独的google-services.json似乎就足够了(直到现在还没有测试过 iOS)。但是,为什么上传有效,但下载无效对我来说仍然是一个大谜。

于 2021-01-24T10:05:49.330 回答