#firebase #flutter #firebase-authentication
#firebase #флаттер #firebase-аутентификация
Вопрос:
Я получаю сообщение об ошибке
UID-идентификатор получателя был вызван при null.
Получатель: null
Пытался вызвать: uid
это код, который я использую, проблема в auth.CurrentUser.uid, который возвращает null при первом вызове, насколько я понимаю, auth.CurrentUser сначала равен null, затем возвращает текущего пользователя, но я не понимаю, как справиться с этой ситуацией
ошибка отображается на эмуляторе, когда между экраном входа в систему и начальным экраном после входа в систему она появляется на секунду, затем исчезает, и начальный экран отображается нормально
class HomePage extends StatelessWidget {
final FirebaseAuth auth = FirebaseAuth.instance;
static int count;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
actions: [
GestureDetector(
child: Icon(Icons.logout),
onTap: () async {
await auth.signOut();
Navigator.of(context).push(MaterialPageRoute(builder: (context) {
return LoginPage();
}));
},
),
],
),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.add),
onPressed: () {
print('add button pressed');
Navigator.of(context).push(MaterialPageRoute(builder: (context) {
return NewNote();
}));
},
),
body: SafeArea(
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'Notes',
style: TextStyle(
fontSize: 18,
),
),
// Text(count != null ? count.toString() : '0'),
NotesCount(
auth1: auth,
),
Text(auth.currentUser.uid != null ? auth.currentUser.uid : 'No user id'),
SizedBox(
height: 20,
),
NotesGrid(
auth1: auth,
),
],
),
),
),
);
}
}
class NotesCount extends StatelessWidget {
final FirebaseAuth auth1;
NotesCount({this.auth1});
@override
Widget build(BuildContext context) {
CollectionReference notes = FirebaseFirestore.instance.collection('users').doc(auth1.currentUser.uid).collection('notes');
return StreamBuilder<QuerySnapshot>(
stream: notes.snapshots(),
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (snapshot.hasError) {
return Text('Something went wrong');
}
if (snapshot.connectionState == ConnectionState.waiting) {
return Text("Loading");
}
return new Text(snapshot.data.docs.length.toString());
},
);
}
}
class NotesGrid extends StatelessWidget {
final FirebaseAuth auth1;
NotesGrid({this.auth1});
@override
Widget build(BuildContext context) {
CollectionReference notes = FirebaseFirestore.instance.collection('users').doc(auth1.currentUser.uid).collection('notes');
return StreamBuilder(
stream: notes.snapshots(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (!snapshot.hasData) {
return Center(child: const Text('Loading events...'));
}
if (snapshot.hasError) {
return Text('Something went wrong');
}
if (snapshot.connectionState == ConnectionState.waiting) {
return Text("Loading");
}
return GridView.builder(
shrinkWrap: true,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2),
itemBuilder: (BuildContext context, int index) {
return NoteCard(
note: Note(
title: snapshot.data.documents[index]['title'],
content: snapshot.data.documents[index]['content'],
datetime: snapshot.data.documents[index]['datetime'].toDate(),
id: snapshot.data.documents[index].documentID,
),
);
},
itemCount: snapshot.data.documents.length,
);
},
);
}
}
Ответ №1:
Не рекомендуется использовать currentUser
его в качестве основного способа поиска учетной записи пользователя, вошедшего в систему. При первом запуске приложения всегда будет null. Ранее зарегистрированный пользовательский объект становится доступным только через некоторое время. Лучше следовать инструкциям в документации и настроить прослушиватель состояния аутентификации, чтобы вы могли узнать, когда пользовательский объект впервые становится доступным.
FirebaseAuth.instance
.authStateChanges()
.listen((User user) {
if (user == null) {
print('User is currently signed out!');
} else {
print('User is signed in!');
}
});
Используйте этот прослушиватель, чтобы реагировать на изменения в состоянии аутентификации и соответствующим образом запускать обновление вашего пользовательского интерфейса.
Ответ №2:
Я попытался добавить if else перед обращением к текущему пользователю, и ошибка исчезла, и пользовательские данные отображаются нормально после их загрузки
Text(auth.currentUser != null ? auth.currentUser.uid : 'Loading...')