mirror of
https://github.com/bggRGjQaUbCoE/PiliPlus.git
synced 2026-05-13 20:53:58 +08:00
123 lines
3.8 KiB
Dart
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;
|
|
}
|
|
}
|