颤振 Firestorage getDownloadUrl() returns NoSuchMethodError
Flutter Firestorage getDownloadUrl() returns NoSuchMethodError
在我的 Flutter 应用程序中,我正在尝试将图像上传到 Firebase 存储,然后获取 URL。图片正在上传,我可以在 Web 界面中看到它,但是当我在有效引用上调用 getDownloadUrl() 时(我可以看到调试器的相对路径)我得到 type 'NoSuchMethodError' is not a subtype of type 'Exception'
并且实际错误发生在内部method_channel_reference.dart
由于某种原因,其中 storage
为空,因此 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
我尝试清理、重建和降级依赖项。在这一点上,我不知道还有什么地方可以看。我想问题是存储实例被删除或根本没有初始化,但为什么上传工作呢?欢迎任何帮助。
希望这对您有所帮助,但您可以将每个上传的 link 存储在每个产品或用户的 document
中,无论它在哪里。
在这个方法中,例如,您可以从同一个document
中检索link文件,并且您不需要其他方法来检索它。
在此代码中,您可以上传文件并在上传完文件后恢复 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;
}
当我从
改变
@lazySingleton
FirebaseStorage get firebaseStorage => FirebaseStorage.instanceFor(bucket: "bucket-url");
至此
@lazySingleton
FirebaseStorage get firebaseStorage => FirebaseStorage.instance;
错误消失,一切正常。
我拥有存储桶 URL 的主要原因是因为我正在处理项目风格和两个 Firebase 项目。单独的 google-services.json
似乎足以满足 Android(直到现在还没有测试 iOS)。但是,为什么上传能用,下载却不行,一直是我的一大疑惑。
在我的 Flutter 应用程序中,我正在尝试将图像上传到 Firebase 存储,然后获取 URL。图片正在上传,我可以在 Web 界面中看到它,但是当我在有效引用上调用 getDownloadUrl() 时(我可以看到调试器的相对路径)我得到 type 'NoSuchMethodError' is not a subtype of type 'Exception'
并且实际错误发生在内部method_channel_reference.dart
由于某种原因,其中 storage
为空,因此 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
我尝试清理、重建和降级依赖项。在这一点上,我不知道还有什么地方可以看。我想问题是存储实例被删除或根本没有初始化,但为什么上传工作呢?欢迎任何帮助。
希望这对您有所帮助,但您可以将每个上传的 link 存储在每个产品或用户的 document
中,无论它在哪里。
在这个方法中,例如,您可以从同一个document
中检索link文件,并且您不需要其他方法来检索它。
在此代码中,您可以上传文件并在上传完文件后恢复 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;
}
当我从
改变@lazySingleton
FirebaseStorage get firebaseStorage => FirebaseStorage.instanceFor(bucket: "bucket-url");
至此
@lazySingleton
FirebaseStorage get firebaseStorage => FirebaseStorage.instance;
错误消失,一切正常。
我拥有存储桶 URL 的主要原因是因为我正在处理项目风格和两个 Firebase 项目。单独的 google-services.json
似乎足以满足 Android(直到现在还没有测试 iOS)。但是,为什么上传能用,下载却不行,一直是我的一大疑惑。