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):桌面插件集成软件。
|
/// 资安信插件助手(desktop-plugin):桌面插件集成软件。
|
||||||
/// 当前内置插件:饭卡打印机(card-printer);左侧菜单与插件页均由 lib/ui/routes.dart 驱动。
|
/// 当前内置插件:饭卡打印机(card-printer);左侧菜单与插件页均由 lib/ui/routes.dart 驱动。
|
||||||
/// 关闭窗口 = 最小化到后台托盘,服务持续运行;退出入口在托盘菜单。
|
/// 关闭窗口 = 最小化到后台托盘,服务持续运行;退出入口在托盘菜单。
|
||||||
|
///
|
||||||
|
/// 健壮性铁律:runApp 之前的任何非关键步骤(托盘/scheme 注册/单实例)一律
|
||||||
|
/// try-catch 吞错并记日志——否则在目标机环境差异下抛异常会让界面永远起不来
|
||||||
|
/// (窗口由原生创建、Dart 未 runApp = 白屏窗口),开发机上无法复现。
|
||||||
Future<void> main(List<String> args) async {
|
Future<void> main(List<String> args) async {
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
await windowManager.ensureInitialized();
|
|
||||||
|
String? bootWarning;
|
||||||
|
try {
|
||||||
|
await windowManager.ensureInitialized();
|
||||||
|
} catch (e) {
|
||||||
|
bootWarning = '窗口管理初始化失败:$e';
|
||||||
|
}
|
||||||
|
|
||||||
// 单实例:zaxprint:// 唤起或重复双击会启动第二进程——通知常驻实例弹窗后自己退出
|
// 单实例:zaxprint:// 唤起或重复双击会启动第二进程——通知常驻实例弹窗后自己退出
|
||||||
final isPrimary = await SingleInstance.acquire(
|
bool isPrimary = true;
|
||||||
onWake: () async {
|
try {
|
||||||
await windowManager.show();
|
isPrimary = await SingleInstance.acquire(
|
||||||
await windowManager.focus();
|
onWake: () async {
|
||||||
},
|
await windowManager.show();
|
||||||
);
|
await windowManager.focus();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
} catch (e) {
|
||||||
|
bootWarning = '${bootWarning == null ? "" : "$bootWarning\n"}单实例检测失败:$e';
|
||||||
|
}
|
||||||
if (!isPrimary) {
|
if (!isPrimary) {
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
@@ -35,12 +50,20 @@ Future<void> main(List<String> args) async {
|
|||||||
startError = '$e';
|
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);
|
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 {
|
class DesktopPluginApp extends StatelessWidget {
|
||||||
|
|||||||
Reference in new issue
Block a user