feat(desktop): 增加桌面端系统托盘和窗口管理功能

- 主函数中添加窗口管理初始化,支持Windows、Linux和MacOS平台
- HomeScreen中集成托盘服务和窗口服务,实现托盘菜单交互
- 实现窗口关闭时弹出对话框,支持最小化到托盘或退出程序
- 添加托盘服务TrayService,封装系统托盘图标和菜单的初始化、事件处理
- 添加窗口服务WindowService,实现窗口的显示、隐藏、关闭及事件监听
- 在界面添加最小化到托盘的按钮,仅桌面端显示
- pubspec.yaml添加assets目录,包含托盘图标资源文件
This commit is contained in:
2025-12-08 09:13:59 +08:00
parent 6a0d84f063
commit df266614e1
6 changed files with 308 additions and 5 deletions

View File

@@ -1,6 +1,9 @@
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../providers/providers.dart';
import '../services/services.dart';
import '../widgets/widgets.dart';
/// 主页面
@@ -12,6 +15,9 @@ class HomeScreen extends StatefulWidget {
}
class _HomeScreenState extends State<HomeScreen> {
final TrayService _trayService = TrayService();
final WindowService _windowService = WindowService();
@override
void initState() {
super.initState();
@@ -21,9 +27,71 @@ class _HomeScreenState extends State<HomeScreen> {
provider.initDefaultDevices();
provider.refreshAll();
provider.startAutoRefresh(intervalSeconds: 30);
// 初始化系统托盘
_initSystemTray(provider);
});
}
/// 初始化系统托盘
Future<void> _initSystemTray(MonitorProvider provider) async {
if (!_trayService.isSupported) return;
await _trayService.init(
onShow: () => _windowService.showWindow(),
onHide: () => _windowService.hideWindow(),
onExit: () => _exitApp(),
onRefresh: () => provider.refreshAll(),
);
// 设置窗口关闭事件(最小化到托盘)
_windowService.onCloseRequested = () => _handleCloseRequest();
}
/// 处理窗口关闭请求
void _handleCloseRequest() {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: const Text('关闭窗口'),
content: const Text('请选择操作:'),
actions: [
TextButton(
onPressed: () {
Navigator.pop(context);
_windowService.hideWindow();
},
child: const Text('最小化到托盘'),
),
TextButton(
onPressed: () {
Navigator.pop(context);
_exitApp();
},
child: const Text('退出程序'),
),
TextButton(
onPressed: () => Navigator.pop(context),
child: const Text('取消'),
),
],
),
);
}
/// 退出应用
Future<void> _exitApp() async {
await _trayService.destroy();
await _windowService.closeWindow();
}
@override
void dispose() {
_trayService.destroy();
_windowService.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
@@ -60,6 +128,13 @@ class _HomeScreenState extends State<HomeScreen> {
},
tooltip: '设置',
),
// 最小化到托盘按钮(仅桌面端)
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS))
IconButton(
icon: const Icon(Icons.minimize),
onPressed: () => _windowService.hideWindow(),
tooltip: '最小化到托盘',
),
],
);
}