This commit is contained in:
2026-03-07 17:24:59 +08:00
parent 4418ebecac
commit b0ec8ab4bd
417 changed files with 42546 additions and 2 deletions

View File

@@ -0,0 +1,371 @@
import 'package:easy_refresh/easy_refresh.dart';
import 'package:fluent_ui/fluent_ui.dart' as fluent;
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_dmzj/app/app_color.dart';
import 'package:flutter_dmzj/app/app_style.dart';
import 'package:flutter_dmzj/app/dialog_utils.dart';
import 'package:flutter_dmzj/app/platform_utils.dart';
import 'package:flutter_dmzj/modules/user/user_home_controller.dart';
import 'package:flutter_dmzj/services/comic_download_service.dart';
import 'package:flutter_dmzj/services/novel_download_service.dart';
import 'package:flutter_dmzj/services/user_service.dart';
import 'package:flutter_dmzj/widgets/user_photo.dart';
import 'package:get/get.dart';
import 'package:remixicon/remixicon.dart';
import 'package:url_launcher/url_launcher_string.dart';
class UserHomePage extends GetView<UserHomeController> {
const UserHomePage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
if (PlatformUtils.isWindows) {
return _buildWindowsLayout(context);
}
return _buildMobileLayout(context);
}
Widget _buildWindowsLayout(BuildContext context) {
final fluentTheme = fluent.FluentTheme.of(context);
return ColoredBox(
color: fluentTheme.micaBackgroundColor,
child: EasyRefresh(
header: const MaterialHeader(),
onRefresh: UserService.instance.refreshProfile,
child: _buildListContent(context),
),
);
}
Widget _buildMobileLayout(BuildContext context) {
return Scaffold(
body: AnnotatedRegion<SystemUiOverlayStyle>(
value: Get.isDarkMode
? SystemUiOverlayStyle.light.copyWith(
systemNavigationBarColor: Colors.transparent,
)
: SystemUiOverlayStyle.dark.copyWith(
systemNavigationBarColor: Colors.transparent,
),
child: SafeArea(
child: EasyRefresh(
header: const MaterialHeader(),
onRefresh: UserService.instance.refreshProfile,
child: _buildListContent(context),
),
),
),
);
}
Widget _buildListContent(BuildContext context) {
return ListView(
padding: AppStyle.edgeInsetsA4,
children: [
AppStyle.vGap12,
// 用户名、头像
Obx(
() => Visibility(
visible: UserService.instance.logined.value,
child: ListTile(
leading: UserPhoto(
url: UserService.instance.userProfile.value?.cover,
size: 48,
),
title: Text.rich(
TextSpan(
text: UserService
.instance.userProfile.value?.nickname ??
UserService.instance.nickname,
children: [
WidgetSpan(
alignment: PlaceholderAlignment.middle,
child: Visibility(
visible: (UserService.instance.userProfile.value
?.userfeeinfo?.isVip ??
false),
child: Padding(
padding: AppStyle.edgeInsetsL4,
child: Image.asset(
"assets/images/vip.png",
height: 16,
),
),
),
),
],
),
),
subtitle: Text(
UserService.instance.isVip
? UserService.instance.vipInfo
: UserService.instance.sign,
style: Get.textTheme.bodySmall,
),
trailing: IconButton(
onPressed: controller.logout,
icon: const Icon(Remix.logout_box_r_line),
),
),
),
),
Obx(
() => Visibility(
visible: !UserService.instance.logined.value,
child: ListTile(
leading: const UserPhoto(
url: "",
size: 48,
),
title: const Text(
"未登录",
style: TextStyle(height: 1.0),
),
subtitle: const Text(
"点击前往登录",
),
trailing: Icon(
Icons.chevron_right,
color: Theme.of(context).iconTheme.color?.withOpacity(0.5),
),
onTap: controller.login,
),
),
),
Obx(
() => _buildCard(
context,
children: [
Visibility(
visible: UserService.instance.logined.value,
child: ListTile(
leading: const Icon(Remix.heart_line),
title: const Text("我的订阅"),
trailing: Icon(
Icons.chevron_right,
color: Theme.of(context).iconTheme.color?.withOpacity(0.5),
),
onTap: controller.toUserSubscribe,
),
),
// Visibility(
// visible: UserService.instance.logined.value,
// child: ListTile(
// leading: const Icon(Remix.history_line),
// title: const Text("浏览记录"),
// trailing: const Icon(
// Icons.chevron_right,
// color: Colors.grey,
// ),
// onTap: controller.toUserHistory,
// ),
// ),
// Visibility(
// visible: UserService.instance.logined.value,
// child: ListTile(
// leading: const Icon(Remix.chat_smile_2_line),
// title: const Text("我的评论"),
// trailing: const Icon(
// Icons.chevron_right,
// color: Colors.grey,
// ),
// onTap: controller.userComment,
// ),
// ),
],
),
),
_buildCard(
context,
children: [
ListTile(
leading: const Icon(Remix.file_history_line),
title: const Text("本机记录"),
trailing: Icon(
Icons.chevron_right,
color: Theme.of(context).iconTheme.color?.withOpacity(0.5),
),
onTap: controller.toLocalHistory,
),
ListTile(
leading: const Icon(Remix.star_line),
title: const Text("本机收藏"),
trailing: Icon(
Icons.chevron_right,
color: Theme.of(context).iconTheme.color?.withOpacity(0.5),
),
onTap: controller.toFavorite,
),
ListTile(
leading: const Icon(Remix.download_line),
title: const Text("漫画下载"),
trailing: Row(
mainAxisSize: MainAxisSize.min,
children: [
Obx(
() => Visibility(
visible: ComicDownloadService
.instance.taskQueues.isNotEmpty,
child: Container(
decoration: BoxDecoration(
color: Colors.red,
borderRadius: AppStyle.radius24,
),
width: 20,
height: 20,
child: Center(
child: Text(
"${ComicDownloadService.instance.taskQueues.length}",
style: const TextStyle(
fontSize: 10,
color: Colors.white,
),
),
),
),
),
),
Icon(
Icons.chevron_right,
color: Theme.of(context).iconTheme.color?.withOpacity(0.5),
),
],
),
onTap: controller.comicDownload,
),
ListTile(
leading: const Icon(Remix.download_line),
title: const Text("小说下载"),
trailing: Row(
mainAxisSize: MainAxisSize.min,
children: [
Obx(
() => Visibility(
visible: NovelDownloadService
.instance.taskQueues.isNotEmpty,
child: Container(
decoration: BoxDecoration(
color: Colors.red,
borderRadius: AppStyle.radius24,
),
width: 20,
height: 20,
child: Center(
child: Text(
"${NovelDownloadService.instance.taskQueues.length}",
style: const TextStyle(
fontSize: 10,
color: Colors.white,
),
),
),
),
),
),
Icon(
Icons.chevron_right,
color: Theme.of(context).iconTheme.color?.withOpacity(0.5),
),
],
),
onTap: controller.novelDownload,
),
],
),
_buildCard(
context,
children: [
ListTile(
leading: Icon(
Get.isDarkMode ? Remix.moon_line : Remix.sun_line),
title: const Text("显示主题"),
trailing: Icon(
Icons.chevron_right,
color: Theme.of(context).iconTheme.color?.withOpacity(0.5),
),
onTap: controller.setTheme,
),
ListTile(
leading: const Icon(Remix.settings_line),
title: const Text("更多设置"),
trailing: Icon(
Icons.chevron_right,
color: Theme.of(context).iconTheme.color?.withOpacity(0.5),
),
onTap: controller.toSettings,
),
],
),
_buildCard(
context,
children: [
ListTile(
leading: const Icon(Remix.error_warning_line),
title: const Text("免责声明"),
trailing: Icon(
Icons.chevron_right,
color: Theme.of(context).iconTheme.color?.withOpacity(0.5),
),
onTap: DialogUtils.showStatement,
),
// ListTile(
// leading: const Icon(Remix.github_fill),
// title: const Text("开源主页"),
// trailing: const Icon(
// Icons.chevron_right,
// color: Colors.grey,
// ),
// onTap: () {
// launchUrlString(
// "https://github.com/xiaoyaocz/flutter_dmzj",
// mode: LaunchMode.externalApplication,
// );
// },
// ),
// ListTile(
// leading: const Icon(Remix.upload_2_line),
// title: const Text("检查更新"),
// trailing: const Icon(
// Icons.chevron_right,
// color: Colors.grey,
// ),
// onTap: controller.checkUpdate,
// ),
ListTile(
leading: const Icon(Remix.information_line),
title: const Text("关于APP"),
trailing: Icon(
Icons.chevron_right,
color: Theme.of(context).iconTheme.color?.withOpacity(0.5),
),
onTap: controller.about,
),
],
),
],
);
}
Widget _buildCard(BuildContext context, {required List<Widget> children}) {
return Container(
margin: AppStyle.edgeInsetsH12.copyWith(top: 12),
child: Material(
color: Theme.of(context).cardColor,
borderRadius: AppStyle.radius8,
child: Theme(
data: Theme.of(context).copyWith(
listTileTheme: ListTileThemeData(
shape: RoundedRectangleBorder(borderRadius: AppStyle.radius8),
),
),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: children,
),
),
),
);
}
}