Support proxies search Support svg display Optimize config persistence Add some scenes auto close connections Update core Optimize more details
300 lines
8.1 KiB
Dart
300 lines
8.1 KiB
Dart
import 'dart:io';
|
|
|
|
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 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 (Platform.isAndroid) ...[
|
|
HiddenItem(),
|
|
],
|
|
AnimateTabItem(),
|
|
OpenLogsItem(),
|
|
CloseConnectionsItem(),
|
|
UsageItem(),
|
|
AutoCheckUpdateItem(),
|
|
];
|
|
return ListView.separated(
|
|
itemBuilder: (_, index) {
|
|
final item = items[index];
|
|
return item;
|
|
},
|
|
separatorBuilder: (_, __) {
|
|
return const Divider(
|
|
height: 0,
|
|
);
|
|
},
|
|
itemCount: items.length,
|
|
);
|
|
}
|
|
}
|