60 lines
1.7 KiB
Dart
60 lines
1.7 KiB
Dart
import 'dart:async';
|
|
|
|
import 'package:star_lock/talk/startChart/proto/talk_data.pb.dart';
|
|
|
|
class TalkDataRepository {
|
|
// 创建一个私有的构造函数,防止外部创建实例
|
|
TalkDataRepository._() {
|
|
_talkDataStreamController = StreamController<TalkData>.broadcast(
|
|
onListen: () {
|
|
_isListening = true;
|
|
},
|
|
onCancel: () {
|
|
_isListening = false;
|
|
},
|
|
sync: false, // 异步模式
|
|
);
|
|
}
|
|
|
|
// 使用 _instance 来保存单例对象
|
|
static final TalkDataRepository _instance = TalkDataRepository._();
|
|
|
|
// 提供一个静态方法来获取单例实例
|
|
static TalkDataRepository get instance => _instance;
|
|
|
|
// 创建一个 StreamController
|
|
late final StreamController<TalkData> _talkDataStreamController;
|
|
|
|
bool _isListening = false;
|
|
|
|
// 提供一个方法来获取 Stream
|
|
Stream<TalkData> get talkDataStream =>
|
|
_talkDataStreamController.stream.transform(
|
|
StreamTransformer<TalkData, TalkData>.fromHandlers(
|
|
handleData: (TalkData data, EventSink<TalkData> sink) {
|
|
// 限制缓冲区大小为 100
|
|
if (_buffer.length >= 100) {
|
|
_buffer.removeAt(0); // 丢弃最旧的数据
|
|
}
|
|
_buffer.add(data);
|
|
sink.add(data);
|
|
},
|
|
),
|
|
);
|
|
final List<TalkData> _buffer = []; // 用于存储数据的缓冲区
|
|
|
|
// 提供一个方法来添加 TalkData 到 Stream
|
|
void addTalkData(TalkData talkData) async {
|
|
if (_isListening) {
|
|
Future.microtask(() {
|
|
_talkDataStreamController.add(talkData);
|
|
});
|
|
}
|
|
}
|
|
|
|
// 提供一个方法来关闭 StreamController
|
|
void dispose() {
|
|
_talkDataStreamController.close();
|
|
}
|
|
}
|