firebase - NoSuchMethodError 在构建 StreamBuilder 时被抛出
问题描述
实际上,我正在关注基于角色的身份验证的教程。问题是当我第一次登录时,我按预期导航到正确的屏幕,并且快照确实有数据!
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 构建器再次检查基于角色的身份验证时,快照没有数据。
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")
我不知道为什么它会给出那个错误!
这是我的代码:
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(),
),
);
});
解决方案
将 StreamBuilder 中的所有内容包装在 if 语句中。
if (snapshot.connectionState == ConnectionState.active) {
if(snapshot.hasData){
...
} else {
return CircularProgressIndicator()
}
}
这应该可以防止构建器在没有数据时尝试构建某些东西。
推荐阅读
- ios - 调用在 Passkit 中不起作用的 Web 服务 (webServiceURL)
- d3.js - 如何将过渡和持续时间应用于 svg 代码中的“矩形”?
- javascript - Bitly API 发布请求
- java - 什么会导致 Eclipse 在调试时难以切换到正确的文件和行号
- css - CSS Grid 列宽取决于内容
- reactjs - 添加和执行脚本 react-testing-library 和 jest
- python - 如何在请求之外从蓝图访问 app.config(Flask,可插入视图)
- javascript - 香草 JS 替代 @submit.prevent="myMethod"
- c# - 在 FormBody 中传递数组
- java - 使用 Validate 类在 Java 中验证表单中的输入。我正在尝试获取代码以在我的程序中使用 Validate 类