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

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(
'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) {
setState(() {
void _addWindow(String title, Offset position, IconData icon,
Widget Function(String id) childBuilder) {
final id = 'window_${_nextWindowId++}';
// Widget
final windowChild = childBuilder(id);
setState(() {
_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<WindowManager> {
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(4)),
),
child: const Text(
'Back',
'返回',
style: TextStyle(
color: Colors.white,
fontSize: 16,
@ -288,9 +291,11 @@ class _WindowManagerState extends State<WindowManager> {
children: [
Expanded(
child: Stack(
children: _windows.where((w) => !w.isMinimized).map((data) {
children: _windows.map((data) {
final bool isActive = data.id == activeWindowId;
return DraggableWindow(
return Offstage(
offstage: data.isMinimized,
child: DraggableWindow(
key: ValueKey(data.id),
id: data.id,
initialPosition: data.position,
@ -306,6 +311,7 @@ class _WindowManagerState extends State<WindowManager> {
onResize: _updateWindowSize,
onMaximizeChanged: _updateWindowMaximizeState,
child: data.child,
),
);
}).toList(),
),
@ -325,14 +331,13 @@ class _WindowManagerState extends State<WindowManager> {
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),

View File

@ -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;

View File

@ -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<TerminalPage> {
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<void> _startSshShell() async {
try {
client = SSHClient(

View File

@ -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<DraggableWindow> {
_buildTitleBar(),
Expanded(
child: ClipRect(
child: widget.child(widget.isActive, () => widget.onClose(widget.id)),
child: widget.child,
)
),
],