首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在构建StreamBuilder<DocumentSnapshot>时抛出了NoSuchMethodError

在构建StreamBuilder<DocumentSnapshot>时抛出了NoSuchMethodError
EN

Stack Overflow用户
提问于 2021-01-14 18:41:14
回答 1查看 31关注 0票数 0

实际上,我正在遵循基于角色的身份验证的教程。问题是,当我第一次登录时,我会像预期的那样导航到右侧屏幕,而快照确实有数据!User: {role: admin, last_login: Timestamp(seconds=1610430754, nanoseconds=74000000), name: bilal, created_at: Timestamp(seconds=1610429038, nanoseconds=204000000), build_number: 1, email: bilalsaeed781833@gmail.com}

但当我在移动的屏幕上创建另一个用户时,同一个Stream builder再次检查基于角色的身份验证,快照没有数据。

代码语言:javascript
复制
User:  null UserDoc: Instance of 'DocumentSnapshot'  

======== Exception caught by widgets library =======================================================
The following NoSuchMethodError was thrown building StreamBuilder<DocumentSnapshot>(dirty, state: _StreamBuilderBaseState<DocumentSnapshot, AsyncSnapshot<DocumentSnapshot>>#0f4cc):
The method '[]' was called on null.
Receiver: null
Tried calling: []("role")

我不知道为什么它会给出这个错误!

下面是我的代码:

代码语言:javascript
复制
return StreamBuilder<User>(
        stream: FirebaseAuth.instance.authStateChanges(),
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.active) {
            return StreamBuilder<DocumentSnapshot>(
              stream: FirebaseFirestore.instance
                  .collection("users")
                  .doc(snapshot.data.uid)
                  .snapshots(),
              builder: (BuildContext context,
                  AsyncSnapshot<DocumentSnapshot> snapshot) {
                if (snapshot.connectionState == ConnectionState.active) {
                  final userDoc = snapshot.data;
                  final user = userDoc.data();
                  debugPrint("User:  ${user.toString()} UserDoc: ${userDoc.toString()}  ");
                  if (user['role'] == 'admin') {
                    return admin();

                  } else if (user['role'] == 'hod') {
                    Navigator.push(
                      context,
                      MaterialPageRoute(builder: (context) => hod()),
                    );
                  } else if (user['role'] == 'duo') {
                    Navigator.push(
                      context,
                      MaterialPageRoute(builder: (context) => duo()),
                    );
                  } else if (user['role'] == 'teacher') {
                    Navigator.push(
                      context,
                      MaterialPageRoute(builder: (context) => teacher()),
                    );
                  } else if (user['role'] == 'cr') {
                    Navigator.push(
                      context,
                      MaterialPageRoute(builder: (context) => cr()),
                    );
                  } else if (user['role'] == 'student') {
                    Navigator.push(
                      context,
                      MaterialPageRoute(builder: (context) => student()),
                    );
                  } else {
                    return Material(
                      child: Center(
                        child: CircularProgressIndicator(),
                      ),
                    );
                  }
                }

                return Material(
                  child: Center(
                    child: CircularProgressIndicator(),
                  ),
                );
              },
            );
          }
          return Material(
            child: Center(
              child: CircularProgressIndicator(),
            ),
          );
        });
EN

Stack Overflow用户

发布于 2021-01-14 19:42:05

将StreamBuilder中的所有内容都包装在一个if语句中。

代码语言:javascript
复制
if (snapshot.connectionState == ConnectionState.active) {
  if(snapshot.hasData){
     ...
  } else {
      return CircularProgressIndicator()
  }
}

这应该可以防止构建器在没有数据的情况下尝试构建某些东西。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65717456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档