app-starlock/lib/talk/starChart/handle/other/talk_data_repository.dart
2025-02-21 15:55:35 +08:00

59 lines
1.6 KiB
Dart

import 'dart:async';
import 'package:star_lock/talk/starChart/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;
// 用于存储数据的缓冲区
final List<TalkData> _buffer = [];
// 提供一个方法来获取 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);
},
),
);
// 提供一个方法来添加 TalkData 到 Stream
void addTalkData(TalkData talkData) {
if (_isListening) {
_talkDataStreamController.add(talkData);
}
}
// 提供一个方法来关闭 StreamController
void dispose() {
_talkDataStreamController.close();
}
}