Files
FlClash/lib/manager/theme_manager.dart
T
chen08209 491fae10f5 feat(views)!: set DNS, NTP, sniffer and TUN key by key
BREAKING CHANGE: DNS and NTP override toggles are removed; picked keys apply to every profile
Changelog: Per-key DNS, NTP, sniffer and TUN settings
2026-10-12 10:34:14 +08:00

97 lines
2.8 KiB
Dart

import 'dart:math';
import 'package:fl_clash/common/common.dart';
import 'package:fl_clash/common/theme.dart';
import 'package:fl_clash/providers/action.dart';
import 'package:fl_clash/providers/config.dart';
import 'package:fl_clash/state.dart';
import 'package:material_ui/material_ui.dart';
import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../providers/state.dart';
class ThemeManager extends ConsumerWidget {
final Widget child;
const ThemeManager({super.key, required this.child});
Widget _buildSystemUi(Widget child) {
if (!system.isAndroid) {
return child;
}
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,
);
},
);
}
@override
Widget build(BuildContext context, ref) {
final textScale = ref.read(
themeSettingProvider.select((state) => state.textScale),
);
final double textScaleFactor = max(
min(
textScale.enable ? textScale.scale : systemTextScaleOf(context),
maxTextScale,
),
minTextScale,
);
globalState.measure = Measure.of(context, textScaleFactor);
globalState.theme = CommonTheme.of(context, textScaleFactor);
return _AppMediaQuery(
textScaler: TextScaler.linear(textScaleFactor),
child: LayoutBuilder(
builder: (_, constraints) {
ref
.read(themeActionProvider.notifier)
.updateViewSize(
Size(constraints.maxWidth, constraints.maxHeight),
);
return _buildSystemUi(child);
},
),
);
}
}
class _AppMediaQuery extends StatelessWidget {
const _AppMediaQuery({required this.textScaler, required this.child});
final TextScaler textScaler;
final Widget child;
@override
Widget build(BuildContext context) {
final data = MediaQuery.of(context);
final padding = data.padding;
return MediaQuery(
data: data.copyWith(
textScaler: textScaler,
padding: padding.copyWith(
top: padding.top > data.size.height * 0.3 ? 20.0 : padding.top,
),
),
child: child,
);
}
}