Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
713e83d9d8 | ||
|
|
5e3b0e4929 |
@@ -164,7 +164,6 @@ class ApplicationState extends State<Application> {
|
||||
themeMode: state.themeMode,
|
||||
theme: ThemeData(
|
||||
useMaterial3: true,
|
||||
fontFamily: '',
|
||||
pageTransitionsTheme: _pageTransitionsTheme,
|
||||
colorScheme: _getAppColorScheme(
|
||||
brightness: Brightness.light,
|
||||
@@ -174,7 +173,6 @@ class ApplicationState extends State<Application> {
|
||||
),
|
||||
darkTheme: ThemeData(
|
||||
useMaterial3: true,
|
||||
fontFamily: '',
|
||||
pageTransitionsTheme: _pageTransitionsTheme,
|
||||
colorScheme: _getAppColorScheme(
|
||||
brightness: Brightness.dark,
|
||||
|
||||
@@ -96,7 +96,7 @@ class ClashCore {
|
||||
final proxiesRawString = proxiesRaw.cast<Utf8>().toDartString();
|
||||
return Isolate.run<List<Group>>(() {
|
||||
if(proxiesRawString.isEmpty) return [];
|
||||
final proxies = json.decode(proxiesRawString) as Map;
|
||||
final proxies = (json.decode(proxiesRawString) ?? {}) as Map;
|
||||
if(proxies.isEmpty) return [];
|
||||
final groupNames = [
|
||||
UsedProxy.GLOBAL.name,
|
||||
|
||||
@@ -7,7 +7,6 @@ class Android {
|
||||
init() async {
|
||||
app?.onExit = () {
|
||||
clashCore.shutdown();
|
||||
print("adsadda==>");
|
||||
exit(0);
|
||||
};
|
||||
}
|
||||
|
||||
@@ -7,8 +7,12 @@ extension BuildContextExtension on BuildContext {
|
||||
return findAncestorStateOfType<CommonScaffoldState>();
|
||||
}
|
||||
|
||||
Size get appSize{
|
||||
return MediaQuery.of(this).size;
|
||||
}
|
||||
|
||||
double get width {
|
||||
return MediaQuery.of(this).size.width;
|
||||
return appSize.width;
|
||||
}
|
||||
|
||||
ColorScheme get colorScheme => Theme.of(this).colorScheme;
|
||||
|
||||
@@ -359,7 +359,9 @@ class AppController {
|
||||
}
|
||||
|
||||
addProfileFormURL(String url) async {
|
||||
globalState.navigatorKey.currentState?.popUntil((route) => route.isFirst);
|
||||
if (globalState.navigatorKey.currentState?.canPop() ?? false) {
|
||||
globalState.navigatorKey.currentState?.popUntil((route) => route.isFirst);
|
||||
}
|
||||
toProfiles();
|
||||
final commonScaffoldState = globalState.homeScaffoldKey.currentState;
|
||||
if (commonScaffoldState?.mounted != true) return;
|
||||
@@ -421,18 +423,17 @@ class AppController {
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
List<Proxy> _sortOfName(List<Proxy> proxies) {
|
||||
return List.of(proxies)
|
||||
..sort(
|
||||
(a, b) => other.sortByChar(a.name, b.name),
|
||||
(a, b) => other.sortByChar(a.name, b.name),
|
||||
);
|
||||
}
|
||||
|
||||
List<Proxy> _sortOfDelay(List<Proxy> proxies) {
|
||||
return proxies = List.of(proxies)
|
||||
..sort(
|
||||
(a, b) {
|
||||
(a, b) {
|
||||
final aDelay = appState.getDelay(a.name);
|
||||
final bDelay = appState.getDelay(b.name);
|
||||
if (aDelay == null && bDelay == null) {
|
||||
@@ -449,11 +450,11 @@ class AppController {
|
||||
);
|
||||
}
|
||||
|
||||
List<Proxy> getSortProxies(List<Proxy> proxies){
|
||||
return switch(config.proxiesSortType){
|
||||
List<Proxy> getSortProxies(List<Proxy> proxies) {
|
||||
return switch (config.proxiesSortType) {
|
||||
ProxiesSortType.none => proxies,
|
||||
ProxiesSortType.delay => _sortOfDelay(proxies),
|
||||
ProxiesSortType.name =>_sortOfName(proxies),
|
||||
ProxiesSortType.name => _sortOfName(proxies),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -198,7 +198,7 @@ class ConnectionItem extends StatelessWidget {
|
||||
}
|
||||
|
||||
String _getRequestText(Metadata metadata) {
|
||||
var text = "${metadata.network}:://";
|
||||
var text = "${metadata.network}://";
|
||||
final ips = [
|
||||
metadata.host,
|
||||
metadata.destinationIP,
|
||||
|
||||
@@ -56,7 +56,7 @@ class _DashboardFragmentState extends State<DashboardFragment> {
|
||||
),
|
||||
GridItem(
|
||||
crossAxisCellCount: isDesktop ? 4 : 6,
|
||||
child: const IntranetIp(),
|
||||
child: const IntranetIP(),
|
||||
),
|
||||
],
|
||||
);
|
||||
|
||||
@@ -5,14 +5,14 @@ import 'package:fl_clash/state.dart';
|
||||
import 'package:fl_clash/widgets/widgets.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class IntranetIp extends StatefulWidget {
|
||||
const IntranetIp({super.key});
|
||||
class IntranetIP extends StatefulWidget {
|
||||
const IntranetIP({super.key});
|
||||
|
||||
@override
|
||||
State<IntranetIp> createState() => _IntranetIpState();
|
||||
State<IntranetIP> createState() => _IntranetIPState();
|
||||
}
|
||||
|
||||
class _IntranetIpState extends State<IntranetIp> {
|
||||
class _IntranetIPState extends State<IntranetIP> {
|
||||
final ipNotifier = ValueNotifier<String>("");
|
||||
|
||||
Future<String?> getLocalIpAddress() async {
|
||||
@@ -45,7 +45,7 @@ class _IntranetIpState extends State<IntranetIp> {
|
||||
Widget build(BuildContext context) {
|
||||
return CommonCard(
|
||||
info: Info(
|
||||
label: appLocalizations.intranetIp,
|
||||
label: appLocalizations.intranetIP,
|
||||
iconData: Icons.devices,
|
||||
),
|
||||
onPressed: (){
|
||||
|
||||
@@ -25,7 +25,9 @@ class AddProfile extends StatelessWidget {
|
||||
final url = await Navigator.of(context)
|
||||
.push<String>(MaterialPageRoute(builder: (_) => const ScanPage()));
|
||||
if (url != null) {
|
||||
_handleAddProfileFormURL(url);
|
||||
WidgetsBinding.instance.addPostFrameCallback((_){
|
||||
_handleAddProfileFormURL(url);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -91,7 +93,8 @@ class _URLFormDialogState extends State<URLFormDialog> {
|
||||
runSpacing: 16,
|
||||
children: [
|
||||
TextField(
|
||||
maxLines: null,
|
||||
maxLines: 5,
|
||||
minLines: 1,
|
||||
controller: urlController,
|
||||
decoration: InputDecoration(
|
||||
border: const OutlineInputBorder(),
|
||||
|
||||
@@ -94,7 +94,8 @@ class _EditProfileState extends State<EditProfile> {
|
||||
ListItem(
|
||||
title: TextFormField(
|
||||
controller: urlController,
|
||||
maxLines: null,
|
||||
maxLines: 5,
|
||||
minLines: 1,
|
||||
decoration: InputDecoration(
|
||||
border: const OutlineInputBorder(),
|
||||
labelText: appLocalizations.url,
|
||||
|
||||
@@ -55,7 +55,7 @@ class _ProfilesFragmentState extends State<ProfilesFragment> {
|
||||
_updateProfiles() async {
|
||||
final updateProfiles = profileItemKeys.map<Future>(
|
||||
(key) async => await key.currentState?.updateProfile(false));
|
||||
final result = await Future.wait(updateProfiles);
|
||||
await Future.wait(updateProfiles);
|
||||
}
|
||||
|
||||
_initScaffoldState() {
|
||||
@@ -437,16 +437,16 @@ class _ProfileItemState extends State<ProfileItem> {
|
||||
label: appLocalizations.update,
|
||||
iconData: Icons.sync,
|
||||
),
|
||||
CommonPopupMenuItem(
|
||||
action: ProfileActions.delete,
|
||||
label: appLocalizations.delete,
|
||||
iconData: Icons.delete,
|
||||
),
|
||||
CommonPopupMenuItem(
|
||||
action: ProfileActions.view,
|
||||
label: appLocalizations.view,
|
||||
iconData: Icons.visibility,
|
||||
),
|
||||
CommonPopupMenuItem(
|
||||
action: ProfileActions.delete,
|
||||
label: appLocalizations.delete,
|
||||
iconData: Icons.delete,
|
||||
),
|
||||
],
|
||||
onSelected: (ProfileActions? action) async {
|
||||
switch (action) {
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
import 'dart:io';
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:fl_clash/clash/core.dart';
|
||||
import 'package:fl_clash/common/common.dart';
|
||||
@@ -245,7 +248,7 @@ class _ProxiesExpansionPanelFragmentState
|
||||
itemBuilder: (_, index) {
|
||||
final groupName = state.groupNames[index];
|
||||
return ProxyGroupView(
|
||||
key: Key(groupName),
|
||||
key: PageStorageKey(groupName),
|
||||
groupName: groupName,
|
||||
type: ProxiesType.expansion,
|
||||
);
|
||||
@@ -277,6 +280,9 @@ class ProxyGroupView extends StatefulWidget {
|
||||
|
||||
class _ProxyGroupViewState extends State<ProxyGroupView> {
|
||||
var isLock = false;
|
||||
final isBoundaryNotifier = ValueNotifier<bool>(false);
|
||||
final scrollController = ScrollController();
|
||||
var isEnd = false;
|
||||
|
||||
String get groupName => widget.groupName;
|
||||
|
||||
@@ -368,6 +374,53 @@ class _ProxyGroupViewState extends State<ProxyGroupView> {
|
||||
);
|
||||
}
|
||||
|
||||
Widget _androidExpansionHandle(Widget child) {
|
||||
// return NotificationListener<ScrollNotification>(
|
||||
// onNotification: (ScrollNotification notification) {
|
||||
// if (notification is ScrollEndNotification) {
|
||||
// if (notification.metrics.atEdge) {
|
||||
// isEnd = notification.metrics.pixels ==
|
||||
// notification.metrics.maxScrollExtent;
|
||||
// isBoundaryNotifier.value = true;
|
||||
// }
|
||||
// }
|
||||
// return false;
|
||||
// },
|
||||
// child: Listener(
|
||||
// onPointerMove: (details) {
|
||||
// double yOffset = details.delta.dy;
|
||||
// final isEnd = scrollController.position.maxScrollExtent == scrollController.position.pixels;
|
||||
// final isTop = scrollController.position.minScrollExtent == scrollController.position.pixels;
|
||||
// if(isEnd || isTop){
|
||||
// isBoundaryNotifier.value = true;
|
||||
// } else if (yOffset > 0 && scrollController.position.maxScrollExtent == scrollController.position.pixels) {
|
||||
// isBoundaryNotifier.value = false;
|
||||
// } else if (yOffset < 0 && !isEnd) {
|
||||
// isBoundaryNotifier.value = false;
|
||||
// }
|
||||
// },
|
||||
// child: child,
|
||||
// ),
|
||||
// );
|
||||
return Listener(
|
||||
onPointerMove: (details) {
|
||||
double yOffset = details.delta.dy;
|
||||
final isEnd = scrollController.position.maxScrollExtent ==
|
||||
scrollController.position.pixels;
|
||||
final isTop = scrollController.position.minScrollExtent ==
|
||||
scrollController.position.pixels;
|
||||
if (isEnd && yOffset < 0) {
|
||||
isBoundaryNotifier.value = true;
|
||||
} else if (isTop && yOffset > 0) {
|
||||
isBoundaryNotifier.value = true;
|
||||
} else {
|
||||
isBoundaryNotifier.value = false;
|
||||
}
|
||||
},
|
||||
child: child,
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildExpansionGroupView({
|
||||
required List<Proxy> proxies,
|
||||
required int columns,
|
||||
@@ -376,11 +429,21 @@ class _ProxyGroupViewState extends State<ProxyGroupView> {
|
||||
final sortedProxies = globalState.appController.getSortProxies(
|
||||
proxies,
|
||||
);
|
||||
final group =
|
||||
globalState.appController.appState.getGroupWithName(groupName)!;
|
||||
final itemHeight = _getItemHeight(proxyCardType);
|
||||
final innerHeight = context.appSize.height - 200;
|
||||
final lines = (sortedProxies.length / columns).ceil();
|
||||
final minLines =
|
||||
innerHeight >= 200 ? (innerHeight / itemHeight).floor() : 3;
|
||||
final hasScrollable = lines > minLines;
|
||||
final height = (itemHeight + 8) * min(lines, minLines) - 8;
|
||||
return Selector<Config, Set<String>>(
|
||||
selector: (_, config) => config.currentUnfoldSet,
|
||||
builder: (_, currentUnfoldSet, __) {
|
||||
return CommonCard(
|
||||
child: ExpansionTile(
|
||||
childrenPadding: const EdgeInsets.all(8),
|
||||
initiallyExpanded: currentUnfoldSet.contains(groupName),
|
||||
iconColor: context.colorScheme.onSurfaceVariant,
|
||||
onExpansionChanged: (value) {
|
||||
@@ -417,7 +480,7 @@ class _ProxyGroupViewState extends State<ProxyGroupView> {
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
Text(
|
||||
groupName,
|
||||
group.type.name,
|
||||
style: context.textTheme.labelMedium?.toLight,
|
||||
),
|
||||
Flexible(
|
||||
@@ -478,32 +541,78 @@ class _ProxyGroupViewState extends State<ProxyGroupView> {
|
||||
collapsedShape: const RoundedRectangleBorder(
|
||||
side: BorderSide.none,
|
||||
),
|
||||
childrenPadding: const EdgeInsets.only(
|
||||
top: 8,
|
||||
bottom: 8,
|
||||
left: 8,
|
||||
right: 8,
|
||||
),
|
||||
children: [
|
||||
Grid(
|
||||
mainAxisSpacing: 8,
|
||||
crossAxisSpacing: 8,
|
||||
crossAxisCount: columns,
|
||||
children: [
|
||||
for (final proxy in sortedProxies)
|
||||
_currentProxyNameBuilder(
|
||||
builder: (value) {
|
||||
return ProxyCard(
|
||||
style: CommonCardType.filled,
|
||||
type: proxyCardType,
|
||||
isSelected: value == proxy.name,
|
||||
key: ValueKey('$groupName.${proxy.name}'),
|
||||
proxy: proxy,
|
||||
groupName: groupName,
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
SizedBox(
|
||||
height: height,
|
||||
child: Platform.isAndroid
|
||||
? _androidExpansionHandle(
|
||||
ValueListenableBuilder(
|
||||
valueListenable: isBoundaryNotifier,
|
||||
builder: (_, isBoundary, child) {
|
||||
return Scrollbar(
|
||||
thickness: 6,
|
||||
interactive: true,
|
||||
radius: const Radius.circular(6),
|
||||
child: GridView.builder(
|
||||
key: widget.key,
|
||||
controller: scrollController,
|
||||
physics: isBoundary || !hasScrollable
|
||||
? const NeverScrollableScrollPhysics()
|
||||
: const AlwaysScrollableScrollPhysics(),
|
||||
gridDelegate:
|
||||
SliverGridDelegateWithFixedCrossAxisCount(
|
||||
crossAxisCount: columns,
|
||||
mainAxisSpacing: 8,
|
||||
crossAxisSpacing: 8,
|
||||
mainAxisExtent: _getItemHeight(proxyCardType),
|
||||
),
|
||||
itemCount: sortedProxies.length,
|
||||
itemBuilder: (_, index) {
|
||||
final proxy = sortedProxies[index];
|
||||
return _currentProxyNameBuilder(
|
||||
builder: (value) {
|
||||
return ProxyCard(
|
||||
style: CommonCardType.filled,
|
||||
type: proxyCardType,
|
||||
isSelected: value == proxy.name,
|
||||
key: ValueKey('$groupName.${proxy.name}'),
|
||||
proxy: proxy,
|
||||
groupName: groupName,
|
||||
);
|
||||
});
|
||||
},
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
)
|
||||
: GridView.builder(
|
||||
key: widget.key,
|
||||
controller: scrollController,
|
||||
physics: !hasScrollable
|
||||
? const NeverScrollableScrollPhysics()
|
||||
: const AlwaysScrollableScrollPhysics(),
|
||||
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
|
||||
crossAxisCount: columns,
|
||||
mainAxisSpacing: 8,
|
||||
crossAxisSpacing: 8,
|
||||
mainAxisExtent: _getItemHeight(proxyCardType),
|
||||
),
|
||||
itemCount: sortedProxies.length,
|
||||
itemBuilder: (_, index) {
|
||||
final proxy = sortedProxies[index];
|
||||
return _currentProxyNameBuilder(builder: (value) {
|
||||
return ProxyCard(
|
||||
style: CommonCardType.filled,
|
||||
type: proxyCardType,
|
||||
isSelected: value == proxy.name,
|
||||
key: ValueKey('$groupName.${proxy.name}'),
|
||||
proxy: proxy,
|
||||
groupName: groupName,
|
||||
);
|
||||
});
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
@@ -512,6 +621,13 @@ class _ProxyGroupViewState extends State<ProxyGroupView> {
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
isBoundaryNotifier.dispose();
|
||||
scrollController.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Selector2<AppState, Config, ProxyGroupSelectorState>(
|
||||
|
||||
@@ -193,7 +193,7 @@ class RequestItem extends StatelessWidget {
|
||||
}
|
||||
|
||||
String _getRequestText(Metadata metadata) {
|
||||
var text = "${metadata.network}:://";
|
||||
var text = "${metadata.network}://";
|
||||
final ips = [
|
||||
metadata.host,
|
||||
metadata.destinationIP,
|
||||
|
||||
@@ -161,7 +161,6 @@
|
||||
"checking": "Checking...",
|
||||
"country": "Country",
|
||||
"checkError": "Check error",
|
||||
"ipCheckTimeout": "Ip check timeout",
|
||||
"search": "Search",
|
||||
"allowBypass": "Allow applications to bypass VPN",
|
||||
"allowBypassDesc": "Some apps can bypass VPN when turned on",
|
||||
@@ -173,8 +172,8 @@
|
||||
"systemProxyDesc": "Attach HTTP proxy to VpnService",
|
||||
"unifiedDelay": "Unified delay",
|
||||
"unifiedDelayDesc": "Remove extra delays such as handshaking",
|
||||
"tcpConcurrent": "Tcp concurrent",
|
||||
"tcpConcurrentDesc": "Enabling it will allow tcp concurrency",
|
||||
"tcpConcurrent": "TCP concurrent",
|
||||
"tcpConcurrentDesc": "Enabling it will allow TCP concurrency",
|
||||
"geodataLoader": "Geo Low Memory Mode",
|
||||
"geodataLoaderDesc": "Enabling will use the Geo low memory loader",
|
||||
"requests": "Requests",
|
||||
@@ -188,7 +187,7 @@
|
||||
"connectionsDesc": "View current connection",
|
||||
"nullRequestsDesc": "No requests",
|
||||
"nullConnectionsDesc": "No connections",
|
||||
"intranetIp": "Intranet IP",
|
||||
"intranetIP": "Intranet IP",
|
||||
"view": "View",
|
||||
"cut": "Cut",
|
||||
"copy": "Copy",
|
||||
|
||||
@@ -161,7 +161,6 @@
|
||||
"checking": "检测中...",
|
||||
"country": "区域",
|
||||
"checkError": "检测失败",
|
||||
"ipCheckTimeout": "Ip检测超时",
|
||||
"search": "搜索",
|
||||
"allowBypass": "允许应用绕过VPN",
|
||||
"allowBypassDesc": "开启后部分应用可绕过VPN",
|
||||
@@ -174,7 +173,7 @@
|
||||
"unifiedDelay": "统一延迟",
|
||||
"unifiedDelayDesc": "去除握手等额外延迟",
|
||||
"tcpConcurrent": "TCP并发",
|
||||
"tcpConcurrentDesc": "开启后允许tcp并发",
|
||||
"tcpConcurrentDesc": "开启后允许TCP并发",
|
||||
"geodataLoader": "Geo低内存模式",
|
||||
"geodataLoaderDesc": "开启将使用Geo低内存加载器",
|
||||
"requests": "请求",
|
||||
@@ -188,7 +187,7 @@
|
||||
"connectionsDesc": "查看当前连接",
|
||||
"nullRequestsDesc": "暂无请求",
|
||||
"nullConnectionsDesc": "暂无连接",
|
||||
"intranetIp": "内网 IP",
|
||||
"intranetIP": "内网 IP",
|
||||
"view": "查看",
|
||||
"cut": "剪切",
|
||||
"copy": "复制",
|
||||
|
||||
@@ -152,9 +152,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
||||
"infiniteTime":
|
||||
MessageLookupByLibrary.simpleMessage("Long term effective"),
|
||||
"init": MessageLookupByLibrary.simpleMessage("Init"),
|
||||
"intranetIp": MessageLookupByLibrary.simpleMessage("Intranet IP"),
|
||||
"ipCheckTimeout":
|
||||
MessageLookupByLibrary.simpleMessage("Ip check timeout"),
|
||||
"intranetIP": MessageLookupByLibrary.simpleMessage("Intranet IP"),
|
||||
"ipv6Desc": MessageLookupByLibrary.simpleMessage(
|
||||
"When turned on it will be able to receive IPv6 traffic"),
|
||||
"just": MessageLookupByLibrary.simpleMessage("Just"),
|
||||
@@ -268,9 +266,9 @@ class MessageLookup extends MessageLookupByLibrary {
|
||||
"tabAnimation": MessageLookupByLibrary.simpleMessage("Tab animation"),
|
||||
"tabAnimationDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"When enabled, the home tab will add a toggle animation"),
|
||||
"tcpConcurrent": MessageLookupByLibrary.simpleMessage("Tcp concurrent"),
|
||||
"tcpConcurrent": MessageLookupByLibrary.simpleMessage("TCP concurrent"),
|
||||
"tcpConcurrentDesc": MessageLookupByLibrary.simpleMessage(
|
||||
"Enabling it will allow tcp concurrency"),
|
||||
"Enabling it will allow TCP concurrency"),
|
||||
"theme": MessageLookupByLibrary.simpleMessage("Theme"),
|
||||
"themeColor": MessageLookupByLibrary.simpleMessage("Theme color"),
|
||||
"themeDesc": MessageLookupByLibrary.simpleMessage(
|
||||
|
||||
@@ -123,8 +123,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
||||
"importFromURL": MessageLookupByLibrary.simpleMessage("从URL导入"),
|
||||
"infiniteTime": MessageLookupByLibrary.simpleMessage("长期有效"),
|
||||
"init": MessageLookupByLibrary.simpleMessage("初始化"),
|
||||
"intranetIp": MessageLookupByLibrary.simpleMessage("内网 IP"),
|
||||
"ipCheckTimeout": MessageLookupByLibrary.simpleMessage("Ip检测超时"),
|
||||
"intranetIP": MessageLookupByLibrary.simpleMessage("内网 IP"),
|
||||
"ipv6Desc": MessageLookupByLibrary.simpleMessage("开启后将可以接收IPv6流量"),
|
||||
"just": MessageLookupByLibrary.simpleMessage("刚刚"),
|
||||
"language": MessageLookupByLibrary.simpleMessage("语言"),
|
||||
@@ -217,7 +216,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
||||
"tabAnimationDesc":
|
||||
MessageLookupByLibrary.simpleMessage("开启后,主页选项卡将添加切换动画"),
|
||||
"tcpConcurrent": MessageLookupByLibrary.simpleMessage("TCP并发"),
|
||||
"tcpConcurrentDesc": MessageLookupByLibrary.simpleMessage("开启后允许tcp并发"),
|
||||
"tcpConcurrentDesc": MessageLookupByLibrary.simpleMessage("开启后允许TCP并发"),
|
||||
"theme": MessageLookupByLibrary.simpleMessage("主题"),
|
||||
"themeColor": MessageLookupByLibrary.simpleMessage("主题色彩"),
|
||||
"themeDesc": MessageLookupByLibrary.simpleMessage("设置深色模式,调整色彩"),
|
||||
|
||||
@@ -1670,16 +1670,6 @@ class AppLocalizations {
|
||||
);
|
||||
}
|
||||
|
||||
/// `Ip check timeout`
|
||||
String get ipCheckTimeout {
|
||||
return Intl.message(
|
||||
'Ip check timeout',
|
||||
name: 'ipCheckTimeout',
|
||||
desc: '',
|
||||
args: [],
|
||||
);
|
||||
}
|
||||
|
||||
/// `Search`
|
||||
String get search {
|
||||
return Intl.message(
|
||||
@@ -1790,20 +1780,20 @@ class AppLocalizations {
|
||||
);
|
||||
}
|
||||
|
||||
/// `Tcp concurrent`
|
||||
/// `TCP concurrent`
|
||||
String get tcpConcurrent {
|
||||
return Intl.message(
|
||||
'Tcp concurrent',
|
||||
'TCP concurrent',
|
||||
name: 'tcpConcurrent',
|
||||
desc: '',
|
||||
args: [],
|
||||
);
|
||||
}
|
||||
|
||||
/// `Enabling it will allow tcp concurrency`
|
||||
/// `Enabling it will allow TCP concurrency`
|
||||
String get tcpConcurrentDesc {
|
||||
return Intl.message(
|
||||
'Enabling it will allow tcp concurrency',
|
||||
'Enabling it will allow TCP concurrency',
|
||||
name: 'tcpConcurrentDesc',
|
||||
desc: '',
|
||||
args: [],
|
||||
@@ -1941,10 +1931,10 @@ class AppLocalizations {
|
||||
}
|
||||
|
||||
/// `Intranet IP`
|
||||
String get intranetIp {
|
||||
String get intranetIP {
|
||||
return Intl.message(
|
||||
'Intranet IP',
|
||||
name: 'intranetIp',
|
||||
name: 'intranetIP',
|
||||
desc: '',
|
||||
args: [],
|
||||
);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
name: fl_clash
|
||||
description: A multi-platform proxy client based on ClashMeta, simple and easy to use, open-source and ad-free.
|
||||
publish_to: 'none'
|
||||
version: 0.8.28
|
||||
version: 0.8.30
|
||||
environment:
|
||||
sdk: '>=3.1.0 <4.0.0'
|
||||
|
||||
|
||||
Reference in New Issue
Block a user