Files
FlClash/lib/manager/theme_manager.dart
T

108 lines
3.3 KiB
Dart
Raw Normal View History

import 'dart:math';
2025-06-07 01:48:34 +08:00
import 'package:fl_clash/common/common.dart';
2025-03-12 17:15:31 +08:00
import 'package:fl_clash/common/theme.dart';
2026-02-02 10:14:13 +08:00
import 'package:fl_clash/providers/action.dart';
import 'package:fl_clash/providers/config.dart';
2025-03-12 17:15:31 +08:00
import 'package:fl_clash/state.dart';
import 'package:flutter/material.dart';
2025-06-07 01:48:34 +08:00
import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
2025-03-12 17:15:31 +08:00
2025-06-07 01:48:34 +08:00
import '../providers/state.dart';
class ThemeManager extends ConsumerWidget {
2025-03-12 17:15:31 +08:00
final Widget child;
2025-07-31 17:09:18 +08:00
const ThemeManager({super.key, required this.child});
2025-03-12 17:15:31 +08:00
2025-06-07 01:48:34 +08:00
Widget _buildSystemUi(Widget child) {
if (!system.isAndroid) {
return child;
}
2026-05-27 15:16:51 +08:00
return Consumer(
builder: (context, ref, _) {
final brightness = ref.watch(currentBrightnessProvider);
final iconBrightness = brightness == Brightness.light
? Brightness.dark
: Brightness.light;
return AnnotatedRegion<SystemUiOverlayStyle>(
value: SystemUiOverlayStyle(
statusBarColor: Colors.transparent,
statusBarIconBrightness: iconBrightness,
systemNavigationBarIconBrightness: iconBrightness,
systemNavigationBarColor: Colors.transparent,
systemNavigationBarDividerColor: Colors.transparent,
systemNavigationBarContrastEnforced: false,
),
sized: false,
child: child,
);
},
2025-06-07 01:48:34 +08:00
);
}
// _buildScrollbar(Widget child) {
// return Consumer(
// builder: (_, ref, child) {
// final isMobileView = ref.read(isMobileViewProvider);
// if (isMobileView) {
// return ScrollConfiguration(
// behavior: HiddenBarScrollBehavior(),
// child: child!,
// );
// }
// return child!;
// },
// child: child,
// );
// }
2025-03-12 17:15:31 +08:00
@override
Widget build(BuildContext context, ref) {
final textScale = ref.read(
themeSettingProvider.select((state) => state.textScale),
);
final double textScaleFactor = max(
min(
textScale.enable ? textScale.scale : defaultTextScaleFactor,
maxTextScale,
),
minTextScale,
);
globalState.measure = Measure.of(context, textScaleFactor);
globalState.theme = CommonTheme.of(context, textScaleFactor);
final padding = MediaQuery.of(context).padding;
final height = MediaQuery.of(context).size.height;
2025-03-12 17:15:31 +08:00
return MediaQuery(
data: MediaQuery.of(context).copyWith(
2025-07-31 17:09:18 +08:00
textScaler: TextScaler.linear(textScaleFactor),
padding: padding.copyWith(
2025-05-02 02:24:12 +08:00
top: padding.top > height * 0.3 ? 20.0 : padding.top,
),
2025-03-12 17:15:31 +08:00
),
2025-07-31 17:09:18 +08:00
child: Theme(
data: Theme.of(context).copyWith(
floatingActionButtonTheme: Theme.of(context).floatingActionButtonTheme
.copyWith(
shape: const RoundedSuperellipseBorder(
borderRadius: BorderRadius.all(Radius.circular(16.0)),
),
),
),
child: LayoutBuilder(
2026-02-02 10:14:13 +08:00
builder: (_, constraints) {
globalState.container
.read(themeActionProvider.notifier)
.updateViewSize(
Size(constraints.maxWidth, constraints.maxHeight),
);
2025-07-31 17:09:18 +08:00
return _buildSystemUi(child);
},
),
2025-03-12 17:15:31 +08:00
),
);
}
}