From 79e6697daf04124d4ff596f1322419c165958418 Mon Sep 17 00:00:00 2001 From: hejl Date: Mon, 19 May 2025 16:21:22 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=98=E5=BE=97=E9=9D=A0=E8=87=AA=E5=B7=B1?= =?UTF-8?q?=E5=95=8A=EF=BC=8C=E7=BB=88=E4=BA=8E=E9=AB=98=E9=80=9A=E4=BA=86?= =?UTF-8?q?=EF=BC=8CUI=E5=92=8CState=E4=B8=A4=E6=9D=A1=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/controllers/tab_manager.dart | 42 +++++++++++-------- .../lib/framework/widgets/tab_view.dart | 10 ----- .../content_search_controller.dart | 20 +++++---- .../widgets/content_search_view.dart | 34 ++++----------- .../shared/base/base_content_controller.dart | 7 ++++ 5 files changed, 53 insertions(+), 60 deletions(-) create mode 100644 win_text_editor/lib/shared/base/base_content_controller.dart diff --git a/win_text_editor/lib/framework/controllers/tab_manager.dart b/win_text_editor/lib/framework/controllers/tab_manager.dart index bed1b6f..3272996 100644 --- a/win_text_editor/lib/framework/controllers/tab_manager.dart +++ b/win_text_editor/lib/framework/controllers/tab_manager.dart @@ -1,18 +1,17 @@ import 'package:flutter/material.dart'; import 'package:win_text_editor/framework/models/tab_model.dart'; -import 'package:win_text_editor/shared/base/base_view.dart'; +import 'package:win_text_editor/modules/content_search/controllers/content_search_controller.dart'; +import 'package:win_text_editor/shared/base/base_content_controller.dart'; import 'package:win_text_editor/framework/controllers/logger.dart'; class TabManager with ChangeNotifier { final List _tabs = []; - final Map _tabControllers = {}; // 保存各Tab的Controller + final Map _tabControllers = {}; // 保存各Tab的Controller String? _activeTabId; List get tabs => _tabs; String? get activeTabId => _activeTabId; - BaseViewState? _activeViewState; - AppTab? get activeTab { if (_activeTabId == null) return null; try { @@ -29,11 +28,14 @@ class TabManager with ChangeNotifier { String? type, IconData? icon, String content = '', - ChangeNotifier? controller, }) async { + //创建tab组件 final newTab = AppTab(id: id, title: title, type: type, icon: icon, content: content); _tabs.add(newTab); + + // 创建provider,管理状态 + final controller = createContentController(newTab); if (controller != null) { _tabControllers[id] = controller; } @@ -50,6 +52,21 @@ class TabManager with ChangeNotifier { } } + BaseContentController? createContentController(AppTab tab) { + switch (tab.type) { + case 'content_search': + return ContentSearchController(); + default: + return null; + } + } + + BaseContentController? get activeContentController { + if (_activeTabId == null) return null; + final controller = _tabControllers[_activeTabId]; + return controller is BaseContentController ? controller : null; + } + void closeTab(String tabId) { final controller = _tabControllers[tabId]; controller?.dispose(); // 先释放Controller @@ -62,7 +79,7 @@ class TabManager with ChangeNotifier { notifyListeners(); } - void registerController(String tabId, ChangeNotifier controller) { + void registerController(String tabId, BaseContentController controller) { _tabControllers[tabId] = controller; } @@ -77,24 +94,15 @@ class TabManager with ChangeNotifier { void setActiveTab(String tabId) { if (_activeTabId == tabId) return; // 如果已经是活动Tab则不通知 - - Logger().info('设置活动选项卡: $tabId'); _activeTabId = tabId; notifyListeners(); } void handleFolderDoubleTap(String folderPath) { - _activeViewState?.onOpenFolder(folderPath); + activeContentController?.onOpenFolder(folderPath); } void handleFileDoubleTap(String filePath) { - _activeViewState?.onOpenFile(filePath); - } - - void setActiveViewState(BaseViewState? state) { - if (_activeViewState != state) { - _activeViewState = state; - // 不需要 notifyListeners(),因为这只是内部状态更新 - } + activeContentController?.onOpenFile(filePath); } } diff --git a/win_text_editor/lib/framework/widgets/tab_view.dart b/win_text_editor/lib/framework/widgets/tab_view.dart index 90c4f6a..a7f7c95 100644 --- a/win_text_editor/lib/framework/widgets/tab_view.dart +++ b/win_text_editor/lib/framework/widgets/tab_view.dart @@ -63,16 +63,6 @@ class _TabViewState extends State { return TextEditor(tabId: tab.id, initialContent: tab.content); } } - - // 查找当前活动的视图 - Widget findActiveView(AppTab tab) { - switch (tab.type) { - case 'content_search': - return ContentSearchView(tabId: tab.id); - default: - return TextEditor(tabId: tab.id, initialContent: tab.content); - } - } } class _TabItem extends StatelessWidget { diff --git a/win_text_editor/lib/modules/content_search/controllers/content_search_controller.dart b/win_text_editor/lib/modules/content_search/controllers/content_search_controller.dart index 42f2ea7..8a3d019 100644 --- a/win_text_editor/lib/modules/content_search/controllers/content_search_controller.dart +++ b/win_text_editor/lib/modules/content_search/controllers/content_search_controller.dart @@ -3,17 +3,14 @@ import 'dart:async'; import 'dart:io'; -import 'package:flutter/material.dart'; import 'package:file_picker/file_picker.dart'; -import 'package:win_text_editor/framework/controllers/tab_manager.dart'; import 'package:win_text_editor/framework/controllers/logger.dart'; import 'package:win_text_editor/modules/content_search/models/search_mode.dart'; import 'package:win_text_editor/modules/content_search/models/search_result.dart'; +import 'package:win_text_editor/shared/base/base_content_controller.dart'; import '../services/content_search_service.dart'; -class ContentSearchController with ChangeNotifier { - final TabManager tabManager; - +class ContentSearchController extends BaseContentController { String _searchQuery = ''; String _searchDirectory = ''; String _fileType = '*.*'; @@ -24,8 +21,6 @@ class ContentSearchController with ChangeNotifier { SearchMode _searchMode = SearchMode.locate; final List _results = []; - ContentSearchController({required this.tabManager}); - // Getters String get searchQuery => _searchQuery; String get searchDirectory => _searchDirectory; @@ -174,4 +169,15 @@ class ContentSearchController with ChangeNotifier { searchDirectory = dir; } } + + @override + void onOpenFile(String filePath) { + //searchDirectory = filePath; + //notifyListeners(); + } + + @override + void onOpenFolder(String folderPath) { + searchDirectory = folderPath; + } } diff --git a/win_text_editor/lib/modules/content_search/widgets/content_search_view.dart b/win_text_editor/lib/modules/content_search/widgets/content_search_view.dart index 322a2df..33d7158 100644 --- a/win_text_editor/lib/modules/content_search/widgets/content_search_view.dart +++ b/win_text_editor/lib/modules/content_search/widgets/content_search_view.dart @@ -1,34 +1,29 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:win_text_editor/shared/base/base_view.dart'; -import 'package:win_text_editor/framework/controllers/logger.dart'; +import 'package:win_text_editor/framework/controllers/tab_manager.dart'; import '../controllers/content_search_controller.dart'; import 'directory_settings.dart'; import 'search_settings.dart'; import 'results_view.dart'; -class ContentSearchView extends BaseView { +class ContentSearchView extends StatefulWidget { final ChangeNotifier? controller; - const ContentSearchView({super.key, required String tabId, this.controller}) - : super(tabId: tabId); + final String tabId; + const ContentSearchView({super.key, required this.tabId, this.controller}); @override ContentSearchViewState createState() => ContentSearchViewState(); } -class ContentSearchViewState extends BaseViewState { +class ContentSearchViewState extends State { late final ContentSearchController _controller; + get tabManager => Provider.of(context, listen: false); + @override void initState() { super.initState(); - _controller = - tabManager.getController(widget.tabId) ?? ContentSearchController(tabManager: tabManager); - - // 注册Controller到TabManager - if ((widget as ContentSearchView).controller == null) { - tabManager.registerController(widget.tabId, _controller); - } + _controller = tabManager.getController(widget.tabId) ?? ContentSearchController(); } @override @@ -36,21 +31,8 @@ class ContentSearchViewState extends BaseViewState { super.dispose(); } - @override - void onOpenFolder(String folderPath) { - // 实现打开文件夹的逻辑 - _controller.searchDirectory = folderPath; - } - - @override - void onOpenFile(String filePath) { - // 实现打开文件的逻辑 - Logger().debug('Opening file: $filePath'); - } - @override Widget build(BuildContext context) { - super.build(context); return ChangeNotifierProvider.value( value: _controller, child: const Padding( diff --git a/win_text_editor/lib/shared/base/base_content_controller.dart b/win_text_editor/lib/shared/base/base_content_controller.dart new file mode 100644 index 0000000..3ae37c2 --- /dev/null +++ b/win_text_editor/lib/shared/base/base_content_controller.dart @@ -0,0 +1,7 @@ +import 'package:flutter/material.dart'; + +abstract class BaseContentController with ChangeNotifier { + void onOpenFolder(String folderPath); + + void onOpenFile(String filePath); +}