logo和名称替换

This commit is contained in:
谢宇宁
2026-10-14 11:23:36 +07:00
parent 1cb514cd02
commit c5c04a7967
478 changed files with 8990 additions and 4948 deletions
@@ -1,9 +1,9 @@
import 'package:flutter/material.dart';
import 'package:hgmj/hj_model/cartoon_media_info.dart';
import 'package:hgmj/hj_page/find/rank_module/rank_badge.dart';
import 'package:hgmj/hj_utils/screen.dart';
import 'package:hgmj/routers/jump_router.dart';
import 'package:hgmj/tools_base/widget/net_image_widget.dart';
import 'package:wydj/hj_model/cartoon_media_info.dart';
import 'package:wydj/hj_page/find/rank_module/rank_badge.dart';
import 'package:wydj/hj_utils/screen.dart';
import 'package:wydj/routers/jump_router.dart';
import 'package:wydj/tools_base/widget/net_image_widget.dart';
//动漫/漫画排行榜item
class ACGRankItem extends StatelessWidget {
@@ -69,6 +69,7 @@ class ACGRankItem extends StatelessWidget {
}
//连载中金色,已完结半透明白
Color get _statusColor =>
movie?.updateStatus == 1 ? const Color(0xffFFC000) : Colors.white.withValues(alpha: .45);
Color get _statusColor => movie?.updateStatus == 1
? const Color(0xffFFC000)
: Colors.white.withValues(alpha: .45);
}
@@ -1,12 +1,12 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:hgmj/assets_tool/images.dart';
import 'package:hgmj/extension/extensions.dart';
import 'package:hgmj/hj_model/video_model.dart';
import 'package:hgmj/hj_page/find/pic_collect/pics_detail_page.dart';
import 'package:hgmj/hj_page/find/rank_module/rank_badge.dart';
import 'package:hgmj/hj_utils/screen.dart';
import 'package:hgmj/tools_base/widget/net_image_widget.dart';
import 'package:wydj/assets_tool/images.dart';
import 'package:wydj/extension/extensions.dart';
import 'package:wydj/hj_model/video_model.dart';
import 'package:wydj/hj_page/find/pic_collect/pics_detail_page.dart';
import 'package:wydj/hj_page/find/rank_module/rank_badge.dart';
import 'package:wydj/hj_utils/screen.dart';
import 'package:wydj/tools_base/widget/net_image_widget.dart';
//图集排行榜item
class ImageRankItem extends StatelessWidget {
@@ -19,7 +19,8 @@ class ImageRankItem extends StatelessWidget {
Widget build(BuildContext context) {
return InkWell(
enableFeedback: false,
onTap: () => Get.to(PicsDetailPage(id: movie?.id), preventDuplicates: false),
onTap: () =>
Get.to(PicsDetailPage(id: movie?.id), preventDuplicates: false),
child: SizedBox(
height: 108,
child: Row(
@@ -54,18 +55,21 @@ class ImageRankItem extends StatelessWidget {
//浏览量 + 收藏量
Row(
children: [
Image.asset("eye_grey.webp".commonImgPath, width: 14, height: 14),
Image.asset("eye_grey.webp".commonImgPath,
width: 14, height: 14),
5.sizeBoxW,
Text(
movie?.playCount?.countStr ?? "0",
style: const TextStyle(color: Color(0xff989898), fontSize: 12),
style: const TextStyle(
color: Color(0xff989898), fontSize: 12),
),
8.sizeBoxW,
Image.asset("collect_start.webp".homePath, width: 14),
5.sizeBoxW,
Text(
movie?.collectCount?.countStr ?? "0",
style: const TextStyle(color: Color(0xff989898), fontSize: 12),
style: const TextStyle(
color: Color(0xff989898), fontSize: 12),
),
],
),
+2 -2
View File
@@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import 'package:hgmj/assets_tool/images.dart';
import 'package:hgmj/hj_utils/screen.dart';
import 'package:wydj/assets_tool/images.dart';
import 'package:wydj/hj_utils/screen.dart';
/// 榜单名次徽标「皇冠 + NO.1」:影视 / 图集 / 动漫 / 帖子四种 item 共用,改样式只改这一处
Widget rankBadge(int index) {
@@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:hgmj/hj_utils/const.dart';
import 'package:wydj/hj_utils/const.dart';
class RankMainLogic extends GetxController with GetTickerProviderStateMixin {
RankMainLogic({int initIndex = 0}) : _initIndex = initIndex;
@@ -10,7 +10,8 @@ class RankMainLogic extends GetxController with GetTickerProviderStateMixin {
//榜单类型,顺序即 tab 顺序
static const tabs = [MediaStyle.Video, MediaStyle.Community, MediaStyle.Pic];
late final TabController tabCtr = TabController(initialIndex: _initIndex, length: tabs.length, vsync: this);
late final TabController tabCtr =
TabController(initialIndex: _initIndex, length: tabs.length, vsync: this);
@override
void onClose() {
@@ -1,10 +1,10 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:hgmj/hj_page/find/rank_module/rank_type_tab_view.dart';
import 'package:hgmj/hj_utils/const.dart';
import 'package:hgmj/tools_base/indicator/custom_tab_indicator.dart';
import 'package:hgmj/tools_base/unique_tag_mixin.dart';
import 'package:hgmj/tools_base/widget/keep_alive_widget.dart';
import 'package:wydj/hj_page/find/rank_module/rank_type_tab_view.dart';
import 'package:wydj/hj_utils/const.dart';
import 'package:wydj/tools_base/indicator/custom_tab_indicator.dart';
import 'package:wydj/tools_base/unique_tag_mixin.dart';
import 'package:wydj/tools_base/widget/keep_alive_widget.dart';
import 'rank_main_logic.dart';
@@ -37,13 +37,17 @@ class _RankMainPageState extends State<RankMainPage> with UniqueTagMixin {
controller: logic.tabCtr,
padding: const EdgeInsets.symmetric(horizontal: 30),
tabs: RankMainLogic.tabs
.map((e) => Padding(padding: const EdgeInsets.only(bottom: 5), child: Text(e.rankTitle)))
.map((e) => Padding(
padding: const EdgeInsets.only(bottom: 5),
child: Text(e.rankTitle)))
.toList(),
labelPadding: const EdgeInsets.symmetric(horizontal: 3),
unselectedLabelColor: const Color(0x8CFFFFFF),
unselectedLabelStyle: const TextStyle(fontSize: 14, fontWeight: FontWeight.w400),
unselectedLabelStyle:
const TextStyle(fontSize: 14, fontWeight: FontWeight.w400),
labelColor: const Color(0xE5FFFFFF),
labelStyle: const TextStyle(fontSize: 14, fontWeight: FontWeight.w500),
labelStyle:
const TextStyle(fontSize: 14, fontWeight: FontWeight.w500),
indicator: CustomIndicator(
height: 3,
width: 13,
@@ -57,7 +61,9 @@ class _RankMainPageState extends State<RankMainPage> with UniqueTagMixin {
Expanded(
child: TabBarView(
controller: logic.tabCtr,
children: RankMainLogic.tabs.map((e) => RankTypeTabView(e).keepAlive).toList(),
children: RankMainLogic.tabs
.map((e) => RankTypeTabView(e).keepAlive)
.toList(),
),
),
],
@@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'package:hgmj/hj_utils/screen.dart';
import 'package:wydj/hj_utils/screen.dart';
/// 榜单周期 Tab:周榜 / 月榜 / 年榜 / 总榜,项间用一条竖线分隔、无下划线指示器。
/// 不用自己监听 controller 重绘——TabBar 内部就挂着 animation 监听
@@ -19,7 +19,8 @@ class RankSortTabBar extends StatelessWidget {
.map((e) => Row(
children: [
Container(
padding: const EdgeInsets.symmetric(horizontal: 18, vertical: 3),
padding:
const EdgeInsets.symmetric(horizontal: 18, vertical: 3),
child: Text(e.value),
),
if (e.key != titles.length - 1) 12.lineV,
@@ -1,7 +1,7 @@
import 'package:hgmj/hj_utils/api_service/acg_service.dart';
import 'package:hgmj/hj_utils/const.dart';
import 'package:hgmj/hj_utils/api_service/vid_service.dart';
import 'package:hgmj/tools_base/base_list_controller.dart';
import 'package:wydj/hj_utils/api_service/acg_service.dart';
import 'package:wydj/hj_utils/const.dart';
import 'package:wydj/hj_utils/api_service/vid_service.dart';
import 'package:wydj/tools_base/base_list_controller.dart';
class RankSubPageLogic extends ListBaseLogic<dynamic> {
final MediaStyle pageType; // 榜单媒体类型:影片/帖子/图集/漫画等
@@ -9,7 +9,8 @@ class RankSubPageLogic extends ListBaseLogic<dynamic> {
RankSubPageLogic({required this.pageType, this.sortType = 2});
bool get isACG => pageType == MediaStyle.Comics || pageType == MediaStyle.Cartoon;
bool get isACG =>
pageType == MediaStyle.Comics || pageType == MediaStyle.Cartoon;
// onInit(挂载即同步触发,比 onReady 的帧后回调在嵌套 keepAlive 下可靠)
@override
@@ -31,10 +32,12 @@ class RankSubPageLogic extends ListBaseLogic<dynamic> {
// 拉取榜单:ACG 走 getRanking,其余走 vidRanking;返回 (列表, 是否还有更多)
Future<(List<dynamic>?, bool)> _fetch(int page) async {
if (isACG) {
final resp = await ACGService.getRanking(page, 10, mediaType: pageType.rankParam, type: sortType);
final resp = await ACGService.getRanking(page, 10,
mediaType: pageType.rankParam, type: sortType);
return (resp?.list, resp?.hasNext == true);
}
final res = await VidService.vidRanking(page, 10, newsType: pageType.rankParam, type: sortType);
final res = await VidService.vidRanking(page, 10,
newsType: pageType.rankParam, type: sortType);
return (res?.videos, res?.hasNext == true);
}
}
@@ -1,12 +1,12 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:hgmj/hj_model/video_model.dart';
import 'package:hgmj/hj_page/find/rank_module/video_rank_item.dart';
import 'package:hgmj/hj_utils/const.dart';
import 'package:hgmj/hj_utils/screen.dart';
import 'package:hgmj/tools_base/loading/loading_center_widget.dart';
import 'package:hgmj/tools_base/refresh/pull_refresh.dart';
import 'package:hgmj/tools_base/unique_tag_mixin.dart';
import 'package:wydj/hj_model/video_model.dart';
import 'package:wydj/hj_page/find/rank_module/video_rank_item.dart';
import 'package:wydj/hj_utils/const.dart';
import 'package:wydj/hj_utils/screen.dart';
import 'package:wydj/tools_base/loading/loading_center_widget.dart';
import 'package:wydj/tools_base/refresh/pull_refresh.dart';
import 'package:wydj/tools_base/unique_tag_mixin.dart';
import '../../community/widget/community_post_widget.dart';
import 'acg_rank_item.dart';
@@ -47,7 +47,8 @@ class _RankSubPageState extends State<RankSubPage> with UniqueTagMixin {
Widget _buildContent() {
if (logic.isLoading) return LoadingCenterWidget();
//retryOnTap 要拿到 Future 才有 loading + 防连点
if (logic.isEmptyData) return CErrorWidget(retryOnTap: () => logic.loadData(showLoading: true));
if (logic.isEmptyData)
return CErrorWidget(retryOnTap: () => logic.loadData(showLoading: true));
final list = logic.dataList ?? const [];
return ListView.separated(
keyboardDismissBehavior: ScrollViewKeyboardDismissBehavior.onDrag,
@@ -64,7 +65,9 @@ class _RankSubPageState extends State<RankSubPage> with UniqueTagMixin {
videoModels: list.cast<VideoModel>(),
rankIndex: index,
),
MediaStyle.Cartoon || MediaStyle.Comics => ACGRankItem(index, list[index]),
MediaStyle.Cartoon ||
MediaStyle.Comics =>
ACGRankItem(index, list[index]),
_ => const SizedBox.shrink(),
},
);
@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:hgmj/hj_page/find/rank_module/rank_sort_tab_bar.dart';
import 'package:hgmj/hj_utils/const.dart';
import 'package:hgmj/tools_base/widget/keep_alive_widget.dart';
import 'package:wydj/hj_page/find/rank_module/rank_sort_tab_bar.dart';
import 'package:wydj/hj_utils/const.dart';
import 'package:wydj/tools_base/widget/keep_alive_widget.dart';
import 'rank_sub_page.dart';
@@ -15,7 +15,8 @@ class RankTypeTabView extends StatefulWidget {
State<RankTypeTabView> createState() => _RankTypeTabViewState();
}
class _RankTypeTabViewState extends State<RankTypeTabView> with SingleTickerProviderStateMixin {
class _RankTypeTabViewState extends State<RankTypeTabView>
with SingleTickerProviderStateMixin {
//标题与后端 sortType 绑在一起,避免两个数组分家后漏改一处就错位
static const _tabs = [
SortTab('周榜', 2),
@@ -24,7 +25,8 @@ class _RankTypeTabViewState extends State<RankTypeTabView> with SingleTickerProv
SortTab('总榜', 4),
];
late final TabController tabCtr = TabController(length: _tabs.length, vsync: this);
late final TabController tabCtr =
TabController(length: _tabs.length, vsync: this);
@override
void dispose() {
@@ -35,16 +37,21 @@ class _RankTypeTabViewState extends State<RankTypeTabView> with SingleTickerProv
@override
Widget build(BuildContext context) {
return Container(
color: Color(0xff0f0f0f),
color: Color(0xff0f0f0f),
child: Column(
children: [
RankSortTabBar(titles: _tabs.map((e) => e.name).toList(), tabCtr: tabCtr),
RankSortTabBar(
titles: _tabs.map((e) => e.name).toList(), tabCtr: tabCtr),
Expanded(
child: Container(
padding: EdgeInsets.only(top: 8),
child: TabBarView(
controller: tabCtr,
children: _tabs.map((e) => RankSubPage(pageType: widget.pageType, sortType: e.sort).keepAlive).toList(),
children: _tabs
.map((e) =>
RankSubPage(pageType: widget.pageType, sortType: e.sort)
.keepAlive)
.toList(),
),
),
),
@@ -1,11 +1,11 @@
import 'package:flutter/material.dart';
import 'package:hgmj/assets_tool/images.dart';
import 'package:hgmj/extension/extensions.dart';
import 'package:hgmj/hj_model/video_model.dart';
import 'package:hgmj/hj_page/find/rank_module/rank_badge.dart';
import 'package:hgmj/hj_utils/screen.dart';
import 'package:hgmj/routers/jump_router.dart';
import 'package:hgmj/tools_base/widget/net_image_widget.dart';
import 'package:wydj/assets_tool/images.dart';
import 'package:wydj/extension/extensions.dart';
import 'package:wydj/hj_model/video_model.dart';
import 'package:wydj/hj_page/find/rank_module/rank_badge.dart';
import 'package:wydj/hj_utils/screen.dart';
import 'package:wydj/routers/jump_router.dart';
import 'package:wydj/tools_base/widget/net_image_widget.dart';
//影视排行榜item
class VideoRankItem extends StatelessWidget {
@@ -30,7 +30,8 @@ class VideoRankItem extends StatelessWidget {
child: Stack(
fit: StackFit.expand,
children: [
NetworkImageLoader(imageUrl: movie?.cover ?? '', borderRadius: 8),
NetworkImageLoader(
imageUrl: movie?.cover ?? '', borderRadius: 8),
Container(
alignment: Alignment.bottomCenter,
padding: const EdgeInsets.fromLTRB(5, 0, 5, 5),
@@ -39,12 +40,14 @@ class VideoRankItem extends StatelessWidget {
Image.asset('circle_play.webp'.videoPath, width: 16),
Text(
movie?.playCount?.countStr ?? '0',
style: const TextStyle(color: Colors.white, fontSize: 10, height: 1.6),
style: const TextStyle(
color: Colors.white, fontSize: 10, height: 1.6),
),
const Spacer(),
Text(
movie?.playTime?.hmsStr ?? "",
style: const TextStyle(color: Colors.white, fontSize: 10, height: 1.6),
style: const TextStyle(
color: Colors.white, fontSize: 10, height: 1.6),
),
],
),
@@ -64,7 +67,8 @@ class VideoRankItem extends StatelessWidget {
"${movie?.title ?? ''}\n",
maxLines: 2,
overflow: TextOverflow.ellipsis,
style: const TextStyle(color: Color(0xE5FFFFFF), fontSize: 12, height: 1.5),
style: const TextStyle(
color: Color(0xE5FFFFFF), fontSize: 12, height: 1.5),
),
//收藏量
Row(
@@ -73,7 +77,8 @@ class VideoRankItem extends StatelessWidget {
5.sizeBoxW,
Text(
movie?.collectCount?.countStr ?? "0",
style: const TextStyle(color: Color(0xff989898), fontSize: 12),
style: const TextStyle(
color: Color(0xff989898), fontSize: 12),
),
],
),