diff --git a/win_text_editor/lib/app/widgets/text_tab.dart b/win_text_editor/lib/app/widgets/text_tab.dart index e138077..7e5676d 100644 --- a/win_text_editor/lib/app/widgets/text_tab.dart +++ b/win_text_editor/lib/app/widgets/text_tab.dart @@ -6,9 +6,6 @@ import 'package:flutter/services.dart'; // 复制功能需要 import 'package:win_text_editor/app/providers/editor_provider.dart'; import 'package:file_picker/file_picker.dart'; import 'dart:io'; -import 'package:flutter_highlight/flutter_highlight.dart'; -import 'package:flutter_highlight/themes/github.dart'; -import 'package:flutter_highlight/themes/monokai-sublime.dart'; class TextTab extends StatefulWidget { final String tabId; @@ -24,74 +21,29 @@ class _TextTabState extends State { late EditorProvider _provider; late FocusNode _focusNode; late ScrollController _scrollController; - String _language = 'plaintext'; + @override @override void initState() { super.initState(); _provider = Provider.of(context, listen: false); _controller = TextEditingController(text: _getCurrentContent()); _focusNode = FocusNode(); - _scrollController = ScrollController(); // 添加这行 - _detectLanguage(); + _scrollController = ScrollController(); + WidgetsBinding.instance.addPostFrameCallback((_) { + FocusScope.of(context).requestFocus(_focusNode); + }); } String _getCurrentContent() { return _provider.tabs.firstWhere((t) => t.id == widget.tabId).content; } - void _detectLanguage() { - final tab = _provider.tabs.firstWhere((t) => t.id == widget.tabId); - final fileName = tab.title.toLowerCase(); - final content = tab.content.trim(); - - if (fileName.endsWith('.dart')) { - _language = 'dart'; - } else if (fileName.endsWith('.java')) { - _language = 'java'; - } else if (fileName.endsWith('.py')) { - _language = 'python'; - } else if (fileName.endsWith('.js')) { - _language = 'javascript'; - } else if (fileName.endsWith('.html')) { - _language = 'html'; - } else if (fileName.endsWith('.css')) { - _language = 'css'; - } else if (fileName.endsWith('.json')) { - _language = 'json'; - } else if (fileName.endsWith('.yaml') || fileName.endsWith('.yml')) { - _language = 'yaml'; - } else if (fileName.endsWith('.xml')) { - _language = 'xml'; - } - // 如果扩展名未识别,检查内容特征 - else if (_isLikelyXml(content)) { - _language = 'xml'; - } else { - _language = 'plaintext'; - } - } - - bool _isLikelyXml(String content) { - if (content.isEmpty) return false; - - // 简单检查:内容以'<'开头,以'>'结尾 - final trimmed = content.trim(); - if (!trimmed.startsWith('<') || !trimmed.endsWith('>')) { - return false; - } - - // 更复杂的检查:包含常见的XML标签模式 - final xmlTagRegex = RegExp(r'<[^/>]+>.*<\/[^>]+>|<[^/>]+\/>'); - return xmlTagRegex.hasMatch(content); - } - @override void didUpdateWidget(TextTab oldWidget) { super.didUpdateWidget(oldWidget); if (oldWidget.tabId != widget.tabId) { _controller.text = _getCurrentContent(); - _detectLanguage(); } } @@ -106,7 +58,6 @@ class _TextTabState extends State { @override Widget build(BuildContext context) { final tab = _provider.tabs.firstWhere((t) => t.id == widget.tabId); - final isDarkMode = Theme.of(context).brightness == Brightness.dark; return Column( children: [ @@ -142,31 +93,6 @@ class _TextTabState extends State { tooltip: '保存到文件', onPressed: tab.content.isEmpty ? null : () => _saveFile(context, tab.content), ), - DropdownButton( - value: _language, - icon: const Icon(Icons.code, size: 20), - underline: Container(), - onChanged: (String? newValue) { - setState(() { - _language = newValue!; - }); - }, - items: - [ - 'xml', - 'plaintext', - 'dart', - 'java', - 'python', - 'javascript', - 'html', - 'css', - 'json', - 'yaml', - ].map>((String value) { - return DropdownMenuItem(value: value, child: Text(value)); - }).toList(), - ), ], ), ], @@ -182,31 +108,21 @@ class _TextTabState extends State { controller: _scrollController, // 添加滚动控制器 child: Stack( children: [ - // 高亮显示的背景文本 - HighlightView( - tab.content, - language: _language, - theme: isDarkMode ? monokaiSublimeTheme : githubTheme, - padding: const EdgeInsets.all(16), - textStyle: const TextStyle(fontFamily: 'monospace', fontSize: 14), - ), // 实际可编辑的TextField TextField( controller: _controller, focusNode: _focusNode, maxLines: null, - //scrollController: _scrollController, // 使用同一个滚动控制器 onChanged: (text) => _provider.updateContent(widget.tabId, text, tab.fileName), decoration: const InputDecoration( border: InputBorder.none, contentPadding: EdgeInsets.all(16), ), - style: const TextStyle( + style: TextStyle( fontFamily: 'monospace', fontSize: 14, - color: Colors.transparent, + color: Theme.of(context).textTheme.bodyLarge?.color, // 使用主题文本颜色 ), - cursorColor: Colors.black, ), ], ), @@ -217,7 +133,6 @@ class _TextTabState extends State { ); } - // _openFile方法现在需要更新控制器 Future _openFile(BuildContext context) async { try { final result = await FilePicker.platform.pickFiles(type: FileType.any, allowMultiple: false); @@ -226,13 +141,10 @@ class _TextTabState extends State { final file = File(result.files.single.path!); final content = await file.readAsString(); + // 更新provider和控制器 _provider.updateContent(widget.tabId, content, result.files.first.name); - setState(() { - _controller.text = content; - _detectLanguage(); - }); + _controller.text = content; // 确保更新控制器 - // 强制刷新文本控制器 if (context.mounted) { ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('已加载: ${file.path}'))); } diff --git a/win_text_editor/pubspec.lock b/win_text_editor/pubspec.lock index f27c3d5..b887ca7 100644 --- a/win_text_editor/pubspec.lock +++ b/win_text_editor/pubspec.lock @@ -126,14 +126,6 @@ packages: description: flutter source: sdk version: "0.0.0" - flutter_highlight: - dependency: "direct main" - description: - name: flutter_highlight - sha256: "7b96333867aa07e122e245c033b8ad622e4e3a42a1a2372cbb098a2541d8782c" - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.7.0" flutter_lints: dependency: "direct dev" description: @@ -168,14 +160,6 @@ packages: description: flutter source: sdk version: "0.0.0" - highlight: - dependency: "direct main" - description: - name: highlight - sha256: "5353a83ffe3e3eca7df0abfb72dcf3fa66cc56b953728e7113ad4ad88497cf21" - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.7.0" leak_tracker: dependency: transitive description: diff --git a/win_text_editor/pubspec.yaml b/win_text_editor/pubspec.yaml index b3a9afd..2d9820a 100644 --- a/win_text_editor/pubspec.yaml +++ b/win_text_editor/pubspec.yaml @@ -16,8 +16,7 @@ dependencies: bitsdojo_window: ^0.1.1+2 flutter_syntax_view: ^4.1.7 expandable: ^5.0.1 - flutter_highlight: ^0.7.0 - highlight: ^0.7.0 + dev_dependencies: