feat(desktop): 增加桌面端系统托盘和窗口管理功能
- 主函数中添加窗口管理初始化,支持Windows、Linux和MacOS平台 - HomeScreen中集成托盘服务和窗口服务,实现托盘菜单交互 - 实现窗口关闭时弹出对话框,支持最小化到托盘或退出程序 - 添加托盘服务TrayService,封装系统托盘图标和菜单的初始化、事件处理 - 添加窗口服务WindowService,实现窗口的显示、隐藏、关闭及事件监听 - 在界面添加最小化到托盘的按钮,仅桌面端显示 - pubspec.yaml添加assets目录,包含托盘图标资源文件
This commit is contained in:
@@ -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: '最小化到托盘',
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user