【发布时间】:2021-11-20 10:13:43
【问题描述】:
在我的应用程序中,我想从 Firestore 获取数据并在屏幕上显示快照。因此,我正在使用 Streambuilder,一旦加载数据,我就想显示它。
这是我的 Firebase 服务类:
class FireBaseHandler {
final CollectionReference usersCol = FirebaseFirestore.instance.collection(
'users');
final myUser = FirebaseAuth.instance.currentUser;
/// get user plan doc stream
Stream<UserPlan> get userPlan {
return usersCol.doc(myUser.uid).collection('plans').doc('plana')
.snapshots().map(_userPlanFromSnapshot);
}
/// userPlan from snapshot
UserPlan _userPlanFromSnapshot(DocumentSnapshot snapshot) {
print(snapshot.data()); /// here is data available
return UserPlan(
planId: 'plana',
name: (snapshot.data() as Map)['name'],
exerciseName: (snapshot.data() as Map)['exerciseName'],
rows: (snapshot.data() as Map)['rows'],
);
}
}
现在我想用 streambuilder 在屏幕上显示数据:
body: StreamBuilder<UserPlan>(
stream: FireBaseHandler().userPlan,
builder: (context, snapshot) {
if (snapshot.hasData) {
UserPlan userPlan = snapshot.data;
return ListView(
children: [
ListTile(
title: Text(userPlan.name),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return ExerciseTable(title: userPlan.name, exerciseNumber: userPlan.exerciseName.length);
},
),
);
}
)
],
);
} else {
return Center(child: CircularProgressIndicator(),);
}
})
问题是snapshot.hasData 永远不会成为真的,我被困在加载屏幕中。但是当我打印快照时,有可用的数据,为什么snapshot.hasData 没有得到真实的结果?
【问题讨论】:
-
在
if (snapshot.hasData) {之前添加print(snapshot)- 您在日志中看到了什么? -
AsyncSnapshot
(ConnectionState.waiting, null, null, null) -
我也得到了这一行:AsyncSnapshot
(ConnectionState.active, null, type 'List ' is not a subtype of type 'List -
所以你有
snapshot.hasError == true并且错误是:"List不是 List 类型的子类型 - 你应该改变.snapshots().map到.snapshots().map<UserPlan> -
是的,谢谢,就是这样
标签: flutter dart google-cloud-firestore snapshot stream-builder