我正在Flutter中编写一个移动应用程序,并且遇到了与Firebase存储相关的问题。应用程序的一部分需要使用设备的相机拍摄照片并将其上传到Firebase存储桶。
上传功能一直有效,直到我添加了一些其他小的更改之间的身份验证功能。
这里是问题:
似乎Firebase存储实例未初始化。我已经看到了一些示例,这些示例显示Firebase可以使用带有api键,bucket等参数的函数进行初始化。 Google文档从不引用此函数,但是建议将GoogleService-Info.plist
和google-services.json
复制到项目中。我已经做到了,并且有效。我也在应用程序中使用的身份验证api和Firestore api都可以正常工作。只是Firebase存储有问题。
例如,在我的主要功能中,我添加了以下代码来显示问题。
Future<void> main() async{
// setup camera
WidgetsFlutterBinding.ensureInitialized();
final cameras = await availableCameras();
// look here!!
print('firestore: ${Firestore.instance.app}');
print('storage: ${FirebaseStorage.instance.app}');
runApp(MyApp(cameras: cameras));
}
并且(在物理设备上运行该应用程序时,这是控制台输出:
Restarted application in 1,097ms.
flutter: firestore: FirebaseApp(__FIRAPP_DEFAULT)
flutter: storage: null
我真的很困惑可能导致Firebase部分失败初始化的原因。我曾尝试在Firebase控制台中更改访问规则,但这无效。下面,我粘贴了与Firebase包含有关的pubspec.yaml
文件部分。
# Firebase
firebase_core: ^0.4.0+9
firebase_analytics: ^5.0.2
firebase_auth: ^0.14.0+5
cloud_firestore: ^0.12.9+5
firebase_storage: ^3.0.8
此外,这是向存储API发出请求的代码。再次,我不认为这是问题所在,因为实例从一开始就为空,但是这里是为了完整性:
// saves a locally stored image at local_uri as name. After the storage task
// is complete, the DocumentReference ref is updated with the new url
Future<void> _save_storage(String name, String local_uri, DocumentReference ref) async {
StorageReference storage_reference;
storage_reference = FirebaseStorage.instance.ref().child('images/$name');
final StorageUploadTask upload_task = storage_reference.putFile(io.File(local_uri));
final StorageTaskSnapshot download_url = (await upload_task.onComplete);
final String url = (await download_url.ref.getDownloadURL());
// now, update the file in the database to point to the correct storage
// url
Firestore.instance.runTransaction((transaction) async {
await transaction.update(ref, {'image_url' : url});
});
}
令人沮丧的是,此问题没有引发异常。文件根本不会上传到存储桶。我知道实例字段是通过在调试模式下进行一些随机探测而未初始化的。另外,我发现上述StorageUploadTask实例的错误代码为-13000,但是我在任何地方都没有找到有关此错误代码的任何文档。
我对Flutter和Firebase都很陌生,所以我认为这里的部分问题是我不了解如何创建Firebase实例。我希望您能对此问题提供任何指导。谢谢。
已解决!我在Firebase存储旁边运行了一个缓存,允许在上载时重命名该文件。现在,重命名任务将被阻止,直到上传完成。我仍然不确定为什么不使用我期望的数据初始化Firebase存储实例,但是由于它现在正在工作,所以我愿意忽略它。