- 后台托盘(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 构建实测通过
75 lines
2.6 KiB
Dart
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),
|
|
);
|
|
}
|
|
}
|