Support proxies search Support svg display Optimize config persistence Add some scenes auto close connections Update core Optimize more details
255 lines
7.4 KiB
Dart
255 lines
7.4 KiB
Dart
import 'dart:io';
|
|
|
|
import 'package:fl_clash/common/common.dart';
|
|
import 'package:fl_clash/providers/config.dart';
|
|
import 'package:fl_clash/views/config/network.dart';
|
|
import 'package:fl_clash/widgets/widgets.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
|
|
class TUNButton extends StatelessWidget {
|
|
const TUNButton({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return SizedBox(
|
|
height: getWidgetHeight(1),
|
|
child: CommonCard(
|
|
onPressed: () {
|
|
showSheet(
|
|
context: context,
|
|
builder: (_, type) {
|
|
return AdaptiveSheetScaffold(
|
|
type: type,
|
|
body: generateListView(
|
|
generateSection(
|
|
items: [
|
|
if (system.isDesktop) const TUNItem(),
|
|
if (Platform.isMacOS) const AutoSetSystemDnsItem(),
|
|
const TunStackItem(),
|
|
],
|
|
),
|
|
),
|
|
title: appLocalizations.tun,
|
|
);
|
|
},
|
|
);
|
|
},
|
|
info: Info(
|
|
label: appLocalizations.tun,
|
|
iconData: Icons.stacked_line_chart,
|
|
),
|
|
child: Container(
|
|
padding: baseInfoEdgeInsets.copyWith(
|
|
top: 4,
|
|
bottom: 8,
|
|
right: 8,
|
|
),
|
|
child: Row(
|
|
mainAxisSize: MainAxisSize.max,
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
Flexible(
|
|
flex: 1,
|
|
child: TooltipText(
|
|
text: Text(
|
|
appLocalizations.options,
|
|
maxLines: 1,
|
|
overflow: TextOverflow.ellipsis,
|
|
style: Theme.of(context)
|
|
.textTheme
|
|
.titleSmall
|
|
?.adjustSize(-2)
|
|
.toLight,
|
|
),
|
|
),
|
|
),
|
|
Consumer(
|
|
builder: (_, ref, __) {
|
|
final enable = ref.watch(patchClashConfigProvider
|
|
.select((state) => state.tun.enable));
|
|
return Switch(
|
|
value: enable,
|
|
onChanged: (value) {
|
|
ref.read(patchClashConfigProvider.notifier).updateState(
|
|
(state) => state.copyWith.tun(
|
|
enable: value,
|
|
),
|
|
);
|
|
},
|
|
);
|
|
},
|
|
)
|
|
],
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class SystemProxyButton extends StatelessWidget {
|
|
const SystemProxyButton({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return SizedBox(
|
|
height: getWidgetHeight(1),
|
|
child: CommonCard(
|
|
onPressed: () {
|
|
showSheet(
|
|
context: context,
|
|
builder: (_, type) {
|
|
return AdaptiveSheetScaffold(
|
|
type: type,
|
|
body: generateListView(
|
|
generateSection(
|
|
items: [
|
|
SystemProxyItem(),
|
|
BypassDomainItem(),
|
|
],
|
|
),
|
|
),
|
|
title: appLocalizations.systemProxy,
|
|
);
|
|
},
|
|
);
|
|
},
|
|
info: Info(
|
|
label: appLocalizations.systemProxy,
|
|
iconData: Icons.shuffle,
|
|
),
|
|
child: Container(
|
|
padding: baseInfoEdgeInsets.copyWith(
|
|
top: 4,
|
|
bottom: 8,
|
|
right: 8,
|
|
),
|
|
child: Row(
|
|
mainAxisSize: MainAxisSize.max,
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
Flexible(
|
|
flex: 1,
|
|
child: TooltipText(
|
|
text: Text(
|
|
appLocalizations.options,
|
|
maxLines: 1,
|
|
overflow: TextOverflow.ellipsis,
|
|
style: Theme.of(context)
|
|
.textTheme
|
|
.titleSmall
|
|
?.adjustSize(-2)
|
|
.toLight,
|
|
),
|
|
),
|
|
),
|
|
Consumer(
|
|
builder: (_, ref, __) {
|
|
final systemProxy = ref.watch(networkSettingProvider
|
|
.select((state) => state.systemProxy));
|
|
return Switch(
|
|
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
|
|
value: systemProxy,
|
|
onChanged: (value) {
|
|
ref.read(networkSettingProvider.notifier).updateState(
|
|
(state) => state.copyWith(
|
|
systemProxy: value,
|
|
),
|
|
);
|
|
},
|
|
);
|
|
},
|
|
)
|
|
],
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class VpnButton extends StatelessWidget {
|
|
const VpnButton({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return SizedBox(
|
|
height: getWidgetHeight(1),
|
|
child: CommonCard(
|
|
onPressed: () {
|
|
showSheet(
|
|
context: context,
|
|
builder: (_, type) {
|
|
return AdaptiveSheetScaffold(
|
|
type: type,
|
|
body: generateListView(
|
|
generateSection(
|
|
items: [
|
|
const VPNItem(),
|
|
const VpnSystemProxyItem(),
|
|
const TunStackItem(),
|
|
],
|
|
),
|
|
),
|
|
title: "VPN",
|
|
);
|
|
},
|
|
);
|
|
},
|
|
info: Info(
|
|
label: "VPN",
|
|
iconData: Icons.stacked_line_chart,
|
|
),
|
|
child: Container(
|
|
padding: baseInfoEdgeInsets.copyWith(
|
|
top: 4,
|
|
bottom: 8,
|
|
right: 8,
|
|
),
|
|
child: Row(
|
|
mainAxisSize: MainAxisSize.max,
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
Flexible(
|
|
flex: 1,
|
|
child: TooltipText(
|
|
text: Text(
|
|
appLocalizations.options,
|
|
maxLines: 1,
|
|
overflow: TextOverflow.ellipsis,
|
|
style: Theme.of(context)
|
|
.textTheme
|
|
.titleSmall
|
|
?.adjustSize(-2)
|
|
.toLight,
|
|
),
|
|
),
|
|
),
|
|
Consumer(
|
|
builder: (_, ref, __) {
|
|
final enable = ref.watch(
|
|
vpnSettingProvider.select(
|
|
(state) => state.enable,
|
|
),
|
|
);
|
|
return Switch(
|
|
value: enable,
|
|
onChanged: (value) {
|
|
ref.read(vpnSettingProvider.notifier).updateState(
|
|
(state) => state.copyWith(
|
|
enable: value,
|
|
),
|
|
);
|
|
},
|
|
);
|
|
},
|
|
)
|
|
],
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|