Средство получения ‘uid’ было вызвано при появлении ошибки null между экранами

#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...')