У Пользователя Firebase Нет Конструктора?

# #firebase #flutter #dart #firebase-authentication

Вопрос:

Я работаю с Flutter/Dart и Firebase. Я использую провайдера для получения информации о пользователе Firebase, и я вижу эту ошибку:

 The class 'User' doesn't have a default constructor.
Try using one of the named constructors defined in 'User'.
 

Код, вызывающий проблему, является:

 providers: [
        ChangeNotifierProvider<AuthProvider>(create: (_) => AuthProvider()),
        StreamProvider<User>.value(
          initialData: User(
            name: 'Friend',
            uid: '0',
          ),
          value: FirebaseAuth.instance.authStateChanges(),
          // initialData: ,
        ),
 

У меня нет пользовательского класса. Пользовательский класс поступает из Firebase, так как я могу добавить в него конструктор? Есть ли способ обойти эту ошибку конструктора в initialData поле?

Существует класс userInfo, у которого есть конструктор. Но, когда я пытаюсь использовать это, я не могу установить значения по умолчанию для полей. Я получаю The named parameter 'uid' isn't defined. Try correcting the name to an existing named parameter's name, or defining a named parameter with the name 'uid'

Ответ №1:

Дело в том, что вы не можете создать пользовательский объект, вам нужно получить его из Firebase. в исходных данных вы попытались создать объект пользователя, поэтому получили ошибку. честно говоря, я попытался повторить вашу ошибку, но не смог найти, откуда вы нашли именованные конструкторы.

несколько полезных строк кода:

вы можете получить текущего пользователя, вошедшего в систему, следующим образом:

  User user = FirebaseAuth.instance.currentUser;
 

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

  final UserCredential signInResponse = await FirebaseAuth.instance.signInWithEmailAndPassword(
email: email,
password: password);

final User user =signInResponse.user;
 

если вы хотите создать нового пользователя, одним из вариантов является:

  final UserCredential createUserResponse = await FirebaseAuth.instance.createUserWithEmailAndPassword(
email: email,
password: password);

final User user =createUserResponse.user;
 

надеюсь, это поможет, если не скажете мне, что я пропустил, и я попытаюсь исправить свой ответ 🙂

Комментарии:

1. Хммм. Я использую Google и Facebook для входа в систему, а затем мой потоковый провайдер использовал FirebaseAuth.instance.authStateChanges() его, чтобы узнать состояние входа пользователей. Я не использую стандартный логин электронной почты. Так что до безопасности Flutter null я смог использовать код в своем первоначальном посте. Я нашел странное решение, которое по какой-то причине работает. Я опубликую это.

2. Я попробовал это, но это все еще не позволяет вам добавлять по умолчанию для пользователя для initialData, как я ожидал.

Ответ №2:

Итак, если я изменю значение initialData на следующее, ошибки исчезнут. Не знаю, почему это работает, честно говоря, мне кажется, что это должно привести к некоторым ошибкам, но это не так, поэтому я пока смирюсь с этим.

 StreamProvider<User>.value(
          initialData: FirebaseAuth.instance.currentUser,
          value: FirebaseAuth.instance.authStateChanges(),
          // initialData: ,
        ),
 

Комментарии:

1. Мне кажется, что причина, по которой это работает, заключается в том, что вы возвращаете конструктор пользователя (FirebaseAuth.instance) вместе с самим фактическим свойством CurrentUser . Эти конструкторы и свойства уже встроены в Пользователя . Как и любой другой виджет в Flutter, они содержат свойства и виджеты, к которым можно получить доступ. Мы делаем именно это, когда создаем наш собственный пользовательский виджет/класс.

2. Состояние трепета так сильно меня смущает. Я всегда вижу ошибки поставщика в окне отладки, но это работает в приложении.

3. Я решил FirebaseAuth.instance.currentUser , что это будет просто какой-то добытчик, а не конструктор.