diff --git a/app/lib/features/editor/views/editor_page.dart b/app/lib/features/editor/views/editor_page.dart index 565094b..4c426de 100644 --- a/app/lib/features/editor/views/editor_page.dart +++ b/app/lib/features/editor/views/editor_page.dart @@ -283,48 +283,44 @@ class _EditorViewState extends State<_EditorView> { } } - /// 从 Isar 加载已有日记的笔画、元素、标签、心情、标题 + /// 从 Isar 加载已有日记 — 使用 LoadJournal 原子事件一次性还原 Future _loadExistingJournal(String id) async { try { - // 加载日记元数据 final entry = await widget.repo.getJournal(id); if (entry == null || !mounted) return; - final bloc = context.read(); - - // 加载标题和心情 - bloc.add(TitleChanged(entry.title)); - bloc.add(MoodChanged(entry.mood)); - - // 加载标签 - if (entry.tags.isNotEmpty) { - bloc.add(TagsLoaded(entry.tags)); - } - // 加载元素(含笔画) final elements = await widget.repo.getElements(id); if (!mounted) return; - for (final element in elements) { - if (element.elementType == ElementType.handwritingRef) { - // 从 handwriting_ref 元素中恢复笔画 - final strokesData = element.content['strokes']; - if (strokesData is List) { - final strokes = strokesData - .map((s) => Stroke.fromJson(s as Map)) - .toList(); - bloc.add(StrokesLoaded(strokes)); - } + // 从 handwriting_ref 元素中反序列化笔画 + List strokes = []; + final strokesElement = elements + .where((e) => e.elementType == ElementType.handwritingRef) + .firstOrNull; + if (strokesElement != null) { + final strokesData = strokesElement.content['strokes']; + if (strokesData is List) { + strokes = strokesData + .map((s) => Stroke.fromJson(s as Map)) + .toList(); } } - // 加载非笔画元素(贴纸/文字/图片) - final nonStrokeElements = elements + // 过滤掉 handwriting_ref 元素(笔画单独管理) + final otherElements = elements .where((e) => e.elementType != ElementType.handwritingRef) .toList(); - if (nonStrokeElements.isNotEmpty) { - bloc.add(ElementsLoaded(nonStrokeElements)); - } + + // 原子加载 — 一次 dispatch 还原所有状态 + context.read().add(LoadJournal( + title: entry.title, + mood: entry.mood, + tags: entry.tags, + strokes: strokes, + elements: otherElements, + lastSavedAt: entry.updatedAt, + )); } catch (e) { debugPrint('加载日记数据失败: $e'); } @@ -621,6 +617,13 @@ class _EditorStackState extends State<_EditorStack> { @override void didUpdateWidget(covariant _EditorStack oldWidget) { super.didUpdateWidget(oldWidget); + + // 同步标题输入框(LoadJournal 更新 state.title 时 controller 需要跟随) + if (widget.state.title != oldWidget.state.title && + widget.state.title != _titleController.text) { + _titleController.text = widget.state.title; + } + final currentTool = widget.state.activeTool; // 防止重复弹窗:只在工具切换时触发