Flutter StreamBuilder Firebase错误状态:流已被侦听错误

时间:2020-06-22 20:02:34

标签: firebase flutter flutter-layout stream-builder

我知道一些帖子提供了此错误的解决方案,但我仍然不明白如何在不使用bloc的情况下使用StreamController。我不在代码中使用块模式,所有解决方案都与块模式相关。

我有两个选项卡,当我单击选项卡时,可以正确显示数据,但是当我第二次单击选项卡时,它将显示此错误。解决方案正在使用Stream控制器或行为主题,但我不知道如何使用。

错误:错误状态:流已经被收听。

谢谢。

home_page.dart

StreamBuilder<List<Dashboard>>(
                stream: _dashboardService.getData(),
                builder: (context, snapshot) {
                  if (!snapshot.hasData) return buildWaitingScreen();
                            return ListView.builder(
                                padding: const EdgeInsets.all(8),
                                itemCount: snapshot.data.length,
                                itemBuilder: (BuildContext context, int index) {
                                  return GestureDetector(
                                    onTap: () => onPressCard(
                                        snapshot.data[index], user),
                                    child: Card(
                                      elevation: 10,
                                      child: Container(
                                        padding: EdgeInsets.all(30),
                                        child: Text(
                                          '${snapshot.data[index].name}',
                                          style: TextStyle(fontSize: 16),
                                        ),
                                      ),
                                    ),
                                  );
                                });
                },
              ),

dashboard_service.dart

  Stream<List<Dashboard>> getData() async* {
    Stream<QuerySnapshot> sharedDashboardsStream = _databaseService.sharedDashboards;

    List<Dashboard> dashboards = List();
    await for (var sharedDashboard in sharedDashboardsStream) {
      for (var sharedDahsboardDoc in sharedDashboard.documents) {
        Dashboard dashboard;
        if (sharedDahsboardDoc["dashboardId"] != null) {
          DocumentSnapshot dashSnapshot =await _databaseService.getDashboard(sharedDahsboardDoc["dashboardId"]);
          dashboard = Dashboard(id: dashSnapshot.documentID, ownerId:dashSnapshot["ownerId"] ,name: dashSnapshot["name"] );
        }
        dashboards.add(dashboard);
      }
      yield dashboards;
    }
  }

1 个答案:

答案 0 :(得分:0)

您可以使用stream.toBroadcastStream()解决此问题,以便可以多次收听它。即使您一次没有多个收听者,一旦收听了一个流,除非它是广播流,否则再也听不到。