Flutter: несколько проектов Firebase в одном приложении, но с неверными данными - PullRequest
2 голосов
/ 10 июня 2019

Последние несколько дней я трачу много времени на чтение нескольких SO-вопросов и учебных пособий.Я пытаюсь добиться того, чтобы пользователь моего приложения-флаттера мог выбрать проект Firebase и войти в систему с помощью электронной почты / пароля.Очевидно, что после входа в систему должны отображаться правильные данные соответствующей базы данных.И вот где я терплю неудачу.

Через некоторое время чтения некоторых сайтов и вопросов от SO, я пошел на следующий сайт, чтобы получить первую часть логина.

https://firebase.googleblog.com/2016/12/working-with-multiple-firebase-projects-in-an-android-app.html

После прохождения этой статьи я смог успешно войти в мои определенные проекты Firebase.

Как я узнал, что вход в систему прошел успешно?Я сравнил пользовательские идентификаторы из проектов с оператором печати из моего приложения в консоли.Это было доказательством того, что моя конфигурация для проекта не по умолчанию верна.

Но теперь главная проблема, которую я не могу решить.После входа в систему данные всегда относятся к проекту Firebase по умолчанию из google-service.json.

Для управления состоянием я выбираю пакет провайдера, как они упоминались в I / O '19.Поэтому внутри моего main.dart я обертываю все приложение с помощью MultipleProvider:

Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider<LoginModel>(
          builder: (_) => LoginModel(),
        ),
        ChangeNotifierProvider<Auth>(
          builder: (_) => Auth(),
        ),
      ],
      child: MaterialApp(
        title: 'Breaking News Tool',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: RootPage(),
      ),
    );
  }

Предоставленный класс Auth - это служба, которая подключается к firebase sdk, а также настраивает приложения не по умолчанию для создания необходимой аутентификации firebase

abstract class BaseAuth {

  getDefaultAuth();

  getAbnAuth();
...
}

class Auth with ChangeNotifier implements BaseAuth {
 ...
  Auth() {
    _configureAbnApp();
    _configureProdApp();
  }

  getDefaultAuth() {
    _firebaseAuth = FirebaseAuth.instance;
  }

  getAbnAuth() {
    _firebaseAuth = FirebaseAuth.fromApp(_abnApp);
  }

  _configureAbnApp() {
    FirebaseOptions abnOptions = FirebaseOptions(
        databaseURL: 'https://[project-id].firebaseio.com',
        apiKey: 'AIzaSxxxxxxxxxxxxxxxx,
        googleAppID: '1:10591xxxxxxxxxxxxxxxxxxx');
    FirebaseApp.configure(name: 'abn_database', options: abnOptions)
        .then((result) {
      _abnApp = result;
    });
  }
...
}

После входа в приложение приложение перенаправляет пользователя на домашнюю страницу (StatefulWidget).Здесь я использую снимок базы данных для отображения данных.

_stream = Firestore.instance.collection(collection).snapshots();
...
Center(
        child: Container(
          padding: const EdgeInsets.all(10.0),
          child: StreamBuilder<QuerySnapshot>(
            stream: _stream,
            builder:
                (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
              if (snapshot.hasError)
                return Text('Error: ${snapshot.error}');
              switch (snapshot.connectionState) {
                case ConnectionState.waiting:
                  return Text('Loading...');
                default:
                  return ListView(
                    children: snapshot.data.documents
                        .map((DocumentSnapshot document) {
                      return CustomCard(
                        docID: document.documentID,
                        title: document[title],
                        message: document[message],
                        fromDate: document[fromDate],
                        endDate: document[endDate],
                        disableApp: document[disableApp],
                      );
                    }).toList(),
                  );
              }
            },
          ),
        ),
      ),

Вначале у меня был только один проект для подключения, и данные были правильными.Но теперь я успешно подключаюсь к другому проекту с правильным user-uid, но данные всегда из проекта по умолчанию, который определяется google-service.json.И на данный момент, я понятия не имею, почему это происходит.

У кого-нибудь был совет или идея?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...