# #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
, что это будет просто какой-то добытчик, а не конструктор.