Как: установить информацию профиля пользователя Firebase при регистрации/создании? (Флаттер-паутина)

Как я могу установить отображаемое имя пользователя одновременно с созданием его учетной записи?

Я использую метод createUserWithEmailAndPassword и пытаюсь получить информацию из 3 разных полей TextFormField в одной и той же форме.

Ниже приведен очень простой пример того, что я пытаюсь сделать... Надеюсь, из этого кто-то сможет помочь...

Спасибо

Это мой метод регистрации:

import 'package:firebase_auth/firebase_auth.dart';

class AuthService {
  FirebaseAuth auth = FirebaseAuth.instance;

  //Create user with email and password (+ displayName)
  signUp({String email, String password, String name}) async {
    await FirebaseAuth.instance
        .createUserWithEmailAndPassword(email: email, password: password);


        // I'd like to create/update the new user's displayName here, using the String value (name) being passed into this function.



  }
}

Это пример того, откуда поступают данные:

class SignUpForm extends StatelessWidget {
  final GlobalKey<FormState> _formKey = GlobalKey();

  String name;
  String email;
  String password;

  TextEditingController nameController;
  TextEditingController emailController;
  TextEditingController passwordController;

  submit(){
    AuthService().signUp(password: 'password', email: email, name: name);
  }

  @override
  Widget build(BuildContext context) {
    return Form(
      key: _formKey,
      child: Column(
        children: <Widget>[
          TextFormField(
            controller: nameController,
            onChanged: (value) {
              name = value;
            },
          ),
          TextFormField(
            controller: emailController,
            onChanged: (value) {
              email = value;
            },
          ),
          TextFormField(
            controller: passwordController,
            onChanged: (value) {
              password = value;
            },
          ),
        ],
      ),
    );
  }
}

person Chris    schedule 16.02.2020    source источник


Ответы (2)


Пользовательский объект возвращается из обещания функции createUserWithEmailAndPassword, и вы можете сразу после этого обновить displayName, отправив дополнительный запрос в firebase.

 await FirebaseAuth.instance.createUserWithEmailAndPassword(email: email, password: password)
          .then((user){
    var userUpdateInfo = new UserUpdateInfo(); //create user update object
    userUpdateInfo.displayName = "John Doe"
    await firebaseAuth.updateProfile(userUpdateInfo); //update to firebase
    await user.reload(); //reload  user data
})

Подробнее о классе UserUpdateInfo здесь: https://pub.dev/documentation/firebase_auth/latest/firebase_auth/UserUpdateInfo-class.html

Вы также можете проверить пример приложения в репозитории Firebase github. Я связался с файлом и строкой, которая имеет отношение к тому, чего вы хотите достичь:

https://github.com/FirebaseExtended/flutterfire/blob/7ccdd3b9bca948d15b397fe5c86ec4616b611c47/packages/firebase_auth/firebase_auth/example/lib/register_page.dart#L88

РЕДАКТИРОВАТЬ

Окончательный рабочий код:

class AuthService {
FirebaseAuth auth = FirebaseAuth.instance;

signUp({String email, String password, String name}) async {
await FirebaseAuth.instance
.createUserWithEmailAndPassword(email: email, password: password)
.then(
(value) async {
var userUpdateInfo = new UserUpdateInfo(); //create user update object
userUpdateInfo.displayName = "John Doe";
await value.user.updateProfile(userUpdateInfo); //update to firebase
await value.user.reload();

print('displayname= ${userUpdateInfo.displayName}');
},
);
}
} 
person matwr    schedule 21.02.2020
comment
Спасибо, я попробую! - person Chris; 21.02.2020
comment
Пожалуйста. Однако имейте в виду, что если вы создаете учетную запись, используя только адрес электронной почты и пароль, отображаемое имя еще не будет сохранено в Firebase. С другой стороны, если бы вы использовали Google Signup, эта информация была бы доступна, поскольку Google уже хранит ее. - person matwr; 21.02.2020
comment
Возможно, вы могли бы подробнее рассказать о том, как работает ваше приложение; какие данные вы собираете от пользователя; возможно, поделитесь своим кодом. Это очень помогло бы. Я вижу, что кто-то проголосовал против вашего вопроса. Я думаю, что это немного несправедливо, поскольку вы новый участник. Если вы добавите несколько фрагментов кода и немного больше информации о том, чего вы пытаетесь достичь, вопрос может получить несколько голосов. - person matwr; 21.02.2020
comment
Привет, я просто пытаюсь создать/обновить пользователя displayName одновременно с созданием пользователя Firebase с адресом электронной почты и паролем... Я обновлю свой вопрос с помощью некоторого кода. - person Chris; 21.02.2020
comment
хорошо, спасибо за разъяснение. В этом случае вам нужно отправить второй запрос в firebase, как только вы получите объект User. Второй запрос выполнит обновление displayName сразу после создания пользователя. Я обновлю свой ответ для вас. - person matwr; 21.02.2020
comment
Спасибо, мне это кажется правильным... Я обновил свой вопрос простым кодом, показывающим, что я делаю. - person Chris; 21.02.2020
comment
Я обновил свой ответ, чтобы отразить ваши разъяснения. Теперь вы сможете сохранить отображаемое имя сразу после разрешения создания пользователя. - person matwr; 21.02.2020
comment
Привет, приятель, большое спасибо за твою помощь ... Не могли бы вы показать рабочий пример, основанный на методе, который у меня есть в моем вопросе? Я думаю, что это может работать, но я пытался напечатать displayName на консоли в конце функции, и он все еще показывает ноль... Не уверен, что это потому, что печать не ждет перед запуском - person Chris; 21.02.2020
comment
Давайте продолжим обсуждение в чате. - person matwr; 21.02.2020

person    schedule
comment
Спасибо, я попробую! - person Chris; 21.02.2020
comment
Привет, приятель, я пробовал это (даже с жестким кодированием displayName, и я все еще получаю USERNAME IS: null - person Chris; 21.02.2020
comment
извините, попробуйте добавить await перед updateProfile, я обновлю ответ - person Henok; 21.02.2020
comment
Привет дружище, у тебя работает? я все еще получаю ноль - person Chris; 21.02.2020