StreamBuilder总是在flutter中的print(snapshot.hasData)中返回false
Posted
技术标签:
【中文标题】StreamBuilder总是在flutter中的print(snapshot.hasData)中返回false【英文标题】:StreamBuilder always returning false in print(snapshot.hasData) in flutter 【发布时间】:2021-09-10 21:20:30 【问题描述】:我会在 flutter 中显示来自 firebase firestore 的消息,但是当我在快照中设置条件时总是返回 false 这是我的代码
服务
Stream<List<MessageModel>> getMessagesByUserid(int userId)
try
return firestore
.collection('messages')
.where('userId', isEqualTo: userId)
.snapshots()
.map((QuerySnapshot list)
var result = list.docs.map<MessageModel>((DocumentSnapshot message)
print('from service : ' + message.data().toString());
return MessageModel.fromJson(message.data());
).toList();
result.sort(
(MessageModel a, MessageModel b) =>
a.createdAt.compareTo(b.createdAt),
);
return result;
);
catch (e)
throw Exception(e);
并用这个调用
Widget content()
return StreamBuilder<List<MessageModel>>(
stream: MessageService()
.getMessagesByUserid(userId: authprovider.user.id),
builder: (context, snapshot)
print(snapshot.hasData);
if (snapshot.hasData)
return ListView(
padding: EdgeInsets.symmetric(
horizontal: defaultMargin,
),
children: snapshot.data
.map(
(MessageModel message) => ChatBubble(
isSender: message.isFromUser,
text: message.message,
product: message.product,
),
)
.toList(),
);
else
return Center(
child: CircularProgressIndicator(),
);
);
当我在服务中打印时,我得到
I/flutter (29881): from service : createdAt: 2021-06-28 16:29:25.106709, product: , userImage: https://ui-avatars.com/api/?name=eka&color=7F9CF5&background=EBF4FF, isFromUser: true, message: tanpa, userName: eka, userId: 2, updatedAt: 2021-06-28 16:29:25.106811
但是当我打印时(snapshot.hasData)总是返回假
I/flutter (29881): false
【问题讨论】:
在服务中将Stream
更改为 Future
您的 getMessagesByUserid 代码可能会抛出错误.....所以在 catch 块中也返回一些东西来查看
检查snapshot.connectionState'
而不是snapshot.hasData
。 connectionState 可以是等待、无、活动或完成,hasData
仍然可以是false
是Stream
正在返回null
【参考方案1】:
如果您在使用StreamBuilder
时需要更多粒度,请测试snapshot.connectionState
而不是snapshot.hasData
。
如果 Stream 返回 null,snapshot.hasData
仍然可以为 false
【讨论】:
以上是关于StreamBuilder总是在flutter中的print(snapshot.hasData)中返回false的主要内容,如果未能解决你的问题,请参考以下文章
Flutter 中的 StreamBuilder 卡在 ConnectionState.waiting 中并且只显示加载标记
在 Flutter 中从 Firebase FireCloud 接收数据时,StreamBuilder 中的快照代码不会被执行
Flutter:将firestore快照转换为streambuilder中的列表