StreamBuilder快照始终为ConnectionState.waiting

时间:2019-04-30 11:21:19

标签: dart flutter

我以为我了解StreamBuilders,但是我有些疑惑困扰着我。

我认为ConnectionState.waiting意味着正在创建与流的连接,因此仍然无法接收流数据。 不过,就我而言,我始终会收到ConnectionState.waiting。第一次使用的数据是在initialData中指定的数据,这很好,但是如果ConnectionState始终为“ waiting”,则在从流evnt获取值之后。 要在此处显示此内容,您可以看到第一次调用builder函数的屏幕截图。看起来不错:快照值是initialData参数提供的值,并且ConnectionState正在等待 enter image description here

这是第二次调用builder函数的屏幕截图。 enter image description here

这里快照值是一个新的流值(因此连接状态应该现在处于活动状态),但实际上,connectionState仍在等待!

  1. 那我应该怎么解释呢?如何运作?

  2. 即使connectionState始终在等待,为什么StreamBuilder仍继续接收快照?为什么它不活跃?

  3. 我该如何调试?

6 个答案:

答案 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)

遇到同样的问题。检查代码,如果传递了非空数据,则状态将设置为等待。

如果要将状态设置为“无”,则需要先传递null,然后在数据Stream上将StreamBuilder传递给fetchingenter image description here

答案 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;


}