【问题标题】:Flutter StreamBuilder Firebase Bad state: Stream has already been listened to errorFlutter StreamBuilder Firebase Bad state: Stream has been listened to error
【发布时间】:2020-10-12 19:06:31
【问题描述】:

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

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

错误:错误状态:流已被监听。

提前致谢。

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;
    }
  }

【问题讨论】:

    标签: firebase flutter flutter-layout stream-builder


    【解决方案1】:

    您可以通过使用 stream.toBroadcastStream() 来解决这个问题,这样它就可以被多次收听。即使您一次没有多个侦听器,一旦您收听了一个流,除非它是一个广播流,否则您将永远无法再次收听它。

    【讨论】:

    • 感谢您的回复。但是听两次时我无法获得所有数据。第二次更改选项卡没有可用的数据流。每次我再次回到标签时,我都想获取所有数据@Mike
    • 等等,这不应该发生。数据应该还在,你用的是同一个流吗?
    猜你喜欢
    • 1970-01-01
    • 2021-06-27
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多