初始化
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hgdj/hj_model/cartoon_media_info.dart';
|
||||
import 'package:hgdj/hj_page/find/rank_module/rank_badge.dart';
|
||||
import 'package:hgdj/hj_utils/screen.dart';
|
||||
import 'package:hgdj/routers/jump_router.dart';
|
||||
import 'package:hgdj/tools_base/widget/net_image_widget.dart';
|
||||
|
||||
//动漫/漫画排行榜item
|
||||
class ACGRankItem extends StatelessWidget {
|
||||
final int index;
|
||||
final CartoonMediaInfo? movie;
|
||||
|
||||
const ACGRankItem(this.index, this.movie, {super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return InkWell(
|
||||
enableFeedback: false,
|
||||
onTap: () => pushToCartoonPage(movie),
|
||||
child: SizedBox(
|
||||
height: 108,
|
||||
child: Row(
|
||||
children: [
|
||||
//竖版封面
|
||||
SizedBox(
|
||||
width: 80,
|
||||
height: 108,
|
||||
child: NetworkImageLoader(
|
||||
imageUrl: movie?.coverV ?? '',
|
||||
borderRadius: 8,
|
||||
),
|
||||
),
|
||||
10.sizeBoxW,
|
||||
Expanded(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||
children: [
|
||||
rankBadge(index),
|
||||
//标题
|
||||
Text(
|
||||
movie?.title ?? '',
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: const TextStyle(
|
||||
color: Color(0xE5FFFFFF),
|
||||
fontSize: 12,
|
||||
height: 1.5,
|
||||
),
|
||||
),
|
||||
//集数 · 更新状态
|
||||
Text(
|
||||
'${movie?.episodeNumberStatus ?? ''} · ${movie?.updateDesc ?? ''}',
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(
|
||||
fontSize: 11,
|
||||
color: _statusColor,
|
||||
fontWeight: FontWeight.w400,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
//连载中金色,已完结半透明白
|
||||
Color get _statusColor => movie?.updateStatus == 1
|
||||
? const Color(0xffEEC76B)
|
||||
: Colors.white.withValues(alpha: .45);
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:hgdj/assets_tool/images.dart';
|
||||
import 'package:hgdj/extension/extensions.dart';
|
||||
import 'package:hgdj/hj_model/video_model.dart';
|
||||
import 'package:hgdj/hj_page/find/pic_collect/pics_detail_page.dart';
|
||||
import 'package:hgdj/hj_page/find/rank_module/rank_badge.dart';
|
||||
import 'package:hgdj/hj_utils/screen.dart';
|
||||
import 'package:hgdj/tools_base/widget/net_image_widget.dart';
|
||||
|
||||
//图集排行榜item
|
||||
class ImageRankItem extends StatelessWidget {
|
||||
final int index;
|
||||
final VideoModel? movie;
|
||||
|
||||
const ImageRankItem(this.index, this.movie, {super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return InkWell(
|
||||
enableFeedback: false,
|
||||
onTap: () =>
|
||||
Get.to(PicsDetailPage(id: movie?.id), preventDuplicates: false),
|
||||
child: SizedBox(
|
||||
height: 108,
|
||||
child: Row(
|
||||
children: [
|
||||
//封面
|
||||
SizedBox(
|
||||
width: 80,
|
||||
height: 108,
|
||||
child: NetworkImageLoader(
|
||||
imageUrl: movie?.cover ?? '',
|
||||
borderRadius: 8,
|
||||
),
|
||||
),
|
||||
10.sizeBoxW,
|
||||
Expanded(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||
children: [
|
||||
rankBadge(index),
|
||||
//标题
|
||||
Text(
|
||||
movie?.title ?? '',
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: const TextStyle(
|
||||
color: Color(0xE5FFFFFF),
|
||||
fontSize: 12,
|
||||
height: 1.5,
|
||||
),
|
||||
),
|
||||
//浏览量 + 收藏量
|
||||
Row(
|
||||
children: [
|
||||
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),
|
||||
),
|
||||
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),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hgdj/assets_tool/images.dart';
|
||||
import 'package:hgdj/hj_utils/screen.dart';
|
||||
|
||||
/// 榜单名次徽标「皇冠 + NO.1」:影视 / 图集 / 动漫 / 帖子四种 item 共用,改样式只改这一处
|
||||
Widget rankBadge(int index) {
|
||||
final color = _rankColor(index);
|
||||
return Row(
|
||||
children: [
|
||||
//4 个名次共用同一张皇冠形状图,只换颜色
|
||||
Image.asset("rank_crown.webp".homePath, width: 24, color: color),
|
||||
4.sizeBoxW,
|
||||
Text("NO.${index + 1}", style: TextStyle(color: color, fontSize: 14)),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
/// 名次配色:金 / 粉 / 蓝,第 4 名往后统一灰
|
||||
Color _rankColor(int index) => switch (index) {
|
||||
0 => const Color(0xffFFD059),
|
||||
1 => const Color(0xffF24A71),
|
||||
2 => const Color(0xff5DCAE7),
|
||||
_ => const Color(0xffbdbdbd),
|
||||
};
|
||||
@@ -0,0 +1,21 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:hgdj/hj_utils/const.dart';
|
||||
|
||||
class RankMainLogic extends GetxController with GetTickerProviderStateMixin {
|
||||
RankMainLogic({int initIndex = 0}) : _initIndex = initIndex;
|
||||
|
||||
final int _initIndex;
|
||||
|
||||
//榜单类型,顺序即 tab 顺序
|
||||
static const tabs = [MediaStyle.Video, MediaStyle.Community, MediaStyle.Pic];
|
||||
|
||||
late final TabController tabCtr =
|
||||
TabController(initialIndex: _initIndex, length: tabs.length, vsync: this);
|
||||
|
||||
@override
|
||||
void onClose() {
|
||||
tabCtr.dispose();
|
||||
super.onClose();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:hgdj/hj_page/find/rank_module/rank_type_tab_view.dart';
|
||||
import 'package:hgdj/hj_utils/const.dart';
|
||||
import 'package:hgdj/tools_base/indicator/custom_tab_indicator.dart';
|
||||
import 'package:hgdj/tools_base/unique_tag_mixin.dart';
|
||||
import 'package:hgdj/tools_base/widget/keep_alive_widget.dart';
|
||||
|
||||
import 'rank_main_logic.dart';
|
||||
|
||||
/// 排行榜主页:顶部 TabBar 切换榜单类型(影片/帖子/图集),下方 TabBarView 展示各类型榜单列表。
|
||||
class RankMainPage extends StatefulWidget {
|
||||
final int index; // 初始选中的 Tab 下标
|
||||
|
||||
const RankMainPage({super.key, this.index = 0});
|
||||
|
||||
@override
|
||||
State<RankMainPage> createState() => _RankMainPageState();
|
||||
}
|
||||
|
||||
class _RankMainPageState extends State<RankMainPage> with UniqueTagMixin {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return GetBuilder<RankMainLogic>(
|
||||
init: RankMainLogic(initIndex: widget.index),
|
||||
tag: uniqueTag,
|
||||
builder: (logic) => Scaffold(
|
||||
appBar: AppBar(title: const Text('热门排行')),
|
||||
body: Column(
|
||||
children: [
|
||||
//顶部:榜单类型 Tab
|
||||
Container(
|
||||
height: 44,
|
||||
alignment: Alignment.center,
|
||||
child: TabBar(
|
||||
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)))
|
||||
.toList(),
|
||||
labelPadding: const EdgeInsets.symmetric(horizontal: 3),
|
||||
unselectedLabelColor: const Color(0x8CFFFFFF),
|
||||
unselectedLabelStyle:
|
||||
const TextStyle(fontSize: 14, fontWeight: FontWeight.w400),
|
||||
labelColor: const Color(0xE5FFFFFF),
|
||||
labelStyle:
|
||||
const TextStyle(fontSize: 14, fontWeight: FontWeight.w500),
|
||||
indicator: CustomIndicator(
|
||||
height: 3,
|
||||
width: 13,
|
||||
isGradient: true,
|
||||
offsetY: 2,
|
||||
borderRadius: BorderRadius.circular(1.5),
|
||||
),
|
||||
),
|
||||
),
|
||||
//下方:各榜单类型对应的列表(keepAlive 切换不重建)
|
||||
Expanded(
|
||||
child: TabBarView(
|
||||
controller: logic.tabCtr,
|
||||
children: RankMainLogic.tabs
|
||||
.map((e) => RankTypeTabView(e).keepAlive)
|
||||
.toList(),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hgdj/hj_utils/screen.dart';
|
||||
|
||||
/// 榜单周期 Tab:周榜 / 月榜 / 年榜 / 总榜,项间用一条竖线分隔、无下划线指示器。
|
||||
/// 不用自己监听 controller 重绘——TabBar 内部就挂着 animation 监听
|
||||
class RankSortTabBar extends StatelessWidget {
|
||||
final List<String> titles;
|
||||
final TabController? tabCtr;
|
||||
|
||||
const RankSortTabBar({super.key, required this.titles, this.tabCtr});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return TabBar(
|
||||
controller: tabCtr,
|
||||
tabs: titles
|
||||
.asMap()
|
||||
.entries
|
||||
.map((e) => Row(
|
||||
children: [
|
||||
Container(
|
||||
padding:
|
||||
const EdgeInsets.symmetric(horizontal: 18, vertical: 3),
|
||||
child: Text(e.value),
|
||||
),
|
||||
if (e.key != titles.length - 1) 12.lineV,
|
||||
],
|
||||
))
|
||||
.toList(),
|
||||
isScrollable: true,
|
||||
labelPadding: EdgeInsets.zero,
|
||||
labelStyle: const TextStyle(
|
||||
fontSize: 14,
|
||||
height: 1.5,
|
||||
color: Color(0xE5FFFFFF),
|
||||
fontWeight: FontWeight.w500,
|
||||
),
|
||||
unselectedLabelStyle: const TextStyle(
|
||||
fontSize: 14,
|
||||
height: 1.5,
|
||||
fontWeight: FontWeight.w400,
|
||||
color: Color(0x8CFFFFFF),
|
||||
),
|
||||
indicator: const BoxDecoration(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
import 'package:hgdj/hj_utils/api_service/acg_service.dart';
|
||||
import 'package:hgdj/hj_utils/const.dart';
|
||||
import 'package:hgdj/hj_utils/api_service/vid_service.dart';
|
||||
import 'package:hgdj/tools_base/base_list_controller.dart';
|
||||
|
||||
class RankSubPageLogic extends ListBaseLogic<dynamic> {
|
||||
final MediaStyle pageType; // 榜单媒体类型:影片/帖子/图集/漫画等
|
||||
final int sortType; // 榜单周期:2周 3月 5年 4总
|
||||
|
||||
RankSubPageLogic({required this.pageType, this.sortType = 2});
|
||||
|
||||
bool get isACG =>
|
||||
pageType == MediaStyle.Comics || pageType == MediaStyle.Cartoon;
|
||||
|
||||
// onInit(挂载即同步触发,比 onReady 的帧后回调在嵌套 keepAlive 下可靠)
|
||||
@override
|
||||
void onInit() {
|
||||
super.onInit();
|
||||
loadData();
|
||||
}
|
||||
|
||||
// 下拉刷新 / 上拉加载;showLoading 用于重试时先清空显示 loading。
|
||||
// 必须把 Future 交出去:CErrorWidget 靠它做重试 loading + 防连点
|
||||
Future<void> loadData({bool isRefresh = true, bool showLoading = false}) {
|
||||
if (showLoading) {
|
||||
dataList = null;
|
||||
update();
|
||||
}
|
||||
return fetchData(isRefresh: isRefresh, fetch: _fetch);
|
||||
}
|
||||
|
||||
// 拉取榜单: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);
|
||||
return (resp?.list, resp?.hasNext == true);
|
||||
}
|
||||
final res = await VidService.vidRanking(page, 10,
|
||||
newsType: pageType.rankParam, type: sortType);
|
||||
return (res?.videos, res?.hasNext == true);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:hgdj/hj_model/video_model.dart';
|
||||
import 'package:hgdj/hj_page/find/rank_module/video_rank_item.dart';
|
||||
import 'package:hgdj/hj_utils/const.dart';
|
||||
import 'package:hgdj/hj_utils/screen.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 '../../community/widget/community_post_widget.dart';
|
||||
import 'acg_rank_item.dart';
|
||||
import 'image_rank_item.dart';
|
||||
import 'rank_sub_logic.dart';
|
||||
|
||||
class RankSubPage extends StatefulWidget {
|
||||
final MediaStyle pageType;
|
||||
final int sortType; //榜单周期:2周 3月 5年 4总
|
||||
|
||||
const RankSubPage({super.key, required this.pageType, this.sortType = 2});
|
||||
|
||||
@override
|
||||
State<RankSubPage> createState() => _RankSubPageState();
|
||||
}
|
||||
|
||||
// UniqueTagMixin:每次挂载都是全新 tag/controller,保证 onInit 触发、避免复用旧 logic
|
||||
class _RankSubPageState extends State<RankSubPage> with UniqueTagMixin {
|
||||
late final RankSubPageLogic logic = RankSubPageLogic(
|
||||
pageType: widget.pageType,
|
||||
sortType: widget.sortType,
|
||||
);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return GetBuilder<RankSubPageLogic>(
|
||||
init: logic,
|
||||
tag: uniqueTag,
|
||||
builder: (_) => pullYsRefresh(
|
||||
onInit: (ctr) => logic.refreshCtr = ctr,
|
||||
onRefresh: (ctr) => logic.loadData(),
|
||||
onLoading: (ctr) => logic.loadData(isRefresh: false),
|
||||
child: _buildContent(),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildContent() {
|
||||
if (logic.isLoading) return LoadingCenterWidget();
|
||||
//retryOnTap 要拿到 Future 才有 loading + 防连点
|
||||
if (logic.isEmptyData)
|
||||
return CErrorWidget(retryOnTap: () => logic.loadData(showLoading: true));
|
||||
final list = logic.dataList ?? const [];
|
||||
return ListView.separated(
|
||||
keyboardDismissBehavior: ScrollViewKeyboardDismissBehavior.onDrag,
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
|
||||
itemCount: list.length,
|
||||
separatorBuilder: (_, __) => 10.sizeBoxH,
|
||||
itemBuilder: (_, index) => switch (logic.pageType) {
|
||||
MediaStyle.Video => VideoRankItem(index, list[index]),
|
||||
MediaStyle.Pic => ImageRankItem(index, list[index]),
|
||||
//帖子要能左右滑浏览同榜其他帖,整表一起递进去(cast 是惰性视图,不拷贝)
|
||||
MediaStyle.Community => CommunityPostWidget(
|
||||
padding: EdgeInsets.zero,
|
||||
videoModel: list[index],
|
||||
videoModels: list.cast<VideoModel>(),
|
||||
rankIndex: index,
|
||||
),
|
||||
MediaStyle.Cartoon ||
|
||||
MediaStyle.Comics =>
|
||||
ACGRankItem(index, list[index]),
|
||||
_ => const SizedBox.shrink(),
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hgdj/hj_page/find/rank_module/rank_sort_tab_bar.dart';
|
||||
import 'package:hgdj/hj_utils/const.dart';
|
||||
import 'package:hgdj/hj_utils/screen.dart';
|
||||
import 'package:hgdj/tools_base/widget/keep_alive_widget.dart';
|
||||
|
||||
import 'rank_sub_page.dart';
|
||||
|
||||
/// 某一类榜单(影片/帖子/图集/动漫…)下的周期分页:周榜 / 月榜 / 年榜 / 总榜
|
||||
class RankTypeTabView extends StatefulWidget {
|
||||
final MediaStyle pageType;
|
||||
|
||||
const RankTypeTabView(this.pageType, {super.key});
|
||||
|
||||
@override
|
||||
State<RankTypeTabView> createState() => _RankTypeTabViewState();
|
||||
}
|
||||
|
||||
class _RankTypeTabViewState extends State<RankTypeTabView>
|
||||
with SingleTickerProviderStateMixin {
|
||||
//标题与后端 sortType 绑在一起,避免两个数组分家后漏改一处就错位
|
||||
static const _tabs = [
|
||||
SortTab('周榜', 2),
|
||||
SortTab('月榜', 3),
|
||||
SortTab('年榜', 5),
|
||||
SortTab('总榜', 4),
|
||||
];
|
||||
|
||||
late final TabController tabCtr =
|
||||
TabController(length: _tabs.length, vsync: this);
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
tabCtr.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Column(
|
||||
children: [
|
||||
RankSortTabBar(
|
||||
titles: _tabs.map((e) => e.name).toList(), tabCtr: tabCtr),
|
||||
8.sizeBoxH,
|
||||
Expanded(
|
||||
child: TabBarView(
|
||||
controller: tabCtr,
|
||||
children: _tabs
|
||||
.map((e) =>
|
||||
RankSubPage(pageType: widget.pageType, sortType: e.sort)
|
||||
.keepAlive)
|
||||
.toList(),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hgdj/assets_tool/images.dart';
|
||||
import 'package:hgdj/extension/extensions.dart';
|
||||
import 'package:hgdj/hj_model/video_model.dart';
|
||||
import 'package:hgdj/hj_page/find/rank_module/rank_badge.dart';
|
||||
import 'package:hgdj/hj_utils/screen.dart';
|
||||
import 'package:hgdj/routers/jump_router.dart';
|
||||
import 'package:hgdj/tools_base/widget/net_image_widget.dart';
|
||||
|
||||
//影视排行榜item
|
||||
class VideoRankItem extends StatelessWidget {
|
||||
final int index;
|
||||
final VideoModel? movie;
|
||||
|
||||
const VideoRankItem(this.index, this.movie, {super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return InkWell(
|
||||
enableFeedback: false,
|
||||
onTap: () => pushToVideoPage(videoModel: movie),
|
||||
child: SizedBox(
|
||||
height: 95,
|
||||
child: Row(
|
||||
children: [
|
||||
//横版封面,左下播放量、右下时长
|
||||
SizedBox(
|
||||
width: 168,
|
||||
height: 95,
|
||||
child: Stack(
|
||||
fit: StackFit.expand,
|
||||
children: [
|
||||
NetworkImageLoader(
|
||||
imageUrl: movie?.cover ?? '', borderRadius: 8),
|
||||
Container(
|
||||
alignment: Alignment.bottomCenter,
|
||||
padding: const EdgeInsets.fromLTRB(5, 0, 5, 5),
|
||||
child: Row(
|
||||
children: [
|
||||
Image.asset('circle_play.webp'.videoPath, width: 16),
|
||||
Text(
|
||||
movie?.playCount?.countStr ?? '0',
|
||||
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),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
10.sizeBoxW,
|
||||
Expanded(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||
children: [
|
||||
rankBadge(index),
|
||||
//末尾补个换行:单行标题也占满两行高,三行内容的间距才不会随标题长短跳
|
||||
Text(
|
||||
"${movie?.title ?? ''}\n",
|
||||
maxLines: 2,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: const TextStyle(
|
||||
color: Color(0xE5FFFFFF), fontSize: 12, height: 1.5),
|
||||
),
|
||||
//收藏量
|
||||
Row(
|
||||
children: [
|
||||
Image.asset("collect_start.webp".homePath, width: 14),
|
||||
5.sizeBoxW,
|
||||
Text(
|
||||
movie?.collectCount?.countStr ?? "0",
|
||||
style: const TextStyle(
|
||||
color: Color(0xff989898), fontSize: 12),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user