Fix windows tray issues
Support setting bypassDomain Update flutter version Fix android service issues Fix macos dock exit button issues Add route address setting Optimize provider view
This commit is contained in:
@@ -1,6 +1,4 @@
|
||||
import 'dart:io';
|
||||
|
||||
|
||||
import 'package:fl_clash/state.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
|
||||
@@ -19,7 +17,7 @@ class _PopContainerState extends State<BackScope> {
|
||||
if (Platform.isAndroid) {
|
||||
return PopScope(
|
||||
canPop: false,
|
||||
onPopInvoked: (_) async {
|
||||
onPopInvokedWithResult: (_, __) async {
|
||||
final canPop = Navigator.canPop(context);
|
||||
if (canPop) {
|
||||
Navigator.pop(context);
|
||||
|
||||
@@ -6,8 +6,8 @@ import 'package:flutter/material.dart';
|
||||
|
||||
import 'card.dart';
|
||||
import 'input.dart';
|
||||
import 'sheet.dart';
|
||||
import 'scaffold.dart';
|
||||
import 'sheet.dart';
|
||||
|
||||
class Delegate {
|
||||
const Delegate();
|
||||
@@ -360,11 +360,13 @@ class ListItem<T> extends StatelessWidget {
|
||||
return;
|
||||
}
|
||||
|
||||
BaseNavigator.push(context, CommonScaffold(
|
||||
key: Key(nextDelegate.title),
|
||||
body: nextDelegate.widget,
|
||||
title: nextDelegate.title,
|
||||
));
|
||||
BaseNavigator.push(
|
||||
context,
|
||||
CommonScaffold(
|
||||
key: Key(nextDelegate.title),
|
||||
body: nextDelegate.widget,
|
||||
title: nextDelegate.title,
|
||||
));
|
||||
},
|
||||
);
|
||||
}
|
||||
@@ -468,7 +470,7 @@ class ListHeader extends StatelessWidget {
|
||||
}
|
||||
|
||||
List<Widget> generateSection({
|
||||
required String title,
|
||||
String? title,
|
||||
required Iterable<Widget> items,
|
||||
List<Widget>? actions,
|
||||
bool separated = true,
|
||||
@@ -481,7 +483,7 @@ List<Widget> generateSection({
|
||||
)
|
||||
: items;
|
||||
return [
|
||||
if (items.isNotEmpty)
|
||||
if (items.isNotEmpty && title != null)
|
||||
ListHeader(
|
||||
title: title,
|
||||
actions: actions,
|
||||
|
||||
@@ -2,8 +2,8 @@ import 'package:fl_clash/common/common.dart';
|
||||
import 'package:fl_clash/enum/enum.dart';
|
||||
import 'package:fl_clash/state.dart';
|
||||
import 'package:fl_clash/widgets/scaffold.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'side_sheet.dart';
|
||||
|
||||
showExtendPage(
|
||||
|
||||
53
lib/widgets/subscription_info_view.dart
Normal file
53
lib/widgets/subscription_info_view.dart
Normal file
@@ -0,0 +1,53 @@
|
||||
import 'package:fl_clash/common/common.dart';
|
||||
import 'package:fl_clash/models/models.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class SubscriptionInfoView extends StatelessWidget {
|
||||
final SubscriptionInfo? subscriptionInfo;
|
||||
|
||||
const SubscriptionInfoView({
|
||||
super.key,
|
||||
this.subscriptionInfo,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
if (subscriptionInfo == null) {
|
||||
return Container();
|
||||
}
|
||||
if (subscriptionInfo?.total == 0) {
|
||||
return Container();
|
||||
}
|
||||
final use = subscriptionInfo!.upload + subscriptionInfo!.download;
|
||||
final total = subscriptionInfo!.total;
|
||||
final progress = use / total;
|
||||
|
||||
final useShow = TrafficValue(value: use).show;
|
||||
final totalShow = TrafficValue(value: total).show;
|
||||
final expireShow = subscriptionInfo?.expire != null &&
|
||||
subscriptionInfo!.expire != 0
|
||||
? DateTime.fromMillisecondsSinceEpoch(subscriptionInfo!.expire * 1000)
|
||||
.show
|
||||
: appLocalizations.infiniteTime;
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
LinearProgressIndicator(
|
||||
minHeight: 6,
|
||||
value: progress,
|
||||
backgroundColor: context.colorScheme.primary.toSoft(),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 8,
|
||||
),
|
||||
Text(
|
||||
"$useShow / $totalShow · $expireShow",
|
||||
style: context.textTheme.labelMedium?.toLight,
|
||||
),
|
||||
const SizedBox(
|
||||
height: 4,
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,24 +1,25 @@
|
||||
export 'scaffold.dart';
|
||||
export 'float_layout.dart';
|
||||
export 'popup_menu.dart';
|
||||
export 'card.dart';
|
||||
export 'list.dart';
|
||||
export 'line_chart.dart';
|
||||
export 'grid.dart';
|
||||
export 'open_container.dart';
|
||||
export 'color_scheme_box.dart';
|
||||
export 'null_status.dart';
|
||||
export 'disabled_mask.dart';
|
||||
export 'side_sheet.dart';
|
||||
export 'sheet.dart';
|
||||
export 'animate_grid.dart';
|
||||
export 'chip.dart';
|
||||
export 'fade_box.dart';
|
||||
export 'text.dart';
|
||||
export 'connection_item.dart';
|
||||
export 'back_scope.dart';
|
||||
export 'builder.dart';
|
||||
export 'setting.dart';
|
||||
export 'card.dart';
|
||||
export 'chip.dart';
|
||||
export 'color_scheme_box.dart';
|
||||
export 'connection_item.dart';
|
||||
export 'disabled_mask.dart';
|
||||
export 'fade_box.dart';
|
||||
export 'float_layout.dart';
|
||||
export 'grid.dart';
|
||||
export 'icon.dart';
|
||||
export 'input.dart';
|
||||
export 'keep_scope.dart';
|
||||
export 'back_scope.dart';
|
||||
export 'icon.dart';
|
||||
export 'line_chart.dart';
|
||||
export 'list.dart';
|
||||
export 'null_status.dart';
|
||||
export 'open_container.dart';
|
||||
export 'popup_menu.dart';
|
||||
export 'scaffold.dart';
|
||||
export 'setting.dart';
|
||||
export 'sheet.dart';
|
||||
export 'side_sheet.dart';
|
||||
export 'subscription_info_view.dart';
|
||||
export 'text.dart';
|
||||
|
||||
Reference in New Issue
Block a user