我知道一些帖子提供了此错误的解决方案,但我仍然不明白如何在不使用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;
}
}
答案 0 :(得分:0)
您可以使用stream.toBroadcastStream()解决此问题,以便可以多次收听它。即使您一次没有多个收听者,一旦收听了一个流,除非它是广播流,否则再也听不到。