fix: main 启动链路全防御——runApp 前异常不再导致白屏窗口
用户实测:安装包在开发机一切正常,其他电脑白屏(产物完整、开发机可跑)。 结构性隐患:runApp 之前的 windowManager/单实例/scheme 注册/托盘任一步在 目标机环境差异下抛异常,Dart 永远不会 runApp(窗口由原生已创建)= 白屏, 开发机顺利复现不了。全部步骤 try-catch:非关键步骤(scheme/托盘)失败仅记 日志不阻断;关键失败聚合为 bootWarning 在界面错误视图中显示。
This commit is contained in:
1 parent
06203a30d5
commit
98df601f7b
1 file changed
+33
-10
+33
-10
@@ -12,17 +12,32 @@ import 'ui/app_tray.dart';
|
||||
/// 资安信插件助手(desktop-plugin):桌面插件集成软件。
|
||||
/// 当前内置插件:饭卡打印机(card-printer);左侧菜单与插件页均由 lib/ui/routes.dart 驱动。
|
||||
/// 关闭窗口 = 最小化到后台托盘,服务持续运行;退出入口在托盘菜单。
|
||||
///
|
||||
/// 健壮性铁律:runApp 之前的任何非关键步骤(托盘/scheme 注册/单实例)一律
|
||||
/// try-catch 吞错并记日志——否则在目标机环境差异下抛异常会让界面永远起不来
|
||||
/// (窗口由原生创建、Dart 未 runApp = 白屏窗口),开发机上无法复现。
|
||||
Future<void> main(List<String> 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<void> main(List<String> 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 {
|
||||
|
||||
Reference in new issue
Block a user