Экземпляр хранилища Flutter Firebase не инициализирован - PullRequest
1 голос
/ 07 мая 2020

Я пишу мобильное приложение на 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. Буду признателен за любые рекомендации по этому вопросу. Спасибо.

1 Ответ

0 голосов
/ 08 мая 2020

Решено! У меня есть кеш, работающий вместе с хранилищем Firebase, которому разрешено переименовать файл во время загрузки. Теперь задача переименования заблокирована до завершения загрузки. Я до сих пор не уверен, почему экземпляр хранилища Firebase не инициализируется данными, которые я ожидал, но, поскольку теперь он работает, я готов не обращать на это внимания.

...