import 'package:fl_clash/clash/clash.dart'; import 'package:fl_clash/common/common.dart'; import 'package:fl_clash/enum/enum.dart'; import 'package:fl_clash/models/models.dart'; import 'package:fl_clash/providers/app.dart'; import 'package:fl_clash/providers/config.dart'; import 'package:fl_clash/providers/state.dart'; import 'package:fl_clash/state.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; class ClashManager extends ConsumerStatefulWidget { final Widget child; const ClashManager({ super.key, required this.child, }); @override ConsumerState createState() => _ClashContainerState(); } class _ClashContainerState extends ConsumerState with AppMessageListener { @override Widget build(BuildContext context) { return widget.child; } @override void initState() { super.initState(); clashMessage.addListener(this); ref.listenManual(currentProfileIdProvider, (prev, next) { if (prev != next) { globalState.appController.handleChangeProfile(); } }); ref.listenManual(coreStateProvider, (prev, next) async { if (prev != next) { await clashCore.setState(next); } }); ref.listenManual(clashConfigStateProvider, (prev, next) { if (prev != next) { globalState.appController.updateClashConfigDebounce(); } }); } @override Future dispose() async { clashMessage.removeListener(this); super.dispose(); } @override Future onDelay(Delay delay) async { super.onDelay(delay); final appController = globalState.appController; appController.setDelay(delay); debouncer.call( DebounceTag.updateDelay, () async { await appController.updateGroupsDebounce(); }, duration: const Duration(milliseconds: 5000), ); } @override void onLog(Log log) { ref.read(logsProvider.notifier).addLog(log); if (log.logLevel == LogLevel.error) { globalState.showNotifier(log.payload); } super.onLog(log); } @override void onRequest(Connection connection) async { ref.read(requestsProvider.notifier).addRequest(connection); super.onRequest(connection); } @override Future onLoaded(String providerName) async { ref.read(providersProvider.notifier).setProvider( await clashCore.getExternalProvider( providerName, ), ); await globalState.appController.updateGroupsDebounce(); super.onLoaded(providerName); } }