我以为我了解StreamBuilders,但是我有些疑惑困扰着我。
我认为ConnectionState.waiting意味着正在创建与流的连接,因此仍然无法接收流数据。 不过,就我而言,我始终会收到ConnectionState.waiting。第一次使用的数据是在initialData中指定的数据,这很好,但是如果ConnectionState始终为“ waiting”,则在从流evnt获取值之后。 要在此处显示此内容,您可以看到第一次调用builder函数的屏幕截图。看起来不错:快照值是initialData参数提供的值,并且ConnectionState正在等待
这里快照值是一个新的流值(因此连接状态应该现在处于活动状态),但实际上,connectionState仍在等待!
那我应该怎么解释呢?如何运作?
即使connectionState始终在等待,为什么StreamBuilder仍继续接收快照?为什么它不活跃?
我该如何调试?
答案 0 :(得分:1)
这可能是您的Firestore规则。如果是这样的话:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth.uid != null;
}
}
}
那么您将没有身份验证即可获取数据。您可以通过允许任何人访问数据库来快速(但不是永久地)测试它。
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if true;
}
}
}
...但是请稍后再将其更改为更安全的内容。
答案 1 :(得分:0)
答案 2 :(得分:0)
您需要将listen:false
添加到您的提供商。
答案 3 :(得分:0)
我使用流变量,否则会出现相同的错误
Stream<List<List<User>>> friendUser;
@override
Widget build(BuildContext context) {
final
db = Provider.of<FirestoreDatabase>(context, listen: false);
friendUser = StreamZip([db.usersStream1(), db.usersStream2()]);
return Scaffold(
...
StreamBuilder<List<List<User>>>(
stream: friendUser,
//qui ont deja discuter
initialData: [],
builder: (context, snapshot) {...}),
);
}
答案 4 :(得分:0)
我遇到了同样的问题,这不是火力的错 错误是在请求传票时,它必须来自状态
class _FeaturedProductsState extends State<FeaturedProducts> {
final Stream<QuerySnapshot> productsStreamFeatured = FirebaseFirestore.instance
.collection('Products')
.where('productFeatured', isEqualTo: true)
.snapshots();
@override
Widget build(BuildContext context) {
return Container();
}
}
答案 5 :(得分:-3)
我建议您放弃if / else条件,并使用开关检查ConnectionState。
switch(snapshot.connectionState){
case ConnectionState.waiting:
return Center(child:CircularProgressIndicator());
break;
default:
if(snapshot.hasError){
// Handle errors
}else if(!snapshot.hasData){
// Handle no data
}else {
// Check for null
var result = snapshot.data
if(result!=null){
//Handle the null value
} else {
}
}
break;
}