Files
biz_xfj_cloud/lib/app.dart
T
2026-07-24 19:36:52 +08:00

184 lines
6.2 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:forui/forui.dart';
import 'package:get/get.dart';
import 'package:ducafe_ui_core/ducafe_ui_core.dart';
import 'package:pj_supermarket_cloud/common/index.dart';
class MainApp extends StatefulWidget {
const MainApp({super.key});
@override
State<MainApp> createState() => _MainAppState();
}
class _MainAppState extends State<MainApp> with WidgetsBindingObserver {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) async {
if (state == AppLifecycleState.paused ||
state == AppLifecycleState.detached) {
if (Get.isRegistered<FaceRecognitionSessionService>()) {
try {
await Get.find<FaceRecognitionSessionService>().suspend();
} catch (_) {}
}
try {
AppSubScreenTool.hide();
} catch (_) {}
}
}
@override
Widget build(BuildContext context) {
return ScreenUtilInit(
designSize: const Size(1920, 1080),
minTextAdapt: true,
splitScreenMode: true,
builder: (_, child) {
return Obx(() {
final appTheme = Get.find<AppThemeControl>();
final fTheme = appTheme.theme.value;
final sizeScalar = appTheme.sizeScalar.value;
final buttonRadius = appTheme.buttonRadius.value.radius.w;
final cardRadius = appTheme.cardRadius.value.radius.w;
final buttonSizeScale = appTheme.buttonSize.value.scale;
// 新 UI 保留用户字号缩放能力,只统一视觉色板与组件形态。
final colorScheme = fTheme.colorScheme.copyWith(
background: XfjDesignTokens.surface,
foreground: XfjDesignTokens.ink,
primary: XfjDesignTokens.primary,
primaryForeground: Colors.white,
secondary: XfjDesignTokens.surface,
secondaryForeground: XfjDesignTokens.ink,
muted: XfjDesignTokens.canvas,
mutedForeground: XfjDesignTokens.muted,
destructive: XfjDesignTokens.danger,
destructiveForeground: Colors.white,
error: XfjDesignTokens.danger,
errorForeground: Colors.white,
border: XfjDesignTokens.line,
);
final inheritedTheme = FThemeData.inherit(
colorScheme: colorScheme,
typography: fTheme.typography.scale(sizeScalar: sizeScalar),
style: fTheme.style.copyWith(
borderRadius: BorderRadius.all(
Radius.circular(buttonRadius),
),
borderWidth: 1,
iconStyle: fTheme.style.iconStyle.copyWith(
size: fTheme.typography.xl2.fontSize,
),
pagePadding: EdgeInsets.symmetric(vertical: 5.h, horizontal: 1.w),
),
);
final buttonPadding = EdgeInsets.symmetric(
horizontal: 16.w * buttonSizeScale,
vertical: 12.5.h * buttonSizeScale,
);
final iconPadding = EdgeInsets.all(7.5.w * buttonSizeScale);
final badgePadding = EdgeInsets.symmetric(
horizontal: 14.w * buttonSizeScale,
vertical: 2.h * buttonSizeScale,
);
final themeData = inheritedTheme.copyWith(
buttonStyles: _buttonStyles(
inheritedTheme.buttonStyles,
buttonPadding,
iconPadding,
),
badgeStyles: _badgeStyles(
inheritedTheme.badgeStyles,
buttonRadius,
badgePadding,
),
cardStyle: inheritedTheme.cardStyle.copyWith(
decoration: inheritedTheme.cardStyle.decoration.copyWith(
borderRadius: BorderRadius.circular(cardRadius),
),
),
);
return GetMaterialApp(
title: '收银机',
theme: ThemeData(
scaffoldBackgroundColor: XfjDesignTokens.canvas,
colorScheme: ColorScheme.fromSeed(
seedColor: XfjDesignTokens.primary,
surface: XfjDesignTokens.surface,
),
bottomSheetTheme: const BottomSheetThemeData(
backgroundColor: Colors.transparent,
),
),
defaultTransition: Transition.noTransition,
initialRoute: RouteNames.load,
getPages: RoutePages.list,
enableLog: true,
debugShowCheckedModeBanner: false,
locale: const Locale('zh', 'CN'),
localizationsDelegates: FLocalizations.localizationsDelegates,
supportedLocales: FLocalizations.supportedLocales,
navigatorObservers: [
GlobalRouteObserver(),
],
builder: EasyLoading.init(
builder: (_, childSecond) => FTheme(
data: themeData,
child: childSecond!,
),
),
);
});
},
);
}
}
FButtonStyles _buttonStyles(
FButtonStyles styles,
EdgeInsets padding,
EdgeInsets iconPadding,
) {
FButtonCustomStyle resize(FButtonCustomStyle style) => style.copyWith(
contentStyle: style.contentStyle.copyWith(padding: padding),
iconContentStyle: style.iconContentStyle.copyWith(padding: iconPadding),
);
return styles.copyWith(
primary: resize(styles.primary),
secondary: resize(styles.secondary),
destructive: resize(styles.destructive),
outline: resize(styles.outline),
ghost: resize(styles.ghost),
);
}
FBadgeStyles _badgeStyles(
FBadgeStyles styles,
double radius,
EdgeInsets padding,
) {
FBadgeCustomStyle resize(FBadgeCustomStyle style) => style.copyWith(
borderRadius: BorderRadius.circular(radius),
contentStyle: style.contentStyle.copyWith(padding: padding),
);
return styles.copyWith(
primary: resize(styles.primary),
secondary: resize(styles.secondary),
outline: resize(styles.outline),
destructive: resize(styles.destructive),
);
}