尽管快照中有数据,Streambuilder snapshot.hasData 永远不会为真
Posted
技术标签:
【中文标题】尽管快照中有数据,Streambuilder snapshot.hasData 永远不会为真【英文标题】:Streambuilder snapshot.hasData never gets true although there is data in snapshot 【发布时间】: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)
- 您在日志中看到了什么?
AsyncSnapshotsnapshot.hasError == true
并且错误是:"List.snapshots().map
到 .snapshots().map<UserPlan>
是的,谢谢,就是这样
【参考方案1】:
将此作为社区 wiki 发布,因为这是基于 @Pskink 提供的 cmets:
由于对快照映射类型的转换处理不当而发生此错误,您可以通过在创建流时将 .snapshots().map()
更改为 .snapshots().map<UserPlan>()
来修复它。
【讨论】:
你好@Dalon。如果可以解决您的问题,请考虑 accepting the answer。以上是关于尽管快照中有数据,Streambuilder snapshot.hasData 永远不会为真的主要内容,如果未能解决你的问题,请参考以下文章
Flutter:将firestore快照转换为streambuilder中的列表
Flutter StreamBuilder中使用的Firestore快照在数据更改时永远不会更新
在 Flutter 中从 Firebase FireCloud 接收数据时,StreamBuilder 中的快照代码不会被执行