【问题标题】:The getter 'uid' was called on null error appears between screens屏幕之间出现空错误时调用 getter 'uid'
【发布时间】:2021-02-17 15:59:03
【问题描述】:

我遇到了一个错误

在 null 上调用了 getter 'uid'。

接收者:空

尝试调用: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,
        );
      },
    );
  }
}

【问题讨论】:

    标签: firebase flutter firebase-authentication


    【解决方案1】:

    我尝试在访问当前用户之前添加if else,错误消失了,加载后用户数据正常显示

    Text(auth.currentUser != null ? auth.currentUser.uid : 'Loading...')
    

    【讨论】:

      【解决方案2】:

      使用currentUser 作为查找已登录用户帐户的主要方式不是一个好主意。首次启动应用程序时,它将始终为 null。之前登录的用户对象直到一段时间后才可用。最好按照documentation 中的说明设置身份验证状态侦听器,以便了解用户对象何时首次可用。

      FirebaseAuth.instance
        .authStateChanges()
        .listen((User user) {
          if (user == null) {
            print('User is currently signed out!');
          } else {
            print('User is signed in!');
          }
        });
      

      使用此侦听器响应身份验证状态的变化并相应地触发您的 UI 更新。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-23
        • 1970-01-01
        • 2021-07-15
        • 1970-01-01
        • 2015-06-21
        相关资源
        最近更新 更多