Я пишу мобильное приложение на Flutter и столкнулся с проблемой, связанной с Firebase Storage. Часть приложения должна сделать снимок камерой устройства и загрузить его в корзину Firebase Storage.
Функция загрузки работала, пока я не добавил некоторые функции аутентификации среди других небольших изменений.
Вот проблема:
Похоже, что экземпляр хранилища Firebase не инициализирован. Я видел несколько примеров, показывающих, что Firebase может быть инициализирована функцией, которая принимает ключ API, сегмент и другие аргументы. Однако документация Google никогда не ссылается на эту функцию, а вместо этого рекомендует скопировать GoogleService-Info.plist
и google-services.json
в проект. Я сделал это, и это работает. API аутентификации и API Firestore, оба из которых я также использую в приложении, работают правильно. Проблемой является просто хранилище Firebase c.
В моей основной функции, например, я добавил следующий код, чтобы показать проблему.
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, но это не помогло. Ниже я вставил раздел моего файла pubspec.yaml
, имеющий отношение к Firebase includes.
# 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
Кроме того, вот код, который делает запрос к Storage API. Опять же, я не думаю, что это проблема, потому что экземпляр с самого начала имеет значение null, но здесь это сделано для полноты:
// 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. Буду признателен за любые рекомендации по этому вопросу. Спасибо.