初始化
This commit is contained in:
@@ -0,0 +1,102 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:hgdj/hj_model/cartoon_media_info.dart';
|
||||
import 'package:hgdj/hj_utils/const.dart';
|
||||
import 'package:hgdj/routers/jump_router.dart';
|
||||
import 'package:hgdj/tools_base/loading/loading_center_widget.dart';
|
||||
import 'package:hgdj/tools_base/refresh/pull_refresh.dart';
|
||||
import 'package:hgdj/tools_base/unique_tag_mixin.dart';
|
||||
|
||||
import '../../hj_model/video_model.dart';
|
||||
import '../home/home_cell_style/video_simple_cell.dart';
|
||||
import 'acg_widget_item.dart';
|
||||
import 'cartoon_recommend_logic.dart';
|
||||
|
||||
class CartoonRecommendPage extends StatefulWidget {
|
||||
final String? mediaId;
|
||||
final String? videoTagId; //视频(SP)推荐按当前视频 tag 拉同类
|
||||
final EdgeInsetsGeometry? padding;
|
||||
final Function()? tapAction;
|
||||
final MediaStyle mediaStyle; //推荐类型:Video(真人视频) / Cartoon(动漫) / Comics(漫画)
|
||||
final int crossAxisCount; //网格列数
|
||||
final double childAspectRatio; //网格宽高比
|
||||
final Function(VideoModel model)? onVideoTap; //视频 cell 点击:不传则走默认 push
|
||||
final Function(CartoonMediaInfo model)? onAcgTap; //acg cell 点击:不传则走默认 push
|
||||
|
||||
const CartoonRecommendPage({
|
||||
super.key,
|
||||
this.mediaId,
|
||||
this.tapAction,
|
||||
this.padding = const EdgeInsets.only(left: 16, right: 16, top: 10),
|
||||
this.mediaStyle = MediaStyle.Comics,
|
||||
this.videoTagId,
|
||||
this.crossAxisCount = 3,
|
||||
this.childAspectRatio = 111 / 188,
|
||||
this.onVideoTap,
|
||||
this.onAcgTap,
|
||||
});
|
||||
|
||||
@override
|
||||
State<CartoonRecommendPage> createState() => _CartoonRecommendPageState();
|
||||
}
|
||||
|
||||
class _CartoonRecommendPageState extends State<CartoonRecommendPage>
|
||||
with UniqueTagMixin {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return GetBuilder<CartoonRecommendLogic>(
|
||||
tag: uniqueTag,
|
||||
init: CartoonRecommendLogic(
|
||||
mediaId: widget.mediaId,
|
||||
mediaStyle: widget.mediaStyle,
|
||||
videoTagId: widget.videoTagId,
|
||||
),
|
||||
builder: (logic) {
|
||||
if (logic.isLoading) return LoadingCenterWidget();
|
||||
if (logic.isEmptyData)
|
||||
return CErrorWidget(retryOnTap: () => logic.loadData());
|
||||
final list = logic.dataList!;
|
||||
return pullYsRefresh(
|
||||
onInit: (ctr) => logic.refreshCtr = ctr,
|
||||
onLoading: (ctr) => logic.loadData(isRefresh: false),
|
||||
enablePullDown: false,
|
||||
child: GridView.builder(
|
||||
physics: const ClampingScrollPhysics(),
|
||||
padding: widget.padding,
|
||||
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
|
||||
crossAxisCount: widget.crossAxisCount,
|
||||
mainAxisSpacing: 12,
|
||||
crossAxisSpacing: 6,
|
||||
childAspectRatio: widget.childAspectRatio,
|
||||
),
|
||||
itemCount: list.length,
|
||||
itemBuilder: (_, index) => widget.mediaStyle == MediaStyle.Video
|
||||
? _videoCell(list[index])
|
||||
: _acgCell(list[index]),
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
// 视频推荐 cell:不传 onVideoTap 走 cell 默认 push,详情页传入则当前页切播放源
|
||||
Widget _videoCell(VideoModel model) {
|
||||
return VideoSimpleCell(
|
||||
videoModel: model,
|
||||
onTap: widget.onVideoTap == null ? null : () => widget.onVideoTap!(model),
|
||||
);
|
||||
}
|
||||
|
||||
// 漫画/动漫推荐 cell:不传 onAcgTap 时默认跳详情页
|
||||
Widget _acgCell(CartoonMediaInfo model) {
|
||||
return AcgItemWidget(
|
||||
info: model,
|
||||
tapCallback: widget.onAcgTap == null
|
||||
? () {
|
||||
widget.tapAction?.call();
|
||||
pushToCartoonPage(model);
|
||||
}
|
||||
: () => widget.onAcgTap!(model),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user