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

问题描述

在我的应用程序中,我有几个流。

这是来自 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 本身是一个广播流。