【发布时间】:2023-01-31 02:37:40
【问题描述】:
当我在应用程序从非活动状态恢复后调用 bloc 时,我遇到了上述问题,以便我从 websocket 获得新的数据流。
我已经与大多数说明共享了我的代码块。
问题出在 websocket 流订阅管理的某个地方,我已经尝试了很多,但在某些时候我被阻止了,无法继续进行
///Important///
///---packages needed
///web_socket_channel
///flutter_bloc
///---for multi bloc provider
///BlocProvider(create: (context) => SampleStreamBloc()),
///---reproduce the issue
///call the bloc with event as below from more than one screen
///context.read<SampleStreamBloc>().add(SampleStreamConnect());
import 'dart:convert';
import 'dart:developer';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:web_socket_channel/io.dart';
IOWebSocketChannel channelStocks = IOWebSocketChannel.connect(Uri.parse('wss://ws.eodhistoricaldata.com/ws/forex?api_token=demo'));
class SampleStreamBloc extends Bloc<SampleStreamEvent, SampleStreamState> {
SampleStreamBloc() : super(SampleStreamInitial()) {
//event for listening from socket
on<SampleStreamConnect>((event, emit) async {
emit(SampleStreamProgress());
await emit.forEach(channelStocks.stream, onData: ((data) {
Map<String, dynamic> message = jsonDecode(data);
log(message.toString(), name: "Stream Response");
if (message['message'] == "Authorized") {
var data = jsonEncode({"action": "subscribe", "symbols": "EURUSD"});
channelStocks.sink.add(data);
}
return SampleStreamSuccess();
}), onError: (e, stackTrace) {
log(e.toString(), error: e, stackTrace: stackTrace);
return SampleStreamSuccess();
});
});
}
}
//states
abstract class SampleStreamState {}
//events
abstract class SampleStreamEvent {}
//states implementation
class SampleStreamInitial extends SampleStreamState {}
class SampleStreamProgress extends SampleStreamState {}
class SampleStreamSuccess extends SampleStreamState {}
//events implementation
class SampleStreamConnect extends SampleStreamEvent {}
也分享了错误。
【问题讨论】:
-
这意味着您正在代码中的其他地方调用
channelStocks.stream.listen方法(直接或间接) -
不,但我再次调用 bloc 的
SampleStreamConnect事件,因为当数据流由于任何原因停止到一定持续时间时,我需要重新连接到同一个套接字并且数据需要在同一个 bloc @pskink 中发出 -
如果有任何其他方法可以实现我在上面评论中描述的内容,请提出建议!