在任务栏最小化窗口时将不会导致窗口重载

This commit is contained in:
梦凌汐 2025-07-09 18:52:35 +08:00
parent 33d30aacc8
commit 3ec54d41f1
4 changed files with 44 additions and 51 deletions

View File

@ -74,34 +74,37 @@ class _WindowManagerState extends State<WindowManager> {
_addWindow( _addWindow(
'File Explorer', 'File Explorer',
const Offset(100, 100), const Offset(100, 100),
(isActive, onSessionEnd) => const Center( Icons.folder_open,
// 使
(id) => const Center(
child: Text('View your files...', style: TextStyle(color: Colors.white)), child: Text('View your files...', style: TextStyle(color: Colors.white)),
), ),
Icons.folder_open,
); );
_addWindow( _addWindow(
'Terminal', 'Terminal',
const Offset(150, 150), const Offset(150, 150),
(isActive, onSessionEnd) => TerminalPage(
credentials: widget.credentials,
isActive: isActive,
onSessionEnd: onSessionEnd,
),
Icons.terminal, Icons.terminal,
// 使 id
(id) => TerminalPage(
credentials: widget.credentials,
onSessionEnd: () => _removeWindow(id),
),
); );
} }
void _addWindow( void _addWindow(String title, Offset position, IconData icon,
String title, Offset position, Widget Function(bool, VoidCallback) child, IconData icon) { Widget Function(String id) childBuilder) {
final id = 'window_${_nextWindowId++}';
// Widget
final windowChild = childBuilder(id);
setState(() { setState(() {
final id = 'window_${_nextWindowId++}';
_windows.add( _windows.add(
WindowData( WindowData(
id: id, id: id,
title: title, title: title,
position: position, position: position,
size: const Size(700, 500), size: const Size(700, 500),
child: child, child: windowChild, // Widget
icon: icon, icon: icon,
), ),
); );
@ -251,7 +254,7 @@ class _WindowManagerState extends State<WindowManager> {
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(4)), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(4)),
), ),
child: const Text( child: const Text(
'Back', '返回',
style: TextStyle( style: TextStyle(
color: Colors.white, color: Colors.white,
fontSize: 16, fontSize: 16,
@ -288,24 +291,27 @@ class _WindowManagerState extends State<WindowManager> {
children: [ children: [
Expanded( Expanded(
child: Stack( child: Stack(
children: _windows.where((w) => !w.isMinimized).map((data) { children: _windows.map((data) {
final bool isActive = data.id == activeWindowId; final bool isActive = data.id == activeWindowId;
return DraggableWindow( return Offstage(
key: ValueKey(data.id), offstage: data.isMinimized,
id: data.id, child: DraggableWindow(
initialPosition: data.position, key: ValueKey(data.id),
initialSize: data.size, id: data.id,
title: data.title, initialPosition: data.position,
icon: data.icon, initialSize: data.size,
isActive: isActive, title: data.title,
isMaximized: data.isMaximized, icon: data.icon,
onBringToFront: _bringToFront, isActive: isActive,
onMinimize: _minimizeWindow, isMaximized: data.isMaximized,
onClose: _removeWindow, onBringToFront: _bringToFront,
onMove: _updateWindowPosition, onMinimize: _minimizeWindow,
onResize: _updateWindowSize, onClose: _removeWindow,
onMaximizeChanged: _updateWindowMaximizeState, onMove: _updateWindowPosition,
child: data.child, onResize: _updateWindowSize,
onMaximizeChanged: _updateWindowMaximizeState,
child: data.child,
),
); );
}).toList(), }).toList(),
), ),
@ -325,14 +331,13 @@ class _WindowManagerState extends State<WindowManager> {
onPressed: () => _addWindow( onPressed: () => _addWindow(
'Terminal', 'Terminal',
const Offset(150, 150), const Offset(150, 150),
(isActive, onSessionEnd) => TerminalPage(
credentials: widget.credentials,
isActive: isActive,
onSessionEnd: onSessionEnd,
),
Icons.terminal, Icons.terminal,
(id) => TerminalPage(
credentials: widget.credentials,
onSessionEnd: () => _removeWindow(id),
),
), ),
tooltip: 'Add New Window', tooltip: 'Start Terminal',
child: const Icon(Icons.add), child: const Icon(Icons.add),
), ),
const SizedBox(height: 32), const SizedBox(height: 32),

View File

@ -3,7 +3,7 @@ import 'package:flutter/material.dart';
class WindowData { class WindowData {
final String id; final String id;
final String title; final String title;
final Widget Function(bool isActive, VoidCallback onSessionEnd) child; final Widget child;
final IconData icon; final IconData icon;
Offset position; Offset position;
Size size; Size size;

View File

@ -8,13 +8,11 @@ import '../models/credentials.dart';
class TerminalPage extends StatefulWidget { class TerminalPage extends StatefulWidget {
final SSHCredentials credentials; final SSHCredentials credentials;
final bool isActive;
final VoidCallback onSessionEnd; final VoidCallback onSessionEnd;
const TerminalPage({ const TerminalPage({
super.key, super.key,
required this.credentials, required this.credentials,
required this.isActive,
required this.onSessionEnd, required this.onSessionEnd,
}); });
@ -33,22 +31,12 @@ class _TerminalPageState extends State<TerminalPage> {
super.initState(); super.initState();
_startSshShell(); _startSshShell();
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
if (mounted && widget.isActive) { if (mounted) {
_focusNode.requestFocus(); _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<void> _startSshShell() async { Future<void> _startSshShell() async {
try { try {
client = SSHClient( client = SSHClient(

View File

@ -11,7 +11,7 @@ class DraggableWindow extends StatefulWidget {
final Offset initialPosition; final Offset initialPosition;
final Size initialSize; final Size initialSize;
final String title; final String title;
final Widget Function(bool isActive, VoidCallback onSessionEnd) child; final Widget child;
final IconData icon; final IconData icon;
final bool isActive; final bool isActive;
final bool isMaximized; final bool isMaximized;
@ -229,7 +229,7 @@ class _DraggableWindowState extends State<DraggableWindow> {
_buildTitleBar(), _buildTitleBar(),
Expanded( Expanded(
child: ClipRect( child: ClipRect(
child: widget.child(widget.isActive, () => widget.onClose(widget.id)), child: widget.child,
) )
), ),
], ],