Support proxies search Support svg display Optimize config persistence Add some scenes auto close connections Update core Optimize more details
110 lines
2.8 KiB
Dart
110 lines
2.8 KiB
Dart
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<ClashManager> createState() => _ClashContainerState();
|
|
}
|
|
|
|
class _ClashContainerState extends ConsumerState<ClashManager>
|
|
with AppMessageListener {
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return widget.child;
|
|
}
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
clashMessage.addListener(this);
|
|
ref.listenManual(needSetupProvider, (prev, next) {
|
|
if (prev != next) {
|
|
globalState.appController.handleChangeProfile();
|
|
}
|
|
});
|
|
ref.listenManual(coreStateProvider, (prev, next) async {
|
|
if (prev != next) {
|
|
await clashCore.setState(next);
|
|
}
|
|
});
|
|
ref.listenManual(updateParamsProvider, (prev, next) {
|
|
if (prev != next) {
|
|
globalState.appController.updateClashConfigDebounce();
|
|
}
|
|
});
|
|
|
|
ref.listenManual(
|
|
appSettingProvider.select((state) => state.openLogs),
|
|
(prev, next) {
|
|
if (next) {
|
|
clashCore.startLog();
|
|
} else {
|
|
clashCore.stopLog();
|
|
}
|
|
},
|
|
fireImmediately: true,
|
|
);
|
|
}
|
|
|
|
@override
|
|
Future<void> dispose() async {
|
|
clashMessage.removeListener(this);
|
|
super.dispose();
|
|
}
|
|
|
|
@override
|
|
Future<void> onDelay(Delay delay) async {
|
|
super.onDelay(delay);
|
|
final appController = globalState.appController;
|
|
appController.setDelay(delay);
|
|
debouncer.call(
|
|
FunctionTag.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<void> onLoaded(String providerName) async {
|
|
ref.read(providersProvider.notifier).setProvider(
|
|
await clashCore.getExternalProvider(
|
|
providerName,
|
|
),
|
|
);
|
|
await globalState.appController.updateGroupsDebounce();
|
|
super.onLoaded(providerName);
|
|
}
|
|
}
|