From 60af1a0a9f7c71bd324d67eb22e5f045e4a82b05 Mon Sep 17 00:00:00 2001 From: ErBW_s Date: Fri, 31 Jan 2025 12:45:57 +0800 Subject: [PATCH] add onWindowClose callback --- lib/app_widget.dart | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/lib/app_widget.dart b/lib/app_widget.dart index 14f674a3..35e11512 100644 --- a/lib/app_widget.dart +++ b/lib/app_widget.dart @@ -24,7 +24,7 @@ class AppWidget extends StatefulWidget { } class _AppWidgetState extends State - with TrayListener, WidgetsBindingObserver { + with TrayListener, WidgetsBindingObserver, WindowListener { Box setting = GStorage.setting; final TrayManager trayManager = TrayManager.instance; @@ -32,13 +32,21 @@ class _AppWidgetState extends State @override void initState() { trayManager.addListener(this); + windowManager.addListener(this); + setPreventClose(); WidgetsBinding.instance.addObserver(this); super.initState(); } + void setPreventClose() async { + await windowManager.setPreventClose(true); + setState(() {}); + } + @override void dispose() { trayManager.removeListener(this); + windowManager.removeListener(this); WidgetsBinding.instance.removeObserver(this); super.dispose(); } @@ -63,6 +71,29 @@ class _AppWidgetState extends State } } + @override + void onWindowClose() async { + bool isPreventClose = await windowManager.isPreventClose(); + if (isPreventClose) { + KazumiDialog.show(builder: (context) { + return AlertDialog( + title: const Text('退出确认'), + content: const Text('您想要退出 Kazumi 吗?'), + actions: [ + TextButton(onPressed: () => exit(0), child: const Text('退出 Kazumi')), + TextButton( + onPressed: () { + KazumiDialog.dismiss(); + windowManager.hide(); + }, + child: const Text('最小化至托盘')), + const TextButton(onPressed: KazumiDialog.dismiss, child: Text('取消')), + ], + ); + }); + } + } + /// 处理前后台变更 /// windows/linux 在程序后台或失去焦点时只会触发 inactive 不会触发 paused /// android/ios/macos 在程序后台时会先触发 inactive 再触发 paused, 回到前台时会先触发 inactive 再触发 resumed