В моем приложении несколько потоков.
Это из примера приложения от 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),
builder: (BuildContext context, 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"));
}
}
}),
);
в HomeContainer
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,
builder:
(BuildContext context, 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.
Я предполагаю, что проблема может быть связана с тем, что эти потоки все еще открыты, когда я перезагружаю страницу.
Но я не знаю, как их закрыть.
Может ли кто-нибудь помочь в этом?