Null UID при попытке сохранить данные с помощью флаттера и плацдарма - PullRequest
1 голос
/ 23 января 2020

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

Код:

String errorMessage;
  String name;
  String password;
  String email;
  String role;
  bool obscure = true;
  FirebaseUser instructor;

  final FirebaseAuth _auth = FirebaseAuth.instance;

  final db = Firestore.instance;

  void saveData() async {
    await db.collection("instructori")
      .document(instructor.uid)
      .setData(
        {
          'Nume': name,
          'Rol': role,
          'Email': email,
          'Parola': password,
          'UID': instructor.uid
        }
      );
  }


  Future<void> registerUser() async {
    instructor = await _auth
        .createUserWithEmailAndPassword(
      email: email,
      password: password,
    ).then((onValue) {
      saveData();
      Navigator.of(context).pushNamed(ClientiPage.id);
    }).catchError((error) {
      errorMessage = error;
    });



    Navigator.of(context).pushNamed(ClientiPage.id);
  }

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

Ошибка:

E/flutter ( 5527): Tried calling: uid
E/flutter ( 5527): #0      Object.noSuchMethod  (dart:core-patch/object_patch.dart:53:5)
E/flutter ( 5527): #1      _RegisterPageState.saveData 
package:euroswimming_instructori/register_page.dart:29
E/flutter ( 5527): #2      _RegisterPageState.registerUser.<anonymous closure> 
package:euroswimming_instructori/register_page.dart:48
E/flutter ( 5527): #3      _rootRunUnary  (dart:async/zone.dart:1134:38)

Ответы [ 2 ]

2 голосов
/ 23 января 2020

.then() возвращал другой Future<void>, поэтому instructor был установлен на null. Вы можете просто установить instructor в обратном вызове .then() следующим образом:

void registerUser() {
  _auth.createUserWithEmailAndPassword(
    email: email,
    password: password,
  ).then((result) {
    instructor = result.user;
    saveData();
    Navigator.of(context).pushNamed(ClientiPage.id);
  }).catchError((error) {
    errorMessage = error;
  });

  Navigator.of(context).pushNamed(ClientiPage.id);
}
2 голосов
/ 23 января 2020

Вы должны сделать:

instructor = (await FirebaseAuth.instance.currentUser()).uid;

, чтобы получить uid пользователя.

currentUser возвращает значение типа Future<FirebaseUser>, поэтому вы используете await для получения currentUser.

https://dart.dev/codelabs/async-await#working с фьючерсами-асин c и ожиданием

https://github.com/FirebaseExtended/flutterfire/blob/master/packages/firebase_auth/firebase_auth/lib/src/firebase_auth.dart#L314

Примечание :

uid имеет тип String, поэтому, если вы хотите, чтобы instructor был типа FirebaseUser, то выполните следующие действия:

instructor = await FirebaseAuth.instance.currentUser();
String userId = instructor.uid;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...