Browse Source

还得靠自己啊,终于高通了,UI和State两条线

master
hejl 2 months ago
parent
commit
79e6697daf
  1. 42
      win_text_editor/lib/framework/controllers/tab_manager.dart
  2. 10
      win_text_editor/lib/framework/widgets/tab_view.dart
  3. 20
      win_text_editor/lib/modules/content_search/controllers/content_search_controller.dart
  4. 34
      win_text_editor/lib/modules/content_search/widgets/content_search_view.dart
  5. 7
      win_text_editor/lib/shared/base/base_content_controller.dart

42
win_text_editor/lib/framework/controllers/tab_manager.dart

@ -1,18 +1,17 @@ @@ -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<AppTab> _tabs = [];
final Map<String, ChangeNotifier> _tabControllers = {}; // Tab的Controller
final Map<String, BaseContentController> _tabControllers = {}; // Tab的Controller
String? _activeTabId;
List<AppTab> 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 { @@ -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 { @@ -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 { @@ -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 { @@ -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);
}
}

10
win_text_editor/lib/framework/widgets/tab_view.dart

@ -63,16 +63,6 @@ class _TabViewState extends State<TabView> { @@ -63,16 +63,6 @@ class _TabViewState extends State<TabView> {
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 {

20
win_text_editor/lib/modules/content_search/controllers/content_search_controller.dart

@ -3,17 +3,14 @@ @@ -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 { @@ -24,8 +21,6 @@ class ContentSearchController with ChangeNotifier {
SearchMode _searchMode = SearchMode.locate;
final List<SearchResult> _results = [];
ContentSearchController({required this.tabManager});
// Getters
String get searchQuery => _searchQuery;
String get searchDirectory => _searchDirectory;
@ -174,4 +169,15 @@ class ContentSearchController with ChangeNotifier { @@ -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;
}
}

34
win_text_editor/lib/modules/content_search/widgets/content_search_view.dart

@ -1,34 +1,29 @@ @@ -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<ContentSearchView> {
late final ContentSearchController _controller;
get tabManager => Provider.of<TabManager>(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 { @@ -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(

7
win_text_editor/lib/shared/base/base_content_controller.dart

@ -0,0 +1,7 @@ @@ -0,0 +1,7 @@
import 'package:flutter/material.dart';
abstract class BaseContentController with ChangeNotifier {
void onOpenFolder(String folderPath);
void onOpenFile(String filePath);
}
Loading…
Cancel
Save