Флаттер - как записывать данные в Firebase (в реальном времени, дб): разрешение запрещено - PullRequest
0 голосов
/ 06 сентября 2018

Я хотел бы записать данные в Firebase и получить ошибку разрешения, вот что я попробовал:

void initState() {
    super.initState();
    testFirebase();
 }

 Future testFirebase() async {

    initUser();

    //Initialize Firebase
    final FirebaseApp firebaseApp = await FirebaseApp.configure( ... );

    final FirebaseDatabase database = new FirebaseDatabase(app: firebaseApp);

    database.reference().child('counter').push().set(<String, String>{
      'var': 'test'
    });
  }

  Future initUser() async {
    googleUser = await _ensureLoggedInOnStartUp();
    if (googleUser == null) {
       setState(() {
         state.isLoading = false;
       });
    } else {
       var firebaseUser = await logIntoFirebase();
    }
  }

Вот мои правила Firebase:

enter image description here

Файл google-services.json добавлен в корневой каталог приложения:

enter image description here

Результат:

Я получаю следующее сообщение об ошибке:

enter image description here

Я пробовал также с:

толчок (). SetValue ( '2')

но это не работает, и это сводит меня с ума, я не понимаю ...

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

Простое добавление await в initUser () не сработало, база данных также была неправильно адресована.

Решение:

FirebaseDatabase.instance.reference().child ...

вместо:

final FirebaseApp firebaseApp = await FirebaseApp.configure( ... );

final FirebaseDatabase database = new FirebaseDatabase(app: firebaseApp);
0 голосов
/ 03 января 2019

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

final FirebaseDatabase database = FirebaseDatabase(app: app);
this.databaseRef = database.reference();

Но вместо этого использую этот подход:

this.databaseRef = FirebaseDatabase.instance.reference();

Когда вы работаете с несколькими частями документации Flutter, вы увидите, что многие подходы работают для чтения общедоступной информации из базы данных реального времени, но только один метод работал для чтения информации, которая зависит от переменной auth. Это был мой опыт.

Метод работы: https://marcinszalek.pl/flutter/firebase-database-flutter-weighttracker/

Неработающий метод был связан с документацией плагина: https://pub.dartlang.org/packages/firebase_database#-example-tab-

Кроме того, мой проект был настроен с использованием основной документации Firebase Flutter для связи моего приложения с Firebase: https://firebase.google.com/docs/flutter/setup

0 голосов
/ 07 сентября 2018

Быстрая первоначальная проверка - вам нужно await initUser(). Итак:

Future testFirebase() async {

    await initUser();

    //Initialize Firebase
    final FirebaseApp firebaseApp = await FirebaseApp.configure( ... );

Без этого я бы ожидал, что вызовы к базе данных начнутся до того, как завершится аутентификация.


Обновление : я только что подтвердил, что это действительно так с этим простым кодом:

void _signin() async {
  print("Calling __actuallySignin");
  __actuallySignin();
  print("called __actuallySignin and waited");
}
void __actuallySignin() async {
  print("Calling signIn...");
  await FirebaseAuth.instance.signInAnonymously();
  print("called signIn... and waited");
}

Это печатает:

flutter: Calling __actuallySignin
flutter: called __actuallySignin and waited
flutter: Calling signIn...
...
flutter: called signIn... and waited

Таким образом, метод __actuallySignin выполняется до входа в систему. Чтобы заставить вызывающий код ждать результата, вы добавляете await:

await __actuallySignin();

Какие выходы:

flutter: Calling __actuallySignin
flutter: Calling signIn...
flutter: called signIn... and waited
flutter: called __actuallySignin and waited
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...