logo和名称替换
This commit is contained in:
@@ -3,17 +3,18 @@ import 'dart:math';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:hgmj/hj_model/video_model.dart';
|
||||
import 'package:hgmj/hj_utils/api_service/common_service.dart';
|
||||
import 'package:hgmj/hj_utils/api_service/mine_service.dart';
|
||||
import 'package:hgmj/hj_utils/api_service/vid_service.dart';
|
||||
import 'package:hgmj/tools_base/toast.dart';
|
||||
import 'package:hgmj/hj_utils/history_util.dart';
|
||||
import 'package:hgmj/hj_utils/const.dart';
|
||||
import 'package:wydj/hj_model/video_model.dart';
|
||||
import 'package:wydj/hj_utils/api_service/common_service.dart';
|
||||
import 'package:wydj/hj_utils/api_service/mine_service.dart';
|
||||
import 'package:wydj/hj_utils/api_service/vid_service.dart';
|
||||
import 'package:wydj/tools_base/toast.dart';
|
||||
import 'package:wydj/hj_utils/history_util.dart';
|
||||
import 'package:wydj/hj_utils/const.dart';
|
||||
|
||||
import '../../alert/video/video_buy_bottom_sheet.dart';
|
||||
|
||||
class AcgGameDetailLogic extends GetxController with GetTickerProviderStateMixin {
|
||||
class AcgGameDetailLogic extends GetxController
|
||||
with GetTickerProviderStateMixin {
|
||||
// 外部传入:游戏(资源) ID
|
||||
final String gameId;
|
||||
AcgGameDetailLogic({this.gameId = ''});
|
||||
|
||||
@@ -2,20 +2,20 @@ import 'package:easy_rich_text/easy_rich_text.dart';
|
||||
import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:hgmj/assets_tool/app_colors.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/comment/comment_views.dart';
|
||||
import 'package:hgmj/hj_page/find/acg_game_detail_logic.dart';
|
||||
import 'package:hgmj/hj_page/find/acg_game_recommend_page.dart';
|
||||
import 'package:hgmj/hj_utils/screen.dart';
|
||||
import 'package:hgmj/hj_utils/sliver_delegate.dart';
|
||||
import 'package:hgmj/tools_base/banner/ads_banner.dart';
|
||||
import 'package:hgmj/tools_base/indicator/custom_tab_indicator.dart';
|
||||
import 'package:hgmj/tools_base/loading/loading_center_widget.dart';
|
||||
import 'package:hgmj/tools_base/unique_tag_mixin.dart';
|
||||
import 'package:hgmj/tools_base/widget/keep_alive_widget.dart';
|
||||
import 'package:wydj/assets_tool/app_colors.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/comment/comment_views.dart';
|
||||
import 'package:wydj/hj_page/find/acg_game_detail_logic.dart';
|
||||
import 'package:wydj/hj_page/find/acg_game_recommend_page.dart';
|
||||
import 'package:wydj/hj_utils/screen.dart';
|
||||
import 'package:wydj/hj_utils/sliver_delegate.dart';
|
||||
import 'package:wydj/tools_base/banner/ads_banner.dart';
|
||||
import 'package:wydj/tools_base/indicator/custom_tab_indicator.dart';
|
||||
import 'package:wydj/tools_base/loading/loading_center_widget.dart';
|
||||
import 'package:wydj/tools_base/unique_tag_mixin.dart';
|
||||
import 'package:wydj/tools_base/widget/keep_alive_widget.dart';
|
||||
import 'package:mobkit_dashed_border/mobkit_dashed_border.dart';
|
||||
|
||||
import '../../hj_utils/widget_util.dart';
|
||||
@@ -30,7 +30,8 @@ class AcgGameDetailPage extends StatefulWidget {
|
||||
State<AcgGameDetailPage> createState() => _AcgGameDetailPageState();
|
||||
}
|
||||
|
||||
class _AcgGameDetailPageState extends State<AcgGameDetailPage> with UniqueTagMixin {
|
||||
class _AcgGameDetailPageState extends State<AcgGameDetailPage>
|
||||
with UniqueTagMixin {
|
||||
// 详情可自我堆叠(相关推荐→再开详情),uniqueTag 由 UniqueTagMixin 提供,隔离多实例 logic
|
||||
late final AcgGameDetailLogic logic = AcgGameDetailLogic(gameId: widget.id);
|
||||
|
||||
@@ -108,7 +109,8 @@ class _AcgGameDetailPageState extends State<AcgGameDetailPage> with UniqueTagMix
|
||||
labelColor: Colors.white,
|
||||
labelStyle: const TextStyle(fontSize: 18, fontWeight: FontWeight.w600),
|
||||
unselectedLabelColor: Color(0xffE0E0E0),
|
||||
unselectedLabelStyle: const TextStyle(fontSize: 16, fontWeight: FontWeight.w400),
|
||||
unselectedLabelStyle:
|
||||
const TextStyle(fontSize: 16, fontWeight: FontWeight.w400),
|
||||
indicator: CustomIndicator(
|
||||
width: 16,
|
||||
height: 4,
|
||||
@@ -133,7 +135,8 @@ class _AcgGameDetailPageState extends State<AcgGameDetailPage> with UniqueTagMix
|
||||
padding: EdgeInsets.only(left: 2),
|
||||
child: Text(
|
||||
'${logic.totalCtCount.value == 0 ? '' : logic.totalCtCount.value}',
|
||||
style: textStyle(12, AppColors.actionRed, FontWeight.w500),
|
||||
style:
|
||||
textStyle(12, AppColors.actionRed, FontWeight.w500),
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -173,12 +176,14 @@ class _AcgGameDetailPageState extends State<AcgGameDetailPage> with UniqueTagMix
|
||||
),
|
||||
18.sizeBoxH,
|
||||
_buildRightWidget(),
|
||||
if (logic.detailInfo?.tags != null && logic.detailInfo?.tags?.isNotEmpty == true) ...[
|
||||
if (logic.detailInfo?.tags != null &&
|
||||
logic.detailInfo?.tags?.isNotEmpty == true) ...[
|
||||
20.sizeBoxH,
|
||||
Wrap(
|
||||
spacing: 10,
|
||||
runSpacing: 0,
|
||||
children: List.generate(logic.detailInfo?.tags?.length ?? 0, (index) {
|
||||
children:
|
||||
List.generate(logic.detailInfo?.tags?.length ?? 0, (index) {
|
||||
final tag = logic.detailInfo?.tags?[index];
|
||||
return Container(
|
||||
decoration: BoxDecoration(
|
||||
@@ -220,7 +225,8 @@ class _AcgGameDetailPageState extends State<AcgGameDetailPage> with UniqueTagMix
|
||||
Row(
|
||||
children: [
|
||||
Spacer(),
|
||||
InkWell(enableFeedback: false,
|
||||
InkWell(
|
||||
enableFeedback: false,
|
||||
onTap: () => logic.onLinkClickAction(),
|
||||
child: Container(
|
||||
padding: EdgeInsets.symmetric(horizontal: 20, vertical: 12),
|
||||
@@ -236,7 +242,10 @@ class _AcgGameDetailPageState extends State<AcgGameDetailPage> with UniqueTagMix
|
||||
),
|
||||
child: EasyRichText(
|
||||
'点击复制「种子资源」',
|
||||
defaultStyle: TextStyle(color: Colors.white, fontSize: 14, fontWeight: FontWeight.w400),
|
||||
defaultStyle: TextStyle(
|
||||
color: Colors.white,
|
||||
fontSize: 14,
|
||||
fontWeight: FontWeight.w400),
|
||||
patternList: [
|
||||
EasyRichTextPattern(
|
||||
targetString: '「种子资源」',
|
||||
@@ -251,7 +260,8 @@ class _AcgGameDetailPageState extends State<AcgGameDetailPage> with UniqueTagMix
|
||||
)
|
||||
] else ...[
|
||||
//金币解锁
|
||||
InkWell(enableFeedback: false,
|
||||
InkWell(
|
||||
enableFeedback: false,
|
||||
onTap: () => logic.showAlert(),
|
||||
child: Container(
|
||||
height: 124,
|
||||
@@ -282,7 +292,8 @@ class _AcgGameDetailPageState extends State<AcgGameDetailPage> with UniqueTagMix
|
||||
),
|
||||
),
|
||||
18.sizeBoxH,
|
||||
InkWell(enableFeedback: false,
|
||||
InkWell(
|
||||
enableFeedback: false,
|
||||
onTap: () => logic.showAlert(),
|
||||
child: Container(
|
||||
height: 44,
|
||||
@@ -312,16 +323,20 @@ class _AcgGameDetailPageState extends State<AcgGameDetailPage> with UniqueTagMix
|
||||
return Row(
|
||||
children: [
|
||||
//观看
|
||||
_buildStatusItem('eye_white.webp'.commonImgPath, logic.detailInfo?.playCount.countStr ?? '', false),
|
||||
_buildStatusItem('eye_white.webp'.commonImgPath,
|
||||
logic.detailInfo?.playCount.countStr ?? '', false),
|
||||
30.sizeBoxW,
|
||||
//收藏
|
||||
GetBuilder<AcgGameDetailLogic>(
|
||||
tag: uniqueTag,
|
||||
id: 'collect',
|
||||
builder: (_) => InkWell(enableFeedback: false,
|
||||
builder: (_) => InkWell(
|
||||
enableFeedback: false,
|
||||
onTap: logic.onCollectionAction,
|
||||
child: _buildStatusItem(
|
||||
logic.detailInfo?.hasCollected == true ? 'collect_red.png'.commonImgPath : 'collect_path.png'.commonImgPath,
|
||||
logic.detailInfo?.hasCollected == true
|
||||
? 'collect_red.png'.commonImgPath
|
||||
: 'collect_path.png'.commonImgPath,
|
||||
logic.detailInfo?.collectCount?.countOr("0") ?? '',
|
||||
logic.detailInfo?.hasCollected == true,
|
||||
),
|
||||
@@ -332,10 +347,13 @@ class _AcgGameDetailPageState extends State<AcgGameDetailPage> with UniqueTagMix
|
||||
GetBuilder<AcgGameDetailLogic>(
|
||||
tag: uniqueTag,
|
||||
id: 'like',
|
||||
builder: (_) => InkWell(enableFeedback: false,
|
||||
builder: (_) => InkWell(
|
||||
enableFeedback: false,
|
||||
onTap: logic.onLikeAction,
|
||||
child: _buildStatusItem(
|
||||
logic.detailInfo?.hasLiked == true ? 'like_red.png'.commonImgPath : 'like_empty.png'.communityPath,
|
||||
logic.detailInfo?.hasLiked == true
|
||||
? 'like_red.png'.commonImgPath
|
||||
: 'like_empty.png'.communityPath,
|
||||
logic.detailInfo?.likeCount?.countOr("0") ?? '',
|
||||
logic.detailInfo?.hasLiked == true,
|
||||
),
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import 'package:hgmj/hj_model/home/video_list_model.dart';
|
||||
import 'package:hgmj/hj_model/video_model.dart';
|
||||
import 'package:hgmj/hj_utils/api_service/common_service.dart';
|
||||
import 'package:hgmj/tools_base/base_list_controller.dart';
|
||||
import 'package:wydj/hj_model/home/video_list_model.dart';
|
||||
import 'package:wydj/hj_model/video_model.dart';
|
||||
import 'package:wydj/hj_utils/api_service/common_service.dart';
|
||||
import 'package:wydj/tools_base/base_list_controller.dart';
|
||||
|
||||
class AcgGameRecommendLogic extends ListBaseLogic {
|
||||
VideoModel? mediaModel;
|
||||
@@ -16,7 +16,8 @@ class AcgGameRecommendLogic extends ListBaseLogic {
|
||||
|
||||
loadData({int pageNum = 1, bool showLoading = false, int size = 10}) async {
|
||||
dataList ??= [];
|
||||
VideoListResp? resp = await CommonService.getRecommendList(pageNumber: pageNum, pageSize: 10, tagId: mediaModel?.tags?.first.id);
|
||||
VideoListResp? resp = await CommonService.getRecommendList(
|
||||
pageNumber: pageNum, pageSize: 10, tagId: mediaModel?.tags?.first.id);
|
||||
|
||||
if (resp != null) {
|
||||
currentPage = pageNum;
|
||||
@@ -24,7 +25,9 @@ class AcgGameRecommendLogic extends ListBaseLogic {
|
||||
dataList?.addAll(resp.videos ?? []);
|
||||
}
|
||||
update();
|
||||
resp?.hasNext == true ? refreshCtr?.loadComplete() : refreshCtr?.loadNoData();
|
||||
resp?.hasNext == true
|
||||
? refreshCtr?.loadComplete()
|
||||
: refreshCtr?.loadNoData();
|
||||
refreshCtr?.refreshCompleted();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:hgmj/hj_model/video_model.dart';
|
||||
import 'package:hgmj/hj_page/find/acg_game_recommend_logic.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/acg_game_recommend_logic.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 '../home/home_cell_style/video_simple_cell.dart';
|
||||
|
||||
|
||||
@@ -2,17 +2,17 @@ import 'dart:math';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:hgmj/alert/video/share_media_dialog.dart';
|
||||
import 'package:hgmj/assets_tool/app_colors.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/comment/comment_alert.dart';
|
||||
import 'package:hgmj/hj_utils/api_service/common_service.dart';
|
||||
import 'package:hgmj/hj_utils/api_service/mine_service.dart';
|
||||
import 'package:hgmj/hj_utils/screen.dart';
|
||||
import 'package:hgmj/tools_base/debug_log.dart';
|
||||
import 'package:hgmj/tools_base/toast.dart';
|
||||
import 'package:wydj/alert/video/share_media_dialog.dart';
|
||||
import 'package:wydj/assets_tool/app_colors.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/comment/comment_alert.dart';
|
||||
import 'package:wydj/hj_utils/api_service/common_service.dart';
|
||||
import 'package:wydj/hj_utils/api_service/mine_service.dart';
|
||||
import 'package:wydj/hj_utils/screen.dart';
|
||||
import 'package:wydj/tools_base/debug_log.dart';
|
||||
import 'package:wydj/tools_base/toast.dart';
|
||||
import 'package:like_button/like_button.dart';
|
||||
|
||||
///图集底部操作按钮组
|
||||
@@ -21,7 +21,8 @@ class AlbumActionWidget extends StatefulWidget {
|
||||
final int currentIndex; //当前顶部那张的下标,0 基
|
||||
final int? total; //显示的总张数,未传则取 seriesCover.length
|
||||
|
||||
const AlbumActionWidget({super.key, this.videoModel, this.currentIndex = 0, this.total});
|
||||
const AlbumActionWidget(
|
||||
{super.key, this.videoModel, this.currentIndex = 0, this.total});
|
||||
|
||||
@override
|
||||
State<AlbumActionWidget> createState() => _AlbumActionWidgetState();
|
||||
@@ -49,19 +50,23 @@ class _AlbumActionWidgetState extends State<AlbumActionWidget> {
|
||||
_actionItem(
|
||||
'share_grey_pic.png'.commonImgPath,
|
||||
'分享',
|
||||
onTap: () => Get.dialog(ShareMediaDialog(videoModel: model), useSafeArea: false),
|
||||
onTap: () => Get.dialog(ShareMediaDialog(videoModel: model),
|
||||
useSafeArea: false),
|
||||
),
|
||||
//页码 1/3
|
||||
Container(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 11, vertical: 2),
|
||||
decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20)),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white, borderRadius: BorderRadius.circular(20)),
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Text('${widget.currentIndex + 1}',
|
||||
style: const TextStyle(color: AppColors.actionRed, fontSize: 12)),
|
||||
style: const TextStyle(
|
||||
color: AppColors.actionRed, fontSize: 12)),
|
||||
Text('/${widget.total ?? model?.seriesCover?.length ?? 0}',
|
||||
style: const TextStyle(color: Color(0xff3D3D3D), fontSize: 12)),
|
||||
style: const TextStyle(
|
||||
color: Color(0xff3D3D3D), fontSize: 12)),
|
||||
],
|
||||
),
|
||||
),
|
||||
@@ -75,13 +80,16 @@ class _AlbumActionWidgetState extends State<AlbumActionWidget> {
|
||||
return LikeButton(
|
||||
size: 20,
|
||||
isLiked: model?.vidStatus?.hasLiked ?? false,
|
||||
circleColor: CircleColor(start: AppColors.actionRed, end: AppColors.actionRed),
|
||||
circleColor:
|
||||
CircleColor(start: AppColors.actionRed, end: AppColors.actionRed),
|
||||
bubblesColor: BubblesColor(
|
||||
dotPrimaryColor: AppColors.actionRed,
|
||||
dotSecondaryColor: AppColors.actionRed,
|
||||
),
|
||||
likeBuilder: (isLiked) => Image.asset(
|
||||
isLiked ? 'like_red.png'.commonImgPath : 'video_like_border.png'.videoPath,
|
||||
isLiked
|
||||
? 'like_red.png'.commonImgPath
|
||||
: 'video_like_border.png'.videoPath,
|
||||
width: 20,
|
||||
height: 20,
|
||||
color: isLiked ? AppColors.actionRed : const Color(0xff989898),
|
||||
@@ -89,7 +97,9 @@ class _AlbumActionWidgetState extends State<AlbumActionWidget> {
|
||||
likeCount: model?.likeCount ?? 0,
|
||||
countBuilder: (count, isLiked, text) => Text(
|
||||
count.countOr('点赞'),
|
||||
style: TextStyle(color: isLiked ? AppColors.actionRed : const Color(0xff989898), fontSize: 12),
|
||||
style: TextStyle(
|
||||
color: isLiked ? AppColors.actionRed : const Color(0xff989898),
|
||||
fontSize: 12),
|
||||
),
|
||||
onTap: (isLiked) async {
|
||||
final hasLiked = model?.vidStatus?.hasLiked ?? false;
|
||||
@@ -118,25 +128,31 @@ class _AlbumActionWidgetState extends State<AlbumActionWidget> {
|
||||
return LikeButton(
|
||||
size: 20,
|
||||
isLiked: model?.vidStatus?.hasCollected ?? false,
|
||||
circleColor: CircleColor(start: AppColors.actionRed, end: AppColors.actionRed),
|
||||
circleColor:
|
||||
CircleColor(start: AppColors.actionRed, end: AppColors.actionRed),
|
||||
bubblesColor: BubblesColor(
|
||||
dotPrimaryColor: AppColors.actionRed,
|
||||
dotSecondaryColor: AppColors.actionRed,
|
||||
),
|
||||
likeBuilder: (isLiked) => Image.asset(
|
||||
isLiked ? 'collect_red.png'.commonImgPath : 'collect_empty.png'.commonImgPath,
|
||||
isLiked
|
||||
? 'collect_red.png'.commonImgPath
|
||||
: 'collect_empty.png'.commonImgPath,
|
||||
width: 20,
|
||||
color: isLiked ? AppColors.actionRed : const Color(0xff989898),
|
||||
),
|
||||
likeCount: model?.collectCount ?? 0,
|
||||
countBuilder: (count, isLiked, text) => Text(
|
||||
count.countOr('收藏'),
|
||||
style: TextStyle(color: isLiked ? AppColors.actionRed : const Color(0xff989898), fontSize: 12),
|
||||
style: TextStyle(
|
||||
color: isLiked ? AppColors.actionRed : const Color(0xff989898),
|
||||
fontSize: 12),
|
||||
),
|
||||
onTap: (isLiked) async {
|
||||
final hasCollected = model?.vidStatus?.hasCollected ?? false;
|
||||
final count = model?.collectCount ?? 0;
|
||||
final isOk = await MineService.postCollect(model?.id, 'PIC', !hasCollected);
|
||||
final isOk =
|
||||
await MineService.postCollect(model?.id, 'PIC', !hasCollected);
|
||||
//失败不动本地状态,返回原值让按钮回弹
|
||||
if (!isOk) return hasCollected;
|
||||
model?.collectCount = max(0, count + (hasCollected ? -1 : 1));
|
||||
@@ -149,7 +165,8 @@ class _AlbumActionWidgetState extends State<AlbumActionWidget> {
|
||||
}
|
||||
|
||||
//图标 + 文字按钮(评论、分享共用)
|
||||
Widget _actionItem(String imagePath, String title, {GestureTapCallback? onTap}) {
|
||||
Widget _actionItem(String imagePath, String title,
|
||||
{GestureTapCallback? onTap}) {
|
||||
return InkWell(
|
||||
enableFeedback: false,
|
||||
onTap: onTap,
|
||||
@@ -160,7 +177,8 @@ class _AlbumActionWidgetState extends State<AlbumActionWidget> {
|
||||
children: [
|
||||
Image.asset(imagePath, width: 20, color: const Color(0xff989898)),
|
||||
3.sizeBoxW,
|
||||
Text(title, style: const TextStyle(color: Color(0xff989898), fontSize: 12)),
|
||||
Text(title,
|
||||
style: const TextStyle(color: Color(0xff989898), fontSize: 12)),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:get/get.dart';
|
||||
import 'package:hgmj/hj_model/video_model.dart';
|
||||
import 'package:hgmj/hj_page/mine/mine_vip/pay_order_source.dart';
|
||||
import 'package:hgmj/hj_utils/api_service/vid_service.dart';
|
||||
import 'package:hgmj/hj_utils/const.dart';
|
||||
import 'package:hgmj/hj_utils/history_util.dart';
|
||||
import 'package:hgmj/tools_base/widget/scroll_positioned_list/src/item_positions_listener.dart';
|
||||
import 'package:hgmj/tools_base/widget/scroll_positioned_list/src/scrollable_positioned_list.dart';
|
||||
import 'package:wydj/hj_model/video_model.dart';
|
||||
import 'package:wydj/hj_page/mine/mine_vip/pay_order_source.dart';
|
||||
import 'package:wydj/hj_utils/api_service/vid_service.dart';
|
||||
import 'package:wydj/hj_utils/const.dart';
|
||||
import 'package:wydj/hj_utils/history_util.dart';
|
||||
import 'package:wydj/tools_base/widget/scroll_positioned_list/src/item_positions_listener.dart';
|
||||
import 'package:wydj/tools_base/widget/scroll_positioned_list/src/scrollable_positioned_list.dart';
|
||||
|
||||
import '../../../alert/video/video_buy_bottom_sheet.dart';
|
||||
import '../../mine/mine_vip/mine_charge_vip_page.dart';
|
||||
@@ -36,7 +36,9 @@ class PicsDetailLogic extends GetxController {
|
||||
|
||||
//未解锁时放出几张:freeTime 为 0(后端没配)兜底 8 张,否则按 freeTime,都不超过总张数
|
||||
//freeTime 为 null 走后半段算 0 张,与原逻辑一致
|
||||
int get lockCount => videoModel?.freeTime == 0 ? min(8, covers.length) : min(videoModel?.freeTime ?? 0, covers.length);
|
||||
int get lockCount => videoModel?.freeTime == 0
|
||||
? min(8, covers.length)
|
||||
: min(videoModel?.freeTime ?? 0, covers.length);
|
||||
|
||||
@override
|
||||
void onReady() {
|
||||
@@ -56,14 +58,20 @@ class PicsDetailLogic extends GetxController {
|
||||
//解锁:金币走购买弹窗,会员走开通弹窗
|
||||
void showBuy() async {
|
||||
if (isCoinLock) {
|
||||
final res = await Get.bottomSheet(VideoBuyBottomSheet(video: videoModel!));
|
||||
final res =
|
||||
await Get.bottomSheet(VideoBuyBottomSheet(video: videoModel!));
|
||||
if (res == true) {
|
||||
videoModel?.vidStatus?.hasPaid = true;
|
||||
update();
|
||||
}
|
||||
} else if (videoModel?.lockType == 2) {
|
||||
//Get.dialog(VipACGDialog());
|
||||
Get.to(MineChargeVipPage(sourcePage: PaySourcePage.vipCenter,), preventDuplicates: false,);
|
||||
Get.to(
|
||||
MineChargeVipPage(
|
||||
sourcePage: PaySourcePage.vipCenter,
|
||||
),
|
||||
preventDuplicates: false,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,16 +3,16 @@ import 'dart:ui';
|
||||
import 'package:easy_rich_text/easy_rich_text.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:hgmj/assets_tool/app_colors.dart';
|
||||
import 'package:hgmj/hj_utils/screen.dart';
|
||||
import 'package:hgmj/hj_utils/widget_util.dart';
|
||||
import 'package:hgmj/tools_base/loading/loading_center_widget.dart';
|
||||
import 'package:hgmj/tools_base/toast.dart';
|
||||
import 'package:hgmj/tools_base/unique_tag_mixin.dart';
|
||||
import 'package:hgmj/tools_base/widget/image_browser_page.dart';
|
||||
import 'package:hgmj/tools_base/widget/net_image_widget.dart';
|
||||
import 'package:hgmj/tools_base/widget/scroll_positioned_list/src/item_positions_listener.dart';
|
||||
import 'package:hgmj/tools_base/widget/scroll_positioned_list/src/scrollable_positioned_list.dart';
|
||||
import 'package:wydj/assets_tool/app_colors.dart';
|
||||
import 'package:wydj/hj_utils/screen.dart';
|
||||
import 'package:wydj/hj_utils/widget_util.dart';
|
||||
import 'package:wydj/tools_base/loading/loading_center_widget.dart';
|
||||
import 'package:wydj/tools_base/toast.dart';
|
||||
import 'package:wydj/tools_base/unique_tag_mixin.dart';
|
||||
import 'package:wydj/tools_base/widget/image_browser_page.dart';
|
||||
import 'package:wydj/tools_base/widget/net_image_widget.dart';
|
||||
import 'package:wydj/tools_base/widget/scroll_positioned_list/src/item_positions_listener.dart';
|
||||
import 'package:wydj/tools_base/widget/scroll_positioned_list/src/scrollable_positioned_list.dart';
|
||||
|
||||
import '../../mine/mine_share/mine_share_page.dart';
|
||||
import 'album_action_widget.dart';
|
||||
@@ -40,7 +40,8 @@ class _PicsDetailPageState extends State<PicsDetailPage> with UniqueTagMixin {
|
||||
builder: (logic) {
|
||||
if (logic.videoModel == null) return LoadingCenterWidget();
|
||||
//拉失败后 videoModel 是空壳,靠 id 判断
|
||||
if (logic.videoModel?.id == null) return CErrorWidget(retryOnTap: () => logic.loadData());
|
||||
if (logic.videoModel?.id == null)
|
||||
return CErrorWidget(retryOnTap: () => logic.loadData());
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
@@ -49,13 +50,15 @@ class _PicsDetailPageState extends State<PicsDetailPage> with UniqueTagMixin {
|
||||
InkWell(
|
||||
enableFeedback: false,
|
||||
onTap: () => Get.back(),
|
||||
child: Icon(Icons.arrow_back_ios_new, color: Colors.white, size: 24),
|
||||
child: Icon(Icons.arrow_back_ios_new,
|
||||
color: Colors.white, size: 24),
|
||||
),
|
||||
4.sizeBoxW,
|
||||
Expanded(
|
||||
child: Text(
|
||||
logic.videoModel?.title ?? '',
|
||||
style: textStyle(16, Colors.white.withValues(alpha: .9), FontWeight.w800),
|
||||
style: textStyle(16, Colors.white.withValues(alpha: .9),
|
||||
FontWeight.w800),
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
@@ -68,7 +71,9 @@ class _PicsDetailPageState extends State<PicsDetailPage> with UniqueTagMixin {
|
||||
builder: (_, positions, __) => AlbumActionWidget(
|
||||
videoModel: logic.videoModel,
|
||||
currentIndex: positions.isEmpty ? 0 : positions.first.index,
|
||||
total: logic.isUnlocked ? logic.covers.length : logic.lockCount,
|
||||
total: logic.isUnlocked
|
||||
? logic.covers.length
|
||||
: logic.lockCount,
|
||||
),
|
||||
),
|
||||
],
|
||||
@@ -89,13 +94,19 @@ class _PicsDetailPageState extends State<PicsDetailPage> with UniqueTagMixin {
|
||||
itemScrollController: logic.itemScrollCtr,
|
||||
itemCount: count,
|
||||
itemBuilder: (_, index) {
|
||||
final image = NetworkImageLoader(imageUrl: covers[index], borderRadius: 0);
|
||||
final image =
|
||||
NetworkImageLoader(imageUrl: covers[index], borderRadius: 0);
|
||||
if (isUnlocked) {
|
||||
return GestureDetector(onTap: () => ImageBrowserPage.open(covers, index: index), child: image);
|
||||
return GestureDetector(
|
||||
onTap: () => ImageBrowserPage.open(covers, index: index),
|
||||
child: image);
|
||||
}
|
||||
return Stack(
|
||||
children: [
|
||||
InkWell(enableFeedback: false, onTap: () => showToast('解锁后可查看图片详情'), child: image),
|
||||
InkWell(
|
||||
enableFeedback: false,
|
||||
onTap: () => showToast('解锁后可查看图片详情'),
|
||||
child: image),
|
||||
if (index == count - 1) Positioned.fill(child: _unlockMask(logic)),
|
||||
],
|
||||
);
|
||||
@@ -113,27 +124,41 @@ class _PicsDetailPageState extends State<PicsDetailPage> with UniqueTagMixin {
|
||||
'你只需花费 $coins 金币',
|
||||
defaultStyle: textStyle(16, Colors.white, FontWeight.w400),
|
||||
patternList: [
|
||||
EasyRichTextPattern(targetString: '$coins', style: textStyle(16, AppColors.actionRed, FontWeight.w400)),
|
||||
EasyRichTextPattern(
|
||||
targetString: '$coins',
|
||||
style: textStyle(16, AppColors.actionRed, FontWeight.w400)),
|
||||
],
|
||||
),
|
||||
16.sizeBoxH,
|
||||
Text('即可解锁继续查看', style: textStyle(12, Colors.white, FontWeight.w400)),
|
||||
Text('即可解锁继续查看',
|
||||
style: textStyle(12, Colors.white, FontWeight.w400)),
|
||||
16.sizeBoxH,
|
||||
_maskBtn('立即解锁', 84, [Color(0xffFF6E6E), Color(0xffFF4D4D)], Colors.white, logic.showBuy),
|
||||
_maskBtn('立即解锁', 84, [Color(0xffFF6E6E), Color(0xffFF4D4D)],
|
||||
Colors.white, logic.showBuy),
|
||||
]
|
||||
: [
|
||||
//会员解锁
|
||||
Text('试看结束', style: textStyle(16, Colors.white, FontWeight.w400)),
|
||||
16.sizeBoxH,
|
||||
Text('本内容需开通VIP免费观看', style: textStyle(16, Colors.white, FontWeight.w400)),
|
||||
Text('本内容需开通VIP免费观看',
|
||||
style: textStyle(16, Colors.white, FontWeight.w400)),
|
||||
16.sizeBoxH,
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
_maskBtn('邀请得3日VIP', 110, [Color(0xffFFE8BE), Color(0xffE6B764)], Color(0xff694923),
|
||||
_maskBtn(
|
||||
'邀请得3日VIP',
|
||||
110,
|
||||
[Color(0xffFFE8BE), Color(0xffE6B764)],
|
||||
Color(0xff694923),
|
||||
() => Get.to(() => MineSharePage())),
|
||||
18.sizeBoxW,
|
||||
_maskBtn('开通VIP免费看', 115, [Color(0xffFF6E6E), Color(0xffFF4D4D)], Colors.white, logic.showBuy),
|
||||
_maskBtn(
|
||||
'开通VIP免费看',
|
||||
115,
|
||||
[Color(0xffFF6E6E), Color(0xffFF4D4D)],
|
||||
Colors.white,
|
||||
logic.showBuy),
|
||||
],
|
||||
),
|
||||
];
|
||||
@@ -146,7 +171,9 @@ class _PicsDetailPageState extends State<PicsDetailPage> with UniqueTagMixin {
|
||||
fit: BoxFit.scaleDown,
|
||||
child: SizedBox(
|
||||
width: screen.screenWidth,
|
||||
child: Column(mainAxisAlignment: MainAxisAlignment.center, children: content),
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: content),
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -155,7 +182,8 @@ class _PicsDetailPageState extends State<PicsDetailPage> with UniqueTagMixin {
|
||||
}
|
||||
|
||||
//蒙层里的胶囊按钮,三处只差宽度/渐变/文字色/回调
|
||||
Widget _maskBtn(String text, double width, List<Color> colors, Color textColor, VoidCallback onTap) {
|
||||
Widget _maskBtn(String text, double width, List<Color> colors,
|
||||
Color textColor, VoidCallback onTap) {
|
||||
return InkWell(
|
||||
enableFeedback: false,
|
||||
onTap: onTap,
|
||||
@@ -163,7 +191,9 @@ class _PicsDetailPageState extends State<PicsDetailPage> with UniqueTagMixin {
|
||||
width: width,
|
||||
height: 30,
|
||||
alignment: Alignment.center,
|
||||
decoration: BoxDecoration(gradient: LinearGradient(colors: colors), borderRadius: BorderRadius.circular(15)),
|
||||
decoration: BoxDecoration(
|
||||
gradient: LinearGradient(colors: colors),
|
||||
borderRadius: BorderRadius.circular(15)),
|
||||
child: Text(text, style: textStyle(12, textColor, FontWeight.w400)),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -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),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
@@ -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),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user