![](/img/trans.png)
[英]Flutter cloud firestore StreamBuilder<DocumentSnapshot> error
[英]NoSuchMethodError was thrown building StreamBuilder<DocumentSnapshot>
實際上,我正在關注基於角色的身份驗證教程。 問題是當我第一次登錄時,我按預期導航到正確的屏幕並且快照確實有數據! 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(),
),
);
});
在 if 語句中包裝 StreamBuilder 中的所有內容。
if (snapshot.connectionState == ConnectionState.active) {
if(snapshot.hasData){
...
} else {
return CircularProgressIndicator()
}
}
這應該可以防止構建器在沒有數據時嘗試構建某些東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.