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 createState() => _AppStateManagerState(); } class _AppStateManagerState extends ConsumerState 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 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; } }