firebase Flutter-空值上使用的空检查运算符

rqcrx0a6  于 2023-02-13  发布在  Flutter
关注(0)|答案(2)|浏览(168)

我正在尝试使用DocumentSnapshot检索用户数据。但是,由于我创建的示例指向null,我收到了一个级联错误。因此,我尝试在initState方法中调用方法getUserProfileData,以查看它是否可以为我的DocumentSnapshot示例分配值,但我仍然收到该错误。请任何人提供帮助。

//DocumentSnapshot instance that is null
DocumentSnapshot? userDocument;

  getUserProfileData() {
    FirebaseFirestore.instance
        .collection('users')
        .doc(FirebaseAuth.instance.currentUser!.uid)
        .snapshots()
        .listen((event) {
      userDocument = event;
    });
  }

 @override
  void initState() {
    getUserProfileData();
//This is where the castError occurs because userDocument is null
    nameController.text = userDocument!.get('name');
    userNameController.text = userDocument!.get('username');

    try {
      descriptionController.text = userDocument!.get('description');
    } catch (e) {
      descriptionController.text = '';
    }

    try {
      followers = userDocument!.get('followers').length;
    } catch (e) {
      followers = 0;
    }

    try {
      following = userDocument!.get('following').length;
    } catch (e) {
      following = 0;
    }
  }
7lrncoxx

7lrncoxx1#

最好使用StreamBuilder进行首次快照。

late final stream = FirebaseFirestore.instance
      .collection('users')
      .doc(FirebaseAuth.instance.currentUser!.uid)
      .snapshots();

  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
      stream: stream,
      builder: (context, snapshot) {....},
    );
  }

还可以绕过错误,如

getUserProfileData() {
    FirebaseFirestore.instance
        .collection('users')
        .doc(FirebaseAuth.instance.currentUser!.uid)
        .snapshots()
        .listen((event) {
      userDocument = event;
      /// all those stuff here
        nameController.text = userDocument!.get('name');
        userNameController.text = userDocument!.get('username');
               ..........
drnojrws

drnojrws2#

尝试对getUserProfileData()函数使用async/await

getUserProfileData() async {
    await FirebaseFirestore.instance
        .collection('users')
        .doc(FirebaseAuth.instance.currentUser!.uid)
        .snapshots()
        .listen((event) {
      userDocument = event;
    });
  }

Async确定一个方法将是异步的,也就是说,它不会立即返回一些东西,因此应用程序可以在处理未完成时继续执行其他任务。
await用于确定应用程序在继续执行之前必须等待函数的响应,这一点非常重要,因为有时候一个函数依赖于另一个函数的返回。

相关问题