Files
MWClash/lib/views/application_setting.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

297 lines
8.3 KiB
Dart

import 'package:fl_clash/common/common.dart';
import 'package:fl_clash/providers/config.dart';
import 'package:fl_clash/widgets/widgets.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:intl/intl.dart';
class CloseConnectionsItem extends ConsumerWidget {
const CloseConnectionsItem({super.key});
@override
Widget build(BuildContext context, ref) {
final closeConnections = ref.watch(
appSettingProvider.select((state) => state.closeConnections),
);
return ListItem.switchItem(
title: Text(appLocalizations.autoCloseConnections),
subtitle: Text(appLocalizations.autoCloseConnectionsDesc),
delegate: SwitchDelegate(
value: closeConnections,
onChanged: (value) async {
ref
.read(appSettingProvider.notifier)
.updateState((state) => state.copyWith(closeConnections: value));
},
),
);
}
}
class UsageItem extends ConsumerWidget {
const UsageItem({super.key});
@override
Widget build(BuildContext context, ref) {
final onlyStatisticsProxy = ref.watch(
appSettingProvider.select((state) => state.onlyStatisticsProxy),
);
return ListItem.switchItem(
title: Text(appLocalizations.onlyStatisticsProxy),
subtitle: Text(appLocalizations.onlyStatisticsProxyDesc),
delegate: SwitchDelegate(
value: onlyStatisticsProxy,
onChanged: (bool value) async {
ref
.read(appSettingProvider.notifier)
.updateState(
(state) => state.copyWith(onlyStatisticsProxy: value),
);
},
),
);
}
}
class MinimizeItem extends ConsumerWidget {
const MinimizeItem({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final minimizeOnExit = ref.watch(
appSettingProvider.select((state) => state.minimizeOnExit),
);
return ListItem.switchItem(
title: Text(appLocalizations.minimizeOnExit),
subtitle: Text(appLocalizations.minimizeOnExitDesc),
delegate: SwitchDelegate(
value: minimizeOnExit,
onChanged: (bool value) {
ref
.read(appSettingProvider.notifier)
.updateState((state) => state.copyWith(minimizeOnExit: value));
},
),
);
}
}
class AutoLaunchItem extends ConsumerWidget {
const AutoLaunchItem({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final autoLaunch = ref.watch(
appSettingProvider.select((state) => state.autoLaunch),
);
return ListItem.switchItem(
title: Text(appLocalizations.autoLaunch),
subtitle: Text(appLocalizations.autoLaunchDesc),
delegate: SwitchDelegate(
value: autoLaunch,
onChanged: (bool value) {
ref
.read(appSettingProvider.notifier)
.updateState((state) => state.copyWith(autoLaunch: value));
},
),
);
}
}
class SilentLaunchItem extends ConsumerWidget {
const SilentLaunchItem({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final silentLaunch = ref.watch(
appSettingProvider.select((state) => state.silentLaunch),
);
return ListItem.switchItem(
title: Text(appLocalizations.silentLaunch),
subtitle: Text(appLocalizations.silentLaunchDesc),
delegate: SwitchDelegate(
value: silentLaunch,
onChanged: (bool value) {
ref
.read(appSettingProvider.notifier)
.updateState((state) => state.copyWith(silentLaunch: value));
},
),
);
}
}
class AutoRunItem extends ConsumerWidget {
const AutoRunItem({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final autoRun = ref.watch(
appSettingProvider.select((state) => state.autoRun),
);
return ListItem.switchItem(
title: Text(appLocalizations.autoRun),
subtitle: Text(appLocalizations.autoRunDesc),
delegate: SwitchDelegate(
value: autoRun,
onChanged: (bool value) {
ref
.read(appSettingProvider.notifier)
.updateState((state) => state.copyWith(autoRun: value));
},
),
);
}
}
class HiddenItem extends ConsumerWidget {
const HiddenItem({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final hidden = ref.watch(
appSettingProvider.select((state) => state.hidden),
);
return ListItem.switchItem(
title: Text(appLocalizations.exclude),
subtitle: Text(appLocalizations.excludeDesc),
delegate: SwitchDelegate(
value: hidden,
onChanged: (value) {
ref
.read(appSettingProvider.notifier)
.updateState((state) => state.copyWith(hidden: value));
},
),
);
}
}
class AnimateTabItem extends ConsumerWidget {
const AnimateTabItem({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final isAnimateToPage = ref.watch(
appSettingProvider.select((state) => state.isAnimateToPage),
);
return ListItem.switchItem(
title: Text(appLocalizations.tabAnimation),
subtitle: Text(appLocalizations.tabAnimationDesc),
delegate: SwitchDelegate(
value: isAnimateToPage,
onChanged: (value) {
ref
.read(appSettingProvider.notifier)
.updateState((state) => state.copyWith(isAnimateToPage: value));
},
),
);
}
}
class OpenLogsItem extends ConsumerWidget {
const OpenLogsItem({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final openLogs = ref.watch(
appSettingProvider.select((state) => state.openLogs),
);
return ListItem.switchItem(
title: Text(appLocalizations.logcat),
subtitle: Text(appLocalizations.logcatDesc),
delegate: SwitchDelegate(
value: openLogs,
onChanged: (bool value) {
ref
.read(appSettingProvider.notifier)
.updateState((state) => state.copyWith(openLogs: value));
},
),
);
}
}
class CrashlyticsItem extends ConsumerWidget {
const CrashlyticsItem({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final crashlytics = ref.watch(
appSettingProvider.select((state) => state.crashlytics),
);
return ListItem.switchItem(
title: Text(appLocalizations.crashlytics),
subtitle: Text(appLocalizations.crashlyticsTip),
delegate: SwitchDelegate(
value: crashlytics,
onChanged: (bool value) {
ref
.read(appSettingProvider.notifier)
.updateState((state) => state.copyWith(crashlytics: value));
},
),
);
}
}
class AutoCheckUpdateItem extends ConsumerWidget {
const AutoCheckUpdateItem({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final autoCheckUpdate = ref.watch(
appSettingProvider.select((state) => state.autoCheckUpdate),
);
return ListItem.switchItem(
title: Text(appLocalizations.autoCheckUpdate),
subtitle: Text(appLocalizations.autoCheckUpdateDesc),
delegate: SwitchDelegate(
value: autoCheckUpdate,
onChanged: (bool value) {
ref
.read(appSettingProvider.notifier)
.updateState((state) => state.copyWith(autoCheckUpdate: value));
},
),
);
}
}
class ApplicationSettingView extends StatelessWidget {
const ApplicationSettingView({super.key});
String getLocaleString(Locale? locale) {
if (locale == null) return appLocalizations.defaultText;
return Intl.message(locale.toString());
}
@override
Widget build(BuildContext context) {
List<Widget> items = [
MinimizeItem(),
if (system.isDesktop) ...[AutoLaunchItem(), SilentLaunchItem()],
AutoRunItem(),
if (system.isAndroid) ...[HiddenItem()],
AnimateTabItem(),
OpenLogsItem(),
CloseConnectionsItem(),
UsageItem(),
if (system.isAndroid) CrashlyticsItem(),
AutoCheckUpdateItem(),
];
return ListView.separated(
itemBuilder: (_, index) {
final item = items[index];
return item;
},
separatorBuilder: (_, _) {
return const Divider(height: 0);
},
itemCount: items.length,
);
}
}