Используйте Firestore как в модуле Flutter, так и в родной iOS

У нас есть собственное приложение для iOS, и мы поэтапно переносим его на Flutter, поскольку переписывать все приложение во Flutter на данный момент нецелесообразно. Мы сильно зависим от ресурсов Firebase, таких как аутентификация, Firestore и т. д., и нам необходимо использовать их как в собственном коде, так и в коде Flutter.

Нам удалось инициализировать экземпляр Firebase во Flutter:

final app = await Firebase.initializeApp();

А также получить текущего пользователя, аутентифицированного нативным кодом, из Firebase auth:

final userId = FirebaseAuth.instance.currentUser?.uid;

Однако мы не можем получить доступ к Firestore:

final users = await FirebaseFirestore.instance.collection('users').get();

Всякий раз, когда мы пытаемся это сделать, мы получаем ошибку:

Закрытие приложения из-за неперехваченного исключения «FIRIllegalStateException», причина: «Экземпляр Firestore уже запущен, и его настройки больше нельзя изменить. Вы можете установить настройки только перед вызовом любых других методов в экземпляре Firestore».

Кажется, FLTFirebaseFirestorePlugin пытается переопределить настройки текущего экземпляра Firestore:

FIRFirestore *firestore = [FIRFirestore firestoreForApp:app database:databaseUrl];
firestore.settings = settings;

Мы перепробовали много вещей, но не смогли избавиться от этой ошибки.

Кто-нибудь смог использовать Firestore как в модуле Flutter, так и в родной iOS?

Или есть какой-нибудь обходной путь, который можно применить?


Здесь обнаружена точно такая же проблема, но ответа нет: Инициализируйте и используйте Firestore как в родной iOS, так и во Flutter

Также сообщается в этом билете GH: https://github.com/firebase/flutterfire/issues/9582

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
82
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, Firebase и Firestore уже создали экземпляр приложения с именем DEFAULT на собственной стороне iOS и не могут воссоздать новый экземпляр Firestore при вызове FirebaseFirestore.instance.collection('users').get();

Я предлагаю вам создать еще один экземпляр во Flutter, передав переменную name, инициализируя Firebase во Flutter следующим образом:

final app = await Firebase.initializeApp(name: "ANOTHER_INSTANCE");

Спасибо за ваш ответ! Мы это уже пробовали, но это не работает. Приложение Firebase инициализируется, но Firestore на стороне Flutter не разделяет состояние аутентификации с собственной стороной, поэтому мы получаем отказ в разрешении из-за правил чтения в коллекциях Firestore.

Pedro Estevão 20.04.2024 17:07

Я провел небольшое исследование и придумал этот поток; 1. Удалите инициализацию платформы (iOS) и инициализируйте приложение только во Flutter. Это автоматически создаст экземпляр по умолчанию на iOS. Плагины FlutterFire используют Method Channel и зависят от кода платформы, поэтому этот шаблон также инициализирует приложение по умолчанию на стороне платформы. 2. Теперь войдите в систему пользователя на стороне платформы (iOS) без повторной инициализации приложения, затем вызовите await FirebaseAuth.instance.currentUser?.reload(); на Flutter и снова попытайтесь получить доступ к чтению из Firestore из Flutter.

cybersokari 20.04.2024 20:55

На самом деле, отказ в разрешении на использование коллекций Firestore был правильным. Наш запрос был нацелен на неверный путь. Как только мы это исправили, все заработало! Таким образом, кажется, что единственным требованием было установить другое имя приложения для экземпляра Firebase, отличное от имени по умолчанию.

Pedro Estevão 25.04.2024 02:02

Другие вопросы по теме