diff --git a/win_text_editor/lib/app/components/text_editor.dart b/win_text_editor/lib/app/components/text_editor.dart index 5beb641..7a046c4 100644 --- a/win_text_editor/lib/app/components/text_editor.dart +++ b/win_text_editor/lib/app/components/text_editor.dart @@ -11,23 +11,33 @@ class TextEditor extends StatefulWidget { final String tabId; final String? initialContent; final String title; + final ValueChanged? onContentChanged; - const TextEditor({super.key, required this.tabId, this.initialContent, this.title = '未命名'}); + const TextEditor({ + super.key, + required this.tabId, + this.initialContent, + this.title = '未命名', + this.onContentChanged, + }); @override State createState() => TextEditorState(); } -class TextEditorState extends State { +class TextEditorState extends State with AutomaticKeepAliveClientMixin { final TextEditingController _textController = TextEditingController(); final FocusNode _focusNode = FocusNode(); bool _isLoading = false; + @override + bool get wantKeepAlive => true; + @override void initState() { super.initState(); _textController.text = widget.initialContent ?? ''; - // 移除监听器,改为在需要时直接获取内容 + _textController.addListener(_handleTextChanged); } @override @@ -38,12 +48,15 @@ class TextEditorState extends State { } } - String getContent() { - return _textController.text; + void _handleTextChanged() { + if (widget.onContentChanged != null) { + widget.onContentChanged!(_textController.text); + } } @override void dispose() { + _textController.removeListener(_handleTextChanged); _textController.dispose(); _focusNode.dispose(); super.dispose(); @@ -51,6 +64,7 @@ class TextEditorState extends State { @override Widget build(BuildContext context) { + super.build(context); return Column( children: [ EditorToolbar( diff --git a/win_text_editor/lib/app/core/tab_manager.dart b/win_text_editor/lib/app/core/tab_manager.dart index 05c6432..f1c2e3c 100644 --- a/win_text_editor/lib/app/core/tab_manager.dart +++ b/win_text_editor/lib/app/core/tab_manager.dart @@ -63,6 +63,8 @@ class TabManager with ChangeNotifier { } void setActiveTab(String tabId) { + if (_activeTabId == tabId) return; // 如果已经是活动Tab则不通知 + Logger().info('设置活动选项卡: $tabId'); _activeTabId = tabId; notifyListeners(); diff --git a/win_text_editor/lib/app/core/tab_view.dart b/win_text_editor/lib/app/core/tab_view.dart index 670c5af..68f0dcb 100644 --- a/win_text_editor/lib/app/core/tab_view.dart +++ b/win_text_editor/lib/app/core/tab_view.dart @@ -54,15 +54,20 @@ class TabView extends StatelessWidget { } Widget _buildTabContent(AppTab tab) { - switch (tab.type) { - case 'template_parser': - return TemplateParserView(tabId: tab.id); // 使用选项卡的ID而不是新生成 - case 'content_search': - // return const ContentSearchView(); - return ContentSearchView(tabId: tab.id); // 临时占位 - default: - return TextEditor(tabId: tab.id, initialContent: tab.content); - } + return IndexedStack( + index: tabs.indexWhere((tab) => tab.id == currentTabId).clamp(0, tabs.length - 1), + children: + tabs.map((tab) { + switch (tab.type) { + case 'template_parser': + return TemplateParserView(tabId: tab.id); + case 'content_search': + return ContentSearchView(tabId: tab.id); + default: + return TextEditor(tabId: tab.id, initialContent: tab.content); + } + }).toList(), + ); } } diff --git a/win_text_editor/lib/app/modules/content_search/content_search_controller.dart b/win_text_editor/lib/app/modules/content_search/content_search_controller.dart index 99235d1..7792642 100644 --- a/win_text_editor/lib/app/modules/content_search/content_search_controller.dart +++ b/win_text_editor/lib/app/modules/content_search/content_search_controller.dart @@ -45,6 +45,13 @@ class ContentSearchController with ChangeNotifier { notifyListeners(); } + void setInitialSearchQuery(String query) { + if (_searchQuery != query) { + _searchQuery = query; + notifyListeners(); + } + } + // Setters with notifyListeners set searchQuery(String value) { if (_searchQuery == value) return; @@ -156,6 +163,8 @@ class ContentSearchController with ChangeNotifier { Logger().info("搜索内容不能为空"); return; } + String first50Chars = searchQuery.length > 50 ? searchQuery.substring(0, 50) : searchQuery; + Logger().debug("搜索内容: $first50Chars"); if (searchDirectory.isEmpty || !Directory(searchDirectory).existsSync()) { Logger().info("搜索目录不能为空"); diff --git a/win_text_editor/lib/app/modules/content_search/search_settings.dart b/win_text_editor/lib/app/modules/content_search/search_settings.dart index f9cfb77..0bca41b 100644 --- a/win_text_editor/lib/app/modules/content_search/search_settings.dart +++ b/win_text_editor/lib/app/modules/content_search/search_settings.dart @@ -4,8 +4,6 @@ import 'package:win_text_editor/app/components/text_editor.dart'; import 'package:win_text_editor/app/modules/content_search/content_search_controller.dart'; class SearchSettings extends StatelessWidget { - final GlobalKey _searchEditorKey = GlobalKey(); - SearchSettings({super.key}); @override @@ -23,9 +21,12 @@ class SearchSettings extends StatelessWidget { width: MediaQuery.of(context).size.width * 0.5, height: 300, child: TextEditor( - key: _searchEditorKey, - tabId: 'search_content', + tabId: 'search_content_${controller.hashCode}', title: '搜索内容[列表以半角逗号分隔]', + initialContent: controller.searchQuery, // 绑定到控制器的状态 + onContentChanged: (content) { + controller.searchQuery = content; // 实时同步内容到控制器 + }, ), ), const SizedBox(width: 8), @@ -194,9 +195,6 @@ class SearchSettings extends StatelessWidget { icon: const Icon(Icons.search, size: 20), label: const Text('开始搜索'), onPressed: () { - // 点击搜索时获取当前内容 - final content = _searchEditorKey.currentState?.getContent() ?? ''; - controller.searchQuery = content; controller.startSearch(); }, ),