diff --git a/lib/main.dart b/lib/main.dart index d995452..b407545 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -74,34 +74,37 @@ class _WindowManagerState extends State { _addWindow( 'File Explorer', const Offset(100, 100), - (isActive, onSessionEnd) => const Center( + Icons.folder_open, + // 使用新的构建器语法 + (id) => const Center( child: Text('View your files...', style: TextStyle(color: Colors.white)), ), - Icons.folder_open, ); _addWindow( 'Terminal', const Offset(150, 150), - (isActive, onSessionEnd) => TerminalPage( - credentials: widget.credentials, - isActive: isActive, - onSessionEnd: onSessionEnd, - ), Icons.terminal, + // 使用新的构建器语法,将 id 传入回调 + (id) => TerminalPage( + credentials: widget.credentials, + onSessionEnd: () => _removeWindow(id), + ), ); } - void _addWindow( - String title, Offset position, Widget Function(bool, VoidCallback) child, IconData icon) { + void _addWindow(String title, Offset position, IconData icon, + Widget Function(String id) childBuilder) { + final id = 'window_${_nextWindowId++}'; + // 在这里一次性创建好 Widget + final windowChild = childBuilder(id); setState(() { - final id = 'window_${_nextWindowId++}'; _windows.add( WindowData( id: id, title: title, position: position, size: const Size(700, 500), - child: child, + child: windowChild, // 存储创建好的 Widget 实例 icon: icon, ), ); @@ -251,7 +254,7 @@ class _WindowManagerState extends State { shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(4)), ), child: const Text( - 'Back', + '返回', style: TextStyle( color: Colors.white, fontSize: 16, @@ -288,24 +291,27 @@ class _WindowManagerState extends State { children: [ Expanded( child: Stack( - children: _windows.where((w) => !w.isMinimized).map((data) { + children: _windows.map((data) { final bool isActive = data.id == activeWindowId; - return DraggableWindow( - key: ValueKey(data.id), - id: data.id, - initialPosition: data.position, - initialSize: data.size, - title: data.title, - icon: data.icon, - isActive: isActive, - isMaximized: data.isMaximized, - onBringToFront: _bringToFront, - onMinimize: _minimizeWindow, - onClose: _removeWindow, - onMove: _updateWindowPosition, - onResize: _updateWindowSize, - onMaximizeChanged: _updateWindowMaximizeState, - child: data.child, + return Offstage( + offstage: data.isMinimized, + child: DraggableWindow( + key: ValueKey(data.id), + id: data.id, + initialPosition: data.position, + initialSize: data.size, + title: data.title, + icon: data.icon, + isActive: isActive, + isMaximized: data.isMaximized, + onBringToFront: _bringToFront, + onMinimize: _minimizeWindow, + onClose: _removeWindow, + onMove: _updateWindowPosition, + onResize: _updateWindowSize, + onMaximizeChanged: _updateWindowMaximizeState, + child: data.child, + ), ); }).toList(), ), @@ -325,14 +331,13 @@ class _WindowManagerState extends State { onPressed: () => _addWindow( 'Terminal', const Offset(150, 150), - (isActive, onSessionEnd) => TerminalPage( - credentials: widget.credentials, - isActive: isActive, - onSessionEnd: onSessionEnd, - ), Icons.terminal, + (id) => TerminalPage( + credentials: widget.credentials, + onSessionEnd: () => _removeWindow(id), + ), ), - tooltip: 'Add New Window', + tooltip: 'Start Terminal', child: const Icon(Icons.add), ), const SizedBox(height: 32), diff --git a/lib/models/window_data.dart b/lib/models/window_data.dart index 423c3e7..1884fb7 100644 --- a/lib/models/window_data.dart +++ b/lib/models/window_data.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; class WindowData { final String id; final String title; - final Widget Function(bool isActive, VoidCallback onSessionEnd) child; + final Widget child; final IconData icon; Offset position; Size size; diff --git a/lib/pages/terminal_page.dart b/lib/pages/terminal_page.dart index dc995cc..bf3ac1c 100644 --- a/lib/pages/terminal_page.dart +++ b/lib/pages/terminal_page.dart @@ -8,13 +8,11 @@ import '../models/credentials.dart'; class TerminalPage extends StatefulWidget { final SSHCredentials credentials; - final bool isActive; final VoidCallback onSessionEnd; const TerminalPage({ super.key, required this.credentials, - required this.isActive, required this.onSessionEnd, }); @@ -33,22 +31,12 @@ class _TerminalPageState extends State { super.initState(); _startSshShell(); WidgetsBinding.instance.addPostFrameCallback((_) { - if (mounted && widget.isActive) { + if (mounted) { _focusNode.requestFocus(); } }); } - @override - void didUpdateWidget(covariant TerminalPage oldWidget) { - super.didUpdateWidget(oldWidget); - if (widget.isActive && !oldWidget.isActive) { - _focusNode.requestFocus(); - } else if (!widget.isActive && oldWidget.isActive) { - _focusNode.unfocus(); - } - } - Future _startSshShell() async { try { client = SSHClient( diff --git a/lib/widgets/draggable_window.dart b/lib/widgets/draggable_window.dart index dd644fa..d668352 100644 --- a/lib/widgets/draggable_window.dart +++ b/lib/widgets/draggable_window.dart @@ -11,7 +11,7 @@ class DraggableWindow extends StatefulWidget { final Offset initialPosition; final Size initialSize; final String title; - final Widget Function(bool isActive, VoidCallback onSessionEnd) child; + final Widget child; final IconData icon; final bool isActive; final bool isMaximized; @@ -229,7 +229,7 @@ class _DraggableWindowState extends State { _buildTitleBar(), Expanded( child: ClipRect( - child: widget.child(widget.isActive, () => widget.onClose(widget.id)), + child: widget.child, ) ), ],