Files
MaliangAINovalWriter/AINoval/lib/utils/event_bus.dart
2025-09-10 00:07:52 +08:00

70 lines
1.7 KiB
Dart

import 'dart:async';
import 'package:ainoval/models/novel_snippet.dart';
// 事件基类
abstract class AppEvent {
const AppEvent();
}
// 小说结构更新事件
class NovelStructureUpdatedEvent extends AppEvent {
final String novelId;
final String updateType; // 'outline_saved', 'chapter_added', 'scene_added', etc.
final Map<String, dynamic> data;
const NovelStructureUpdatedEvent({
required this.novelId,
required this.updateType,
required this.data,
});
}
// 片段创建事件
class SnippetCreatedEvent extends AppEvent {
final NovelSnippet snippet;
const SnippetCreatedEvent({required this.snippet});
}
// 片段更新事件(可扩展)
class SnippetUpdatedEvent extends AppEvent {
final NovelSnippet snippet;
const SnippetUpdatedEvent({required this.snippet});
}
// 片段删除事件(可扩展)
class SnippetDeletedEvent extends AppEvent {
final String snippetId;
final String novelId;
const SnippetDeletedEvent({required this.snippetId, required this.novelId});
}
// 事件总线单例
class EventBus {
// 单例实例
static final EventBus _instance = EventBus._internal();
static EventBus get instance => _instance;
// 事件流控制器
final StreamController<AppEvent> _eventController = StreamController<AppEvent>.broadcast();
// 获取事件流
Stream<AppEvent> get eventStream => _eventController.stream;
// 发送事件
void fire(AppEvent event) {
_eventController.add(event);
}
// 获取特定类型的事件流
Stream<T> on<T extends AppEvent>() {
return eventStream.where((event) => event is T).cast<T>();
}
// 私有构造函数,确保单例模式
EventBus._internal();
// 关闭事件总线
void dispose() {
_eventController.close();
}
}