Support proxies search Support svg display Optimize config persistence Add some scenes auto close connections Update core Optimize more details
134 lines
3.0 KiB
Dart
134 lines
3.0 KiB
Dart
import 'dart:async';
|
|
|
|
import 'package:fl_clash/common/common.dart';
|
|
import 'package:fl_clash/providers/providers.dart';
|
|
import 'package:fl_clash/state.dart';
|
|
import 'package:flutter/foundation.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
|
|
class AppStateManager extends ConsumerStatefulWidget {
|
|
final Widget child;
|
|
|
|
const AppStateManager({
|
|
super.key,
|
|
required this.child,
|
|
});
|
|
|
|
@override
|
|
ConsumerState<AppStateManager> createState() => _AppStateManagerState();
|
|
}
|
|
|
|
class _AppStateManagerState extends ConsumerState<AppStateManager>
|
|
with WidgetsBindingObserver {
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
WidgetsBinding.instance.addObserver(this);
|
|
ref.listenManual(layoutChangeProvider, (prev, next) {
|
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
|
if (prev != next) {
|
|
globalState.cacheHeightMap = {};
|
|
}
|
|
});
|
|
});
|
|
ref.listenManual(
|
|
checkIpProvider,
|
|
(prev, next) {
|
|
if (prev != next && next.b) {
|
|
detectionState.startCheck();
|
|
}
|
|
},
|
|
fireImmediately: true,
|
|
);
|
|
ref.listenManual(configStateProvider, (prev, next) {
|
|
if (prev != next) {
|
|
globalState.appController.savePreferencesDebounce();
|
|
}
|
|
});
|
|
ref.listenManual(
|
|
autoSetSystemDnsStateProvider,
|
|
(prev, next) async {
|
|
if (prev == next) {
|
|
return;
|
|
}
|
|
if (next.a == true && next.b == true) {
|
|
system.setMacOSDns(false);
|
|
} else {
|
|
system.setMacOSDns(true);
|
|
}
|
|
},
|
|
);
|
|
}
|
|
|
|
@override
|
|
reassemble() {
|
|
super.reassemble();
|
|
}
|
|
|
|
@override
|
|
void dispose() async {
|
|
await system.setMacOSDns(true);
|
|
WidgetsBinding.instance.removeObserver(this);
|
|
super.dispose();
|
|
}
|
|
|
|
@override
|
|
Future<void> didChangeAppLifecycleState(AppLifecycleState state) async {
|
|
commonPrint.log("$state");
|
|
if (state == AppLifecycleState.paused ||
|
|
state == AppLifecycleState.inactive) {
|
|
globalState.appController.savePreferences();
|
|
} else {
|
|
render?.resume();
|
|
}
|
|
}
|
|
|
|
@override
|
|
void didChangePlatformBrightness() {
|
|
globalState.appController.updateBrightness(
|
|
WidgetsBinding.instance.platformDispatcher.platformBrightness,
|
|
);
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Listener(
|
|
onPointerHover: (_) {
|
|
render?.resume();
|
|
},
|
|
child: widget.child,
|
|
);
|
|
}
|
|
}
|
|
|
|
class AppEnvManager extends StatelessWidget {
|
|
final Widget child;
|
|
|
|
const AppEnvManager({
|
|
super.key,
|
|
required this.child,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
if (kDebugMode) {
|
|
if (globalState.isPre) {
|
|
return Banner(
|
|
message: 'DEBUG',
|
|
location: BannerLocation.topEnd,
|
|
child: child,
|
|
);
|
|
}
|
|
}
|
|
if (globalState.isPre) {
|
|
return Banner(
|
|
message: 'PRE',
|
|
location: BannerLocation.topEnd,
|
|
child: child,
|
|
);
|
|
}
|
|
return child;
|
|
}
|
|
}
|