如何解决错误状态:流已被监听错误
在我的应用程序中,我有几个流。
这是来自 appsflyer 的示例应用。 我用它来深度链接我的应用程序。
https://pub.dev/packages/appsflyer_sdk
在第一页我们有;
return Scaffold(
appBar: AppBar(
title: Column(
children: <Widget>[
Text('AppsFlyer SDK example app'),FutureBuilder<String>(
future: _appsflyerSdk.getSDKVersion(),builder: (BuildContext context,AsyncSnapshot snapshot) {
return Text(snapshot.hasData ? snapshot.data : "");
})
],),body: FutureBuilder<dynamic>(
future: _appsflyerSdk.initSdk(
registerConversionDataCallback: true,registerOnAppOpenAttributionCallback: true),AsyncSnapshot snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(child: CircularProgressIndicator());
} else {
if (snapshot.hasData) {
return HomeContainer(
onData:
_appsflyerSdk.conversionDataStream?.asbroadcastStream(),onAttribution: _appsflyerSdk.appOpenAttributionStream
?.asbroadcastStream(),trackEvent: logEvent,);
} else {
return Center(child: Text("Error initializing sdk"));
}
}
}),);
在家庭容器中
Stream<Map> onData;
Stream<Map> onAttribution;
Future<bool> Function(String,Map) trackEvent;
HomeContainer({this.onData,this.onAttribution,this.trackEvent});
内部构建;
Column(
children: <Widget>[
StreamBuilder<dynamic>(
stream: widget.onData,builder:
(BuildContext context,AsyncSnapshot<dynamic> snapshot) {
return TextBorder(
controller: TextEditingController(
text: snapshot.hasData
? Utils.formatJson(snapshot.data)
: "No conversion data"),labelText: "Conversion Data:",);
}),Padding(
padding: EdgeInsets.only(top: 12.0),StreamBuilder<dynamic>(
stream: widget.onAttribution,AsyncSnapshot<dynamic> snapshot) {
return TextBorder(
controller: TextEditingController(
text: snapshot.hasData
? _processData(snapshot.data)
: "No attribution data"),labelText: "Attribution Data:",],
我所做的是使用notifyListeners放置一个按钮来重新加载屏幕。
当我这样做时,出现以下错误;
Bad state: Stream has already been listened to.
我想,问题可能是因为当我重新加载页面时这些流仍然打开。
但我不知道如何关闭它们。
有人可以为此提供一些帮助吗?
解决方法
StreamBuilder<dynamic>(
stream: widget.onData?.asBroadcastStream(),
您在 asBroadcastStream()
上多次调用 widget.onData
(每次调用构建方法时)。您应该可以只使用:
StreamBuilder<dynamic>(
stream: widget.onData,
如果在别处收听 widget.onData
,请确保 widget.onData
本身是一个广播流。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。