Files
desktop-plugin/lib/main.dart
T
dzc bee734fd5b feat: 后台托盘 + 资安信品牌化 + 修复布局断言(Phase 4 部分)
- 后台托盘(mac/Windows):window_manager 拦截关窗改隐藏,服务持续运行;
  托盘单击恢复窗口、右键菜单(显示主界面/退出),退出入口仅放托盘菜单
- 品牌:App 更名"资安信插件助手"(mac PRODUCT_NAME/xib、win main.cpp+Runner.rc(code_page 65001)、
  MaterialApp/侧栏/托盘 tooltip/日志);图标全家桶换资安信盾牌 logo
  (tool/gen_app_icons.dart 生成 mac AppIcon 7 尺寸/win ICO 7 尺寸/托盘白底圆盘版/assets logo)
- 修复启动布局断言:SliverList 内 Row(stretch) 需 IntrinsicHeight 包裹,
  否则子项收到 h=Infinity 约束(用户实测报错,test/ui_smoke_test.dart 守护复现)
- Agent.stop 幂等(托盘退出与窗口销毁竞态安全)
- 测试修复:smoke 测试改 tester.runAsync 包真实 socket I/O(fake async zone 里会永久挂起)、
  显式 pump 替代 pumpAndSettle;13 个测试全过,analyze 零问题,release 构建实测通过
2026-09-21 13:16:23 +08:00

75 lines
2.6 KiB
Dart

import 'package:flutter/material.dart';
import 'package:window_manager/window_manager.dart';
import 'agent.dart';
import 'ui/app_shell.dart';
import 'ui/app_tray.dart';
/// 资安信插件助手(desktop-plugin):桌面插件集成软件。
/// 当前内置插件:饭卡打印机(card-printer);左侧菜单与插件页均由 lib/ui/routes.dart 驱动。
/// 关闭窗口 = 最小化到后台托盘,服务持续运行;退出入口在托盘菜单。
Future<void> main(List<String> args) async {
WidgetsFlutterBinding.ensureInitialized();
await windowManager.ensureInitialized();
final agent = Agent(AgentOptions.parse(args));
String? startError;
try {
await agent.start();
} catch (e) {
startError = '$e';
}
final appTray = AppTray(agent: agent);
await appTray.start();
runApp(DesktopPluginApp(agent: agent, startError: startError));
}
class DesktopPluginApp extends StatelessWidget {
const DesktopPluginApp({super.key, required this.agent, this.startError});
final Agent agent;
final String? startError;
@override
Widget build(BuildContext context) {
return MaterialApp(
title: '资安信插件助手',
debugShowCheckedModeBanner: false,
theme: _darkTheme(),
home: AppShell(agent: agent, startError: startError),
);
}
/// 深色运维风格(ui-ux-pro-max 设计系统:OLED 深底 + 运维三色语义)。
ThemeData _darkTheme() {
final base = ThemeData(brightness: Brightness.dark, useMaterial3: true);
final scheme = base.colorScheme.copyWith(
// 正常/主操作:operational green
primary: const Color(0xFF4ADE80),
onPrimary: const Color(0xFF052E16),
primaryContainer: const Color(0xFF14532D),
onPrimaryContainer: const Color(0xFFDCFCE7),
// 故障红
error: const Color(0xFFF87171),
errorContainer: const Color(0xFF7F1D1D),
onErrorContainer: const Color(0xFFFEE2E2),
// 表面层级:#0F172A 底 / #111827 卡 / #1E293B 强调
surface: const Color(0xFF0F172A),
onSurface: const Color(0xFFF8FAFC),
onSurfaceVariant: const Color(0xFFCBD5E1),
surfaceContainerLow: const Color(0xFF111827),
surfaceContainerHighest: const Color(0xFF1E293B),
outlineVariant: const Color(0xFF334155),
);
return base.copyWith(
colorScheme: scheme,
scaffoldBackgroundColor: const Color(0xFF0F172A),
cardTheme: const CardTheme(color: Color(0xFF111827)),
snackBarTheme: const SnackBarThemeData(behavior: SnackBarBehavior.floating),
dividerTheme: const DividerThemeData(color: Color(0xFF334155), thickness: 1),
);
}
}