import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:win_text_editor/app/menus/app_menu.dart'; import 'package:win_text_editor/app/providers/tab_provider.dart'; import 'package:win_text_editor/app/providers/file_provider.dart'; import 'package:win_text_editor/app/widgets/editor_pane.dart'; import 'package:win_text_editor/app/widgets/file_explorer.dart'; import 'package:win_text_editor/app/widgets/console_panel.dart'; // 新增导入 class AppScaffold extends StatelessWidget { const AppScaffold({super.key}); @override Widget build(BuildContext context) { return MultiProvider( providers: [ ChangeNotifierProvider(create: (_) => FileProvider()), ChangeNotifierProvider(create: (_) => TabProvider()), ], child: const Scaffold( body: Column( children: [ // 菜单栏 AppMenu(), // 主内容区域 Expanded(child: _ResizablePanel()), ], ), ), ); } } class _ResizablePanel extends StatefulWidget { const _ResizablePanel(); @override State<_ResizablePanel> createState() => _ResizablePanelState(); } class _ResizablePanelState extends State<_ResizablePanel> { double _leftWidth = 0.2; // 初始宽度20% final double _minWidth = 100; // 最小宽度 final double _maxWidth = 400; // 最大宽度 @override Widget build(BuildContext context) { final screenWidth = MediaQuery.of(context).size.width; return LayoutBuilder( builder: (context, constraints) { // 计算实际宽度 final leftPanelWidth = (_leftWidth * screenWidth).clamp(_minWidth, _maxWidth); return Column( children: [ Expanded( child: Row( children: [ // 左侧文件资源管理器 - 添加Material小部件包裹 Material( elevation: 1, // 轻微阴影分隔 child: SizedBox( width: leftPanelWidth, child: const ClipRect( // 确保内容被裁剪 child: FileExplorer(), ), ), ), // 拖拽手柄 GestureDetector( behavior: HitTestBehavior.translucent, onPanUpdate: (details) { setState(() { _leftWidth = ((leftPanelWidth + details.delta.dx) / screenWidth).clamp( _minWidth / screenWidth, _maxWidth / screenWidth, ); }); }, child: MouseRegion( cursor: SystemMouseCursors.resizeLeftRight, child: Container(width: 4, color: Colors.grey[300]), ), ), // 右侧编辑器区域 - 添加Material背景 const Expanded( child: Material( color: Colors.white, child: Column(children: [Expanded(child: EditorPane())]), ), ), ], ), ), // 控制台面板 const ConsolePanel(), ], ); }, ); } }