Support core status check and force restart Optimize proxies page and access page Update flutter and pub dependencies Update go version Optimize more details
231 lines
7.0 KiB
Dart
231 lines
7.0 KiB
Dart
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 (system.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),
|
|
);
|
|
},
|
|
);
|
|
},
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|