Skip to content

Commit 1a43f8f

Browse files
authored
Extract fl_lib to avoid bloating (#77)
* Extract fl_lib to avoid unused
1 parent d08dd52 commit 1a43f8f

40 files changed

Lines changed: 1482 additions & 982 deletions

lib/app.dart

Lines changed: 34 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import 'dart:async';
22

3-
import 'package:fl_lib/fl_lib.dart' as fl;
4-
import 'package:fl_lib/fl_lib.dart' show ChineseThemeData;
53
import 'package:flutter/material.dart';
64
import 'package:provider/provider.dart';
75
import 'package:window_manager/window_manager.dart';
6+
87
import 'constants/app_branding.dart';
98
import 'generated/l10n/l10n.dart';
9+
import 'kit/kit.dart' as kit;
10+
import 'kit/kit.dart' show ChineseThemeData;
1011
import 'models/aria2_instance.dart';
1112
import 'models/settings.dart';
1213
import 'pages/download_page/download_page.dart';
@@ -53,14 +54,30 @@ class _ThemeProviderState extends State<_ThemeProvider> {
5354

5455
@override
5556
Widget build(BuildContext context) {
56-
final display = context.select<Settings, ({Locale? locale, bool hideTitleBar, Color primaryColor, ThemeMode themeMode})>((s) => (locale: s.locale, hideTitleBar: s.hideTitleBar, primaryColor: s.primaryColor, themeMode: s.themeMode));
57+
final display = context
58+
.select<
59+
Settings,
60+
({
61+
Locale? locale,
62+
bool hideTitleBar,
63+
Color primaryColor,
64+
ThemeMode themeMode,
65+
})
66+
>(
67+
(s) => (
68+
locale: s.locale,
69+
hideTitleBar: s.hideTitleBar,
70+
primaryColor: s.primaryColor,
71+
themeMode: s.themeMode,
72+
),
73+
);
5774

5875
return MaterialApp(
5976
title: kAppName,
6077
locale: display.locale,
6178
localizationsDelegates: AppLocalizations.localizationsDelegates,
6279
supportedLocales: AppLocalizations.supportedLocales,
63-
builder: (context, child) => fl.VirtualWindowFrame(
80+
builder: (context, child) => kit.VirtualWindowFrame(
6481
title: kAppName,
6582
showCaption: display.hideTitleBar,
6683
child: ClipRect(child: child ?? const SizedBox.shrink()),
@@ -203,7 +220,7 @@ class _HomeWrapperState extends State<_HomeWrapper> with Loggable {
203220
@override
204221
Widget build(BuildContext context) {
205222
if (!_isInitialized) {
206-
return Scaffold(body: Center(child: fl.SizedLoading.medium));
223+
return Scaffold(body: Center(child: kit.SizedLoading.medium));
207224
}
208225
return const MainWindow();
209226
}
@@ -552,8 +569,7 @@ class _MainWindowState extends State<MainWindow> with WindowListener, Loggable {
552569
connectedCount == 0
553570
? l10n.notConnected
554571
: '${l10n.connected}: $connectedCount',
555-
if (settings.showTraySpeed)
556-
l10n.totalSpeed(formatSpeed(summary.speed)),
572+
if (settings.showTraySpeed) l10n.totalSpeed(formatSpeed(summary.speed)),
557573
l10n.activeTasks(summary.active.toString()),
558574
l10n.waitingTasks(summary.waiting.toString()),
559575
];
@@ -902,7 +918,7 @@ class _MainWindowState extends State<MainWindow> with WindowListener, Loggable {
902918
}
903919

904920
({int active, int waiting, int resumable, int pausable, int speed})
905-
_computeTaskSummary(List<DownloadTask> tasks) {
921+
_computeTaskSummary(List<DownloadTask> tasks) {
906922
var active = 0;
907923
var waiting = 0;
908924
var resumable = 0;
@@ -940,9 +956,13 @@ class _StatusBar extends StatelessWidget {
940956
Widget build(BuildContext context) {
941957
final l10n = AppLocalizations.of(context)!;
942958
final colorScheme = Theme.of(context).colorScheme;
943-
final summary = context.select<DownloadDataService, ({int active, int waiting, int resumable, int pausable, int speed})>((service) {
944-
return _computeTaskSummary(service.tasks);
945-
});
959+
final summary = context
960+
.select<
961+
DownloadDataService,
962+
({int active, int waiting, int resumable, int pausable, int speed})
963+
>((service) {
964+
return _computeTaskSummary(service.tasks);
965+
});
946966

947967
return Container(
948968
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
@@ -967,28 +987,19 @@ class _StatusBar extends StatelessWidget {
967987
label: Text(l10n.totalSpeed(formatSpeed(summary.speed))),
968988
avatar: const Icon(Icons.speed, size: 16),
969989
backgroundColor: colorScheme.surfaceContainerHighest,
970-
padding: const EdgeInsets.symmetric(
971-
horizontal: 8,
972-
vertical: 6,
973-
),
990+
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 6),
974991
),
975992
Chip(
976993
label: Text(l10n.activeTasks(summary.active.toString())),
977994
avatar: const Icon(Icons.task_alt, size: 16),
978995
backgroundColor: colorScheme.surfaceContainerHighest,
979-
padding: const EdgeInsets.symmetric(
980-
horizontal: 8,
981-
vertical: 6,
982-
),
996+
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 6),
983997
),
984998
Chip(
985999
label: Text(l10n.waitingTasks(summary.waiting.toString())),
9861000
avatar: const Icon(Icons.pending, size: 16),
9871001
backgroundColor: colorScheme.surfaceContainerHighest,
988-
padding: const EdgeInsets.symmetric(
989-
horizontal: 8,
990-
vertical: 6,
991-
),
1002+
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 6),
9921003
),
9931004
],
9941005
),

lib/kit/core/build.dart

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
enum BuildMode {
2+
release,
3+
debug,
4+
profile;
5+
6+
static final isDebug = _buildMode == BuildMode.debug;
7+
static final isProfile = _buildMode == BuildMode.profile;
8+
static final isRelease = _buildMode == BuildMode.release;
9+
}
10+
11+
final _buildMode = () {
12+
if (const bool.fromEnvironment('dart.vm.product')) {
13+
return BuildMode.release;
14+
}
15+
var result = BuildMode.profile;
16+
assert(() {
17+
result = BuildMode.debug;
18+
return true;
19+
}());
20+
return result;
21+
}();

lib/kit/core/ext/datetime.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
extension DateTimeX on DateTime {
2+
String get hourMinute {
3+
return '${hour.toString().padLeft(2, '0')}:${minute.toString().padLeft(2, '0')}';
4+
}
5+
6+
static int get timestamp => DateTime.now().millisecondsSinceEpoch;
7+
}

lib/kit/core/ext/obj.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import '../rnode.dart';
2+
3+
extension ObjectX<T extends Object> on T {
4+
VNode<T> get vn => VNode<T>(this);
5+
}
6+
7+
extension ObjectXNullable<T extends Object> on T? {
8+
A? nullOr<A>(A Function(T) f) => this != null ? f(this!) : null;
9+
10+
VNode<T?> get vn => VNode<T?>(this);
11+
}
12+
13+
VNode<T?> nvn<T>() => VNode<T?>(null);

lib/kit/core/ext/string.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import 'package:url_launcher/url_launcher_string.dart';
2+
3+
extension StringX on String {
4+
Future<bool> launchUrl() async {
5+
return await launchUrlString(this);
6+
}
7+
}

lib/kit/core/ext/widget.dart

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import 'package:flutter/material.dart';
2+
3+
extension WidgetX on Widget {
4+
Widget paddingAll(double value) =>
5+
Padding(padding: EdgeInsets.all(value), child: this);
6+
7+
Widget paddingOnly({
8+
double left = 0,
9+
double top = 0,
10+
double right = 0,
11+
double bottom = 0,
12+
}) => Padding(
13+
padding: EdgeInsets.only(
14+
left: left,
15+
top: top,
16+
right: right,
17+
bottom: bottom,
18+
),
19+
child: this,
20+
);
21+
}

lib/kit/core/func.dart

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import 'dart:async';
2+
3+
abstract final class Fns {
4+
static const _defaultDurationTime = 377;
5+
static const _defaultThrottleId = 'default';
6+
static final startTimeMap = <String, int>{_defaultThrottleId: 0};
7+
8+
static FutureOr<T?> throttle<T>(
9+
FutureOr<T> Function() func, {
10+
String id = _defaultThrottleId,
11+
int duration = _defaultDurationTime,
12+
void Function()? continueClick,
13+
}) async {
14+
final currentTime = DateTime.now().millisecondsSinceEpoch;
15+
if (currentTime - (startTimeMap[id] ?? 0) > duration) {
16+
startTimeMap[id] = DateTime.now().millisecondsSinceEpoch;
17+
return await func();
18+
} else {
19+
continueClick?.call();
20+
return null;
21+
}
22+
}
23+
}

lib/kit/core/logger.dart

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import 'dart:io';
2+
3+
import 'package:logging/logging.dart';
4+
5+
import 'build.dart';
6+
7+
abstract final class Loggers {
8+
static final root = Logger('Root');
9+
static final store = Logger('Store');
10+
static final route = Logger('Route');
11+
static final app = Logger('App');
12+
13+
static final sourceReg = RegExp(r'\((.+):(\d+):(\d+)\)');
14+
15+
static void log(Object message, {int skipFrames = 1}) {
16+
final traceLines = StackTrace.current.toString().split('\n');
17+
18+
if (traceLines.length > skipFrames) {
19+
final caller = traceLines[skipFrames];
20+
final match = sourceReg.firstMatch(caller);
21+
if (match != null) {
22+
String? file = match.group(1)?.replaceFirst('file://', '');
23+
final line = match.group(2);
24+
if (file != null) {
25+
final pwd = Directory.current.path;
26+
if (file.startsWith(pwd)) {
27+
file = file.substring(pwd.length + 1);
28+
file = './$file';
29+
}
30+
}
31+
print('[$file:$line] $message');
32+
return;
33+
}
34+
}
35+
print(message);
36+
}
37+
}
38+
39+
void dprint(Object? msg, [Object? msg2, Object? msg3, Object? msg4]) {
40+
if (!BuildMode.isDebug) return;
41+
lprint(msg, msg2, msg3, msg4, 3);
42+
}
43+
44+
void lprint(
45+
Object? msg, [
46+
Object? msg2,
47+
Object? msg3,
48+
Object? msg4,
49+
int skipFrames = 2,
50+
]) {
51+
final sb = StringBuffer();
52+
sb.write(msg.toString());
53+
54+
if (msg2 != null) {
55+
sb.write('\n$msg2');
56+
if (msg3 != null) {
57+
sb.write('\n$msg3');
58+
if (msg4 != null) {
59+
sb.write('\n$msg4');
60+
}
61+
}
62+
}
63+
final str = sb.toString();
64+
Loggers.log(str, skipFrames: skipFrames);
65+
}

lib/kit/core/platform.dart

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import 'dart:io';
2+
3+
import 'package:flutter/foundation.dart';
4+
5+
enum Pfs {
6+
android,
7+
ios,
8+
linux,
9+
macos,
10+
windows,
11+
web,
12+
fuchsia,
13+
unknown;
14+
15+
static final type = () {
16+
if (kIsWeb) return web;
17+
return switch (Platform.operatingSystem) {
18+
'android' => android,
19+
'ios' => ios,
20+
'linux' => linux,
21+
'macos' => macos,
22+
'windows' => windows,
23+
'fuchsia' => fuchsia,
24+
_ => unknown,
25+
};
26+
}();
27+
28+
static final String separator = isWindows ? '\\' : '/';
29+
30+
static final String? homeDir = () {
31+
final envVars = Platform.environment;
32+
if (isMacOS || isLinux) {
33+
return envVars['HOME'];
34+
} else if (isWindows) {
35+
return envVars['UserProfile'];
36+
}
37+
return null;
38+
}();
39+
}
40+
41+
final isAndroid = Pfs.type == Pfs.android;
42+
final isIOS = Pfs.type == Pfs.ios;
43+
final isLinux = Pfs.type == Pfs.linux;
44+
final isMacOS = Pfs.type == Pfs.macos;
45+
final isWindows = Pfs.type == Pfs.windows;
46+
final isWeb = Pfs.type == Pfs.web;
47+
final isMobile = Pfs.type == Pfs.ios || Pfs.type == Pfs.android;
48+
final isDesktop =
49+
Pfs.type == Pfs.linux || Pfs.type == Pfs.macos || Pfs.type == Pfs.windows;

0 commit comments

Comments
 (0)