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 createState() => _MainAppState(); } class _MainAppState extends State 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()) { try { await Get.find().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(); 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), ); }