Files
PiliPlus/lib/utils/theme_utils.dart
dom 07843a5e77 drop
Signed-off-by: dom <githubaccount56556@proton.me>
2026-05-08 21:27:01 +08:00

123 lines
3.8 KiB
Dart

import 'package:PiliPlus/common/style.dart';
import 'package:PiliPlus/utils/extension/theme_ext.dart';
import 'package:flutter/cupertino.dart' show CupertinoThemeData;
import 'package:flutter/foundation.dart' show PlatformDispatcher;
import 'package:flutter/material.dart';
abstract final class ThemeUtils {
static late ThemeData lightTheme;
static late ThemeData darkTheme;
static late ThemeMode themeMode;
static ThemeData get theme {
if (themeMode == .dark ||
(themeMode == .system &&
PlatformDispatcher.instance.platformBrightness == .dark)) {
return darkTheme;
}
return lightTheme;
}
static bool get isDarkMode => theme.isDark;
static String themeUrl(bool isDark) =>
'native.theme=${isDark ? 2 : 1}&night=${isDark ? 1 : 0}';
static ThemeData getThemeData({
required ColorScheme colorScheme,
required bool isDynamic,
bool isDark = false,
}) {
ThemeData themeData = ThemeData(
colorScheme: colorScheme,
useMaterial3: true,
appBarTheme: AppBarTheme(
elevation: 0,
titleSpacing: 0,
centerTitle: false,
scrolledUnderElevation: 0,
backgroundColor: colorScheme.surface,
titleTextStyle: TextStyle(
fontSize: 16,
color: colorScheme.onSurface,
),
),
navigationBarTheme: NavigationBarThemeData(
surfaceTintColor: isDynamic ? colorScheme.onSurfaceVariant : null,
),
snackBarTheme: SnackBarThemeData(
actionTextColor: colorScheme.primary,
backgroundColor: colorScheme.secondaryContainer,
closeIconColor: colorScheme.secondary,
contentTextStyle: TextStyle(color: colorScheme.onSecondaryContainer),
elevation: 20,
),
popupMenuTheme: PopupMenuThemeData(
surfaceTintColor: isDynamic ? colorScheme.onSurfaceVariant : null,
),
cardTheme: CardThemeData(
elevation: 1,
margin: EdgeInsets.zero,
surfaceTintColor: isDynamic
? colorScheme.onSurfaceVariant
: isDark
? colorScheme.onSurfaceVariant
: null,
shadowColor: Colors.transparent,
),
progressIndicatorTheme: ProgressIndicatorThemeData(
// ignore: deprecated_member_use
year2023: false,
refreshBackgroundColor: colorScheme.onSecondary,
),
dialogTheme: DialogThemeData(
titleTextStyle: TextStyle(
fontSize: 18,
color: colorScheme.onSurface,
),
backgroundColor: colorScheme.surface,
constraints: const BoxConstraints(minWidth: 280, maxWidth: 420),
),
bottomSheetTheme: BottomSheetThemeData(
backgroundColor: colorScheme.surface,
shape: const RoundedRectangleBorder(
borderRadius: Style.bottomSheetRadius,
),
),
// ignore: deprecated_member_use
sliderTheme: const SliderThemeData(year2023: false),
tooltipTheme: TooltipThemeData(
textStyle: const TextStyle(
color: Colors.white,
fontSize: 14,
),
decoration: BoxDecoration(
color: Colors.grey[700]!.withValues(alpha: 0.9),
borderRadius: const BorderRadius.all(Radius.circular(4)),
),
),
cupertinoOverrideTheme: CupertinoThemeData(
selectionHandleColor: colorScheme.primary,
),
switchTheme: const SwitchThemeData(
padding: .zero,
materialTapTargetSize: .shrinkWrap,
thumbIcon: WidgetStateProperty<Icon?>.fromMap(
<WidgetStatesConstraint, Icon?>{
WidgetState.selected: Icon(Icons.done),
WidgetState.any: null,
},
),
),
pageTransitionsTheme: const PageTransitionsTheme(
builders: {
TargetPlatform.android: ZoomPageTransitionsBuilder(),
},
),
);
return themeData;
}
}