Files
MWClash/lib/manager/core_manager.dart
chen08209 ed7868282a Add android separates the core process
Support core status check and force restart

Optimize proxies page and access page

Update flutter and pub dependencies

Update go version

Optimize more details
2025-09-23 15:23:58 +08:00

108 lines
3.0 KiB
Dart

import 'package:fl_clash/common/common.dart';
import 'package:fl_clash/core/core.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 CoreManager extends ConsumerStatefulWidget {
final Widget child;
const CoreManager({super.key, required this.child});
@override
ConsumerState<CoreManager> createState() => _CoreContainerState();
}
class _CoreContainerState extends ConsumerState<CoreManager>
with CoreEventListener {
@override
Widget build(BuildContext context) {
return widget.child;
}
@override
void initState() {
super.initState();
coreEventManager.addListener(this);
ref.listenManual(needSetupProvider, (prev, next) {
if (prev != next) {
globalState.appController.handleChangeProfile();
}
});
ref.listenManual(updateParamsProvider, (prev, next) {
if (prev != next) {
globalState.appController.updateClashConfigDebounce();
}
});
ref.listenManual(appSettingProvider.select((state) => state.openLogs), (
prev,
next,
) {
if (next) {
coreController.startLog();
} else {
coreController.stopLog();
}
}, fireImmediately: true);
}
@override
Future<void> dispose() async {
coreEventManager.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 {
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(TrackerInfo trackerInfo) async {
ref.read(requestsProvider.notifier).addRequest(trackerInfo);
super.onRequest(trackerInfo);
}
@override
Future<void> onLoaded(String providerName) async {
ref
.read(providersProvider.notifier)
.setProvider(await coreController.getExternalProvider(providerName));
globalState.appController.updateGroupsDebounce();
super.onLoaded(providerName);
}
@override
Future<void> onCrash(String message) async {
if (!globalState.isUserDisconnected) {
context.showNotifier(message);
}
globalState.isUserDisconnected = false;
if (ref.read(coreStatusProvider) != CoreStatus.connected) {
return;
}
ref.read(coreStatusProvider.notifier).value = CoreStatus.disconnected;
await coreController.shutdown();
super.onCrash(message);
}
}