Skip to content

Commit 1478a2b

Browse files
committed
💄 调整UI
1 parent 5c68bfc commit 1478a2b

16 files changed

+375
-343
lines changed

lib/pages/app/bmf_page.dart

Lines changed: 14 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ import 'dart:async';
33

44
// Package imports:
55
import 'package:fluent_ui/fluent_ui.dart';
6-
import 'package:flutter_screenutil/flutter_screenutil.dart';
76

87
// Project imports:
98
import '../../database/app/app_bmf.dart';
109
import '../../database/app/app_rss.dart';
1110
import '../../models/database/app_bmf_model.dart';
11+
import '../../ui/bt_icon.dart';
1212
import '../../ui/bt_infobar.dart';
1313
import '../../widgets/bangumi/subject_detail/bsd_bmf.dart';
1414

@@ -46,12 +46,6 @@ class _BmfPageState extends State<BmfPage> with AutomaticKeepAliveClientMixin {
4646
});
4747
}
4848

49-
/// 销毁
50-
@override
51-
void dispose() {
52-
super.dispose();
53-
}
54-
5549
/// 前置检查,删除未使用的rss
5650
Future<void> preCheck() async {
5751
var read = await sqlite.readAll();
@@ -76,46 +70,36 @@ class _BmfPageState extends State<BmfPage> with AutomaticKeepAliveClientMixin {
7670
setState(() {});
7771
bmfList = await sqlite.readAll();
7872
setState(() {});
73+
if (mounted) await BtInfobar.success(context, '成功加载BMF配置');
7974
}
8075

8176
/// 构建头部
82-
Widget buildHeader(BuildContext context) {
83-
return Row(
84-
children: [
85-
Image.asset('assets/images/logo.png', height: 28, width: 28),
86-
SizedBox(width: 4),
87-
Text('BMF配置', style: FluentTheme.of(context).typography.title),
88-
const Spacer(),
89-
IconButton(
90-
icon: const Icon(FluentIcons.refresh),
91-
onPressed: () async {
92-
await init();
93-
if (context.mounted) await BtInfobar.success(context, '刷新成功');
94-
},
95-
),
96-
],
97-
);
77+
Widget buildHeader() {
78+
return Row(children: [
79+
Image.asset('assets/images/logo.png', height: 28, width: 28),
80+
SizedBox(width: 4),
81+
Text('BMF配置', style: FluentTheme.of(context).typography.title),
82+
SizedBox(width: 8),
83+
IconButton(icon: BtIcon(FluentIcons.refresh), onPressed: init),
84+
]);
9885
}
9986

10087
/// 构建函数
10188
@override
10289
Widget build(BuildContext context) {
10390
super.build(context);
104-
return ScaffoldPage(
91+
return ScaffoldPage.withPadding(
10592
padding: EdgeInsets.zero,
106-
header: Padding(
107-
padding: EdgeInsets.symmetric(horizontal: 8.w, vertical: 8.h),
108-
child: buildHeader(context),
109-
),
93+
header: Padding(padding: EdgeInsets.all(8), child: buildHeader()),
11094
content: ListView.separated(
11195
itemBuilder: (_, i) => BsdBmfWidget(
11296
bmfList[i].subject,
11397
bmfList[i].title ?? '',
11498
isConfig: true,
11599
),
116-
separatorBuilder: (_, __) => SizedBox(height: 8.h),
100+
separatorBuilder: (_, __) => SizedBox(height: 8),
117101
itemCount: bmfList.length,
118-
padding: EdgeInsets.symmetric(horizontal: 8.w, vertical: 8.h),
102+
padding: EdgeInsets.all(8),
119103
),
120104
);
121105
}

lib/pages/app/setting_page.dart

Lines changed: 19 additions & 206 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,13 @@
1-
// Flutter imports:
2-
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'
3-
as mdi;
4-
51
// Package imports:
6-
import 'package:device_info_plus/device_info_plus.dart';
72
import 'package:fluent_ui/fluent_ui.dart';
83
import 'package:flutter_riverpod/flutter_riverpod.dart';
94
import 'package:flutter_screenutil/flutter_screenutil.dart';
105
import 'package:package_info_plus/package_info_plus.dart';
11-
import 'package:url_launcher/url_launcher_string.dart';
126

137
// Project imports:
14-
import '../../store/app_store.dart';
15-
import '../../tools/log_tool.dart';
16-
import '../../ui/bt_icon.dart';
17-
import '../../utils/get_theme_label.dart';
18-
import '../../widgets/config/app_config_bgm.dart';
8+
import '../../widgets/app/config/app_config_bgm.dart';
9+
import '../../widgets/app/config/app_config_device.dart';
10+
import '../../widgets/app/config/app_config_info.dart';
1911

2012
/// 设置页面
2113
class SettingPage extends ConsumerStatefulWidget {
@@ -32,15 +24,6 @@ class _SettingPageState extends ConsumerState<SettingPage>
3224
/// 应用信息
3325
PackageInfo? packageInfo;
3426

35-
/// 设备信息
36-
WindowsDeviceInfo? deviceInfo;
37-
38-
/// 当前主题
39-
ThemeMode get curThemeMode => ref.watch(appStoreProvider).themeMode;
40-
41-
/// 当前主题色
42-
AccentColor get curAccentColor => ref.watch(appStoreProvider).accentColor;
43-
4427
/// 保存状态
4528
@override
4629
bool get wantKeepAlive => false;
@@ -51,125 +34,10 @@ class _SettingPageState extends ConsumerState<SettingPage>
5134
super.initState();
5235
Future.microtask(() async {
5336
packageInfo = await PackageInfo.fromPlatform();
54-
deviceInfo = await DeviceInfoPlugin().windowsInfo;
5537
setState(() {});
5638
});
5739
}
5840

59-
/// 构建 Windows 设备信息
60-
Widget buildWinDeviceInfo(WindowsDeviceInfo diw) {
61-
return Expander(
62-
leading: Icon(mdi.MdiIcons.laptopAccount),
63-
header: Text(diw.productName),
64-
content: Column(
65-
children: [
66-
ListTile(
67-
leading: Icon(mdi.MdiIcons.laptop),
68-
title: const Text('所在平台'),
69-
subtitle: Text(
70-
'Windows ${diw.displayVersion} '
71-
'${diw.majorVersion}.${diw.minorVersion}.${diw.buildNumber}'
72-
'(${diw.buildLab})',
73-
),
74-
),
75-
ListTile(
76-
leading: Icon(mdi.MdiIcons.devices),
77-
title: const Text('设备'),
78-
subtitle: Text('${diw.computerName} ${diw.productId}'),
79-
),
80-
ListTile(
81-
leading: Icon(mdi.MdiIcons.identifier),
82-
title: const Text('标识符'),
83-
subtitle: Text(
84-
diw.deviceId.substring(1, diw.deviceId.length - 1),
85-
),
86-
),
87-
],
88-
),
89-
);
90-
}
91-
92-
/// 设备信息项
93-
Widget buildDeviceInfo() {
94-
if (deviceInfo != null) return buildWinDeviceInfo(deviceInfo!);
95-
return const ListTile(title: Text('设备信息'), subtitle: Text('未知设备'));
96-
}
97-
98-
/// 构建主题项Flyout
99-
MenuFlyoutItem buildThemeFlyout(ThemeModeConfig theme) {
100-
return MenuFlyoutItem(
101-
text: Text(theme.label),
102-
leading: Icon(theme.icon),
103-
onPressed: () async {
104-
await ref.read(appStoreProvider.notifier).setThemeMode(theme.cur);
105-
},
106-
selected: curThemeMode == theme.cur,
107-
trailing:
108-
curThemeMode == theme.cur ? BtIcon(FluentIcons.check_mark) : null,
109-
);
110-
}
111-
112-
/// 构建主题切换
113-
Widget buildThemeSwitch() {
114-
var themes = getThemeModeConfigList();
115-
var curTheme = getThemeModeConfig(curThemeMode);
116-
return ListTile(
117-
leading: Icon(curTheme.icon),
118-
title: const Text('主题模式'),
119-
subtitle: Text(curTheme.label),
120-
trailing: DropDownButton(
121-
title: Text(curTheme.label),
122-
items: themes.map(buildThemeFlyout).toList(),
123-
),
124-
);
125-
}
126-
127-
/// 构建主题色切换展开
128-
Widget buildColorFlyout(AccentColor color) {
129-
return Button(
130-
autofocus: curAccentColor == color,
131-
style: ButtonStyle(padding: WidgetStatePropertyAll(EdgeInsets.zero)),
132-
onPressed: () async {
133-
await ref.read(appStoreProvider.notifier).setAccentColor(color);
134-
if (mounted) Navigator.of(context).pop();
135-
},
136-
child: SizedBox(
137-
width: 32.spMax,
138-
height: 32.spMax,
139-
child: ColoredBox(color: color),
140-
),
141-
);
142-
}
143-
144-
/// 构建主题色切换
145-
Widget buildColorSwitch() {
146-
return ListTile(
147-
leading: const Icon(FluentIcons.color),
148-
title: const Text('主题色'),
149-
subtitle: Text(
150-
curAccentColor.value.toRadixString(16),
151-
style: TextStyle(color: curAccentColor),
152-
),
153-
trailing: SplitButton(
154-
flyout: FlyoutContent(
155-
constraints: BoxConstraints(maxWidth: 200.w),
156-
child: curThemeMode == ThemeMode.system
157-
? const Text('跟随系统设置\r\n无法更改')
158-
: Wrap(
159-
runSpacing: 8.h,
160-
spacing: 8.w,
161-
children: Colors.accentColors.map(buildColorFlyout).toList(),
162-
),
163-
),
164-
child: SizedBox(
165-
width: 32.spMax,
166-
height: 32.spMax,
167-
child: ColoredBox(color: curAccentColor),
168-
),
169-
),
170-
);
171-
}
172-
17341
/// 构建应用徽章
17442
Widget buildAppBadge(BuildContext context) {
17543
var shadow = const Shadow(
@@ -178,24 +46,21 @@ class _SettingPageState extends ConsumerState<SettingPage>
17846
blurRadius: 2,
17947
);
18048
return Container(
181-
padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 16.h),
18249
decoration: BoxDecoration(
183-
borderRadius: BorderRadius.circular(10),
184-
color: curAccentColor,
50+
borderRadius: BorderRadius.circular(8),
51+
color: FluentTheme.of(context).accentColor,
18552
),
53+
padding: EdgeInsets.all(16),
18654
child: Column(
18755
mainAxisSize: MainAxisSize.min,
18856
crossAxisAlignment: CrossAxisAlignment.center,
18957
mainAxisAlignment: MainAxisAlignment.center,
19058
children: [
191-
HyperlinkButton(
192-
child: Image.asset('assets/images/logo.png', width: 100.w),
193-
onPressed: () {
194-
launchUrlString('https://github.com/BTMuli/BangumiToday');
195-
},
196-
),
59+
Image.asset('assets/images/logo.png', width: 100.w),
19760
Text(
198-
'BangumiToday',
61+
'BangumiToday '
62+
'${packageInfo?.version ?? '0.0.0'}'
63+
'+${packageInfo?.buildNumber ?? ''}',
19964
style: TextStyle(
20065
color: Colors.white,
20166
fontSize: 20,
@@ -204,12 +69,6 @@ class _SettingPageState extends ConsumerState<SettingPage>
20469
),
20570
),
20671
SizedBox(height: 8.h),
207-
Text(
208-
'Version: ${packageInfo?.version} '
209-
'Build: ${packageInfo?.buildNumber}',
210-
style: TextStyle(color: Colors.white, shadows: [shadow]),
211-
),
212-
SizedBox(height: 8.h),
21372
Text(
21473
'©2024 BTMuli<[email protected]>',
21574
style: TextStyle(color: Colors.white, shadows: [shadow]),
@@ -219,58 +78,11 @@ class _SettingPageState extends ConsumerState<SettingPage>
21978
);
22079
}
22180

222-
/// 构建应用信息
223-
Widget buildAppInfo() {
224-
return Column(
225-
crossAxisAlignment: CrossAxisAlignment.center,
226-
mainAxisAlignment: MainAxisAlignment.start,
227-
mainAxisSize: MainAxisSize.max,
228-
children: [
229-
buildAppBadge(context),
230-
SizedBox(height: 16.h),
231-
Row(
232-
mainAxisSize: MainAxisSize.max,
233-
crossAxisAlignment: CrossAxisAlignment.center,
234-
mainAxisAlignment: MainAxisAlignment.spaceBetween,
235-
children: [
236-
Tooltip(
237-
message: 'Github',
238-
child: Button(
239-
onPressed: () async {
240-
await launchUrlString(
241-
'https://github.com/BTMuli/BangumiToday');
242-
},
243-
child: BtIcon(mdi.MdiIcons.github),
244-
),
245-
),
246-
SizedBox(width: 16.w),
247-
Tooltip(
248-
message: '日志',
249-
child: Button(
250-
onPressed: BTLogTool().openLogDir,
251-
child: BtIcon(mdi.MdiIcons.faceAgent),
252-
),
253-
),
254-
],
255-
),
256-
],
257-
);
258-
}
259-
260-
/// 构建应用配置
261-
Widget buildAppConfig() {
262-
return Expander(
263-
leading: const Icon(FluentIcons.settings),
264-
header: const Text('应用配置'),
265-
content: Column(children: [buildThemeSwitch(), buildColorSwitch()]),
266-
);
267-
}
268-
26981
/// 构建配置项
27082
List<Widget> buildConfigList() {
27183
return [
272-
buildDeviceInfo(),
273-
buildAppConfig(),
84+
AppConfigInfoWidget(),
85+
AppConfigDeviceWidget(),
27486
AppConfigBgmWidget(),
27587
];
27688
}
@@ -281,19 +93,20 @@ class _SettingPageState extends ConsumerState<SettingPage>
28193
super.build(context);
28294
var configList = buildConfigList();
28395
return ScaffoldPage.withPadding(
284-
padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 16.h),
96+
padding: EdgeInsets.all(8),
28597
content: Row(
28698
crossAxisAlignment: CrossAxisAlignment.start,
28799
mainAxisAlignment: MainAxisAlignment.spaceBetween,
288100
children: [
289101
Flexible(
290102
child: ListView.separated(
291-
itemBuilder: (_, int idx) => configList[idx],
292-
separatorBuilder: (_, __) => SizedBox(height: 12.h),
293-
itemCount: configList.length),
103+
itemBuilder: (_, int idx) => configList[idx],
104+
separatorBuilder: (_, __) => const SizedBox(height: 8),
105+
itemCount: configList.length,
106+
),
294107
),
295-
SizedBox(width: 12.w),
296-
buildAppInfo(),
108+
const SizedBox(width: 12),
109+
buildAppBadge(context),
297110
],
298111
),
299112
);

0 commit comments

Comments
 (0)