From 98df601f7b01a4c4a7e67958c49a6c043ce0c8e2 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Mon, 21 Sep 2026 19:04:47 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20main=20=E5=90=AF=E5=8A=A8=E9=93=BE?= =?UTF-8?q?=E8=B7=AF=E5=85=A8=E9=98=B2=E5=BE=A1=E2=80=94=E2=80=94runApp=20?= =?UTF-8?q?=E5=89=8D=E5=BC=82=E5=B8=B8=E4=B8=8D=E5=86=8D=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E7=99=BD=E5=B1=8F=E7=AA=97=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用户实测:安装包在开发机一切正常,其他电脑白屏(产物完整、开发机可跑)。 结构性隐患:runApp 之前的 windowManager/单实例/scheme 注册/托盘任一步在 目标机环境差异下抛异常,Dart 永远不会 runApp(窗口由原生已创建)= 白屏, 开发机顺利复现不了。全部步骤 try-catch:非关键步骤(scheme/托盘)失败仅记 日志不阻断;关键失败聚合为 bootWarning 在界面错误视图中显示。 --- lib/main.dart | 43 +++++++++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index d28659e..651d438 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -12,17 +12,32 @@ import 'ui/app_tray.dart'; /// 资安信插件助手(desktop-plugin):桌面插件集成软件。 /// 当前内置插件:饭卡打印机(card-printer);左侧菜单与插件页均由 lib/ui/routes.dart 驱动。 /// 关闭窗口 = 最小化到后台托盘,服务持续运行;退出入口在托盘菜单。 +/// +/// 健壮性铁律:runApp 之前的任何非关键步骤(托盘/scheme 注册/单实例)一律 +/// try-catch 吞错并记日志——否则在目标机环境差异下抛异常会让界面永远起不来 +/// (窗口由原生创建、Dart 未 runApp = 白屏窗口),开发机上无法复现。 Future main(List args) async { WidgetsFlutterBinding.ensureInitialized(); - await windowManager.ensureInitialized(); + + String? bootWarning; + try { + await windowManager.ensureInitialized(); + } catch (e) { + bootWarning = '窗口管理初始化失败:$e'; + } // 单实例:zaxprint:// 唤起或重复双击会启动第二进程——通知常驻实例弹窗后自己退出 - final isPrimary = await SingleInstance.acquire( - onWake: () async { - await windowManager.show(); - await windowManager.focus(); - }, - ); + bool isPrimary = true; + try { + isPrimary = await SingleInstance.acquire( + onWake: () async { + await windowManager.show(); + await windowManager.focus(); + }, + ); + } catch (e) { + bootWarning = '${bootWarning == null ? "" : "$bootWarning\n"}单实例检测失败:$e'; + } if (!isPrimary) { exit(0); } @@ -35,12 +50,20 @@ Future main(List args) async { startError = '$e'; } - await UrlScheme.ensureRegistered(); // Windows 运行时注册 zaxprint://;mac 由 Info.plist 声明 + try { + await UrlScheme.ensureRegistered(); // Windows 运行时注册 zaxprint://;mac 由 Info.plist 声明 + } catch (e) { + agent.log.write('网页唤起协议注册失败(不影响其他功能):$e'); + } final appTray = AppTray(agent: agent); - await appTray.start(); + try { + await appTray.start(); + } catch (e) { + agent.log.write('托盘初始化失败(不影响其他功能):$e'); + } - runApp(DesktopPluginApp(agent: agent, startError: startError)); + runApp(DesktopPluginApp(agent: agent, startError: startError ?? bootWarning)); } class DesktopPluginApp extends StatelessWidget {