У нас есть собственное приложение для 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
Похоже, Firebase и Firestore уже создали экземпляр приложения с именем DEFAULT
на собственной стороне iOS и не могут воссоздать новый экземпляр Firestore при вызове FirebaseFirestore.instance.collection('users').get();
Я предлагаю вам создать еще один экземпляр во Flutter, передав переменную name
, инициализируя Firebase во Flutter следующим образом:
final app = await Firebase.initializeApp(name: "ANOTHER_INSTANCE");
Я провел небольшое исследование и придумал этот поток; 1. Удалите инициализацию платформы (iOS) и инициализируйте приложение только во Flutter. Это автоматически создаст экземпляр по умолчанию на iOS. Плагины FlutterFire используют Method Channel и зависят от кода платформы, поэтому этот шаблон также инициализирует приложение по умолчанию на стороне платформы. 2. Теперь войдите в систему пользователя на стороне платформы (iOS) без повторной инициализации приложения, затем вызовите await FirebaseAuth.instance.currentUser?.reload();
на Flutter и снова попытайтесь получить доступ к чтению из Firestore из Flutter.
На самом деле, отказ в разрешении на использование коллекций Firestore был правильным. Наш запрос был нацелен на неверный путь. Как только мы это исправили, все заработало! Таким образом, кажется, что единственным требованием было установить другое имя приложения для экземпляра Firebase, отличное от имени по умолчанию.
Спасибо за ваш ответ! Мы это уже пробовали, но это не работает. Приложение Firebase инициализируется, но Firestore на стороне Flutter не разделяет состояние аутентификации с собственной стороной, поэтому мы получаем отказ в разрешении из-за правил чтения в коллекциях Firestore.