fix(detail): 选集改为等宽懒加载网格

This commit is contained in:
Zhou Weidong committed 2026-10-19 16:32:09 +08:00
1 parent cbbd4c80e4
commit fbfb9769a0
2 files changed
+135 -20

No files matched your search

+40 -16
View File
@@ -303,14 +303,41 @@ class _DramaDetailPageState extends State<DramaDetailPage> {
),
),
const SizedBox(height: 8),
Wrap(
key: const Key('detail-episode-chips'),
spacing: 6,
runSpacing: 6,
children: [
for (var index = 0; index < drama.episodes.length; index++)
_episodeChip(context, drama, index, continueIndex),
],
LayoutBuilder(
builder: (context, constraints) {
final sixColumnsWidth = (constraints.maxWidth - 5 * 8) / 6;
final columns = sixColumnsWidth >= 40 ? 6 : 5;
final selectedIndex = continueIndex ?? 0;
final selectedNumber = drama.episodes.isEmpty
? null
: drama.episodes[selectedIndex].number;
final ordered = [
for (var index = 0; index < drama.episodes.length; index++)
(index: index, episode: drama.episodes[index]),
]..sort((a, b) => a.episode.number.compareTo(b.episode.number));
return GridView.builder(
key: const Key('detail-episode-chips'),
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
padding: EdgeInsets.zero,
itemCount: ordered.length,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: columns,
mainAxisSpacing: 8,
crossAxisSpacing: 8,
childAspectRatio: 1.35,
),
itemBuilder: (context, position) {
final item = ordered[position];
return _episodeChip(
context,
item.episode,
item.index,
selectedNumber,
);
},
);
},
),
],
),
@@ -319,20 +346,17 @@ class _DramaDetailPageState extends State<DramaDetailPage> {
Widget _episodeChip(
BuildContext context,
Drama drama,
Episode episode,
int index,
int? selectedIndex,
int? selectedNumber,
) {
final episode = drama.episodes[index];
final selected = index == (selectedIndex ?? 0);
final selected = episode.number == selectedNumber;
final locked = episode.locked || (!episode.isFree && index > 0);
return InkWell(
key: Key('detail-episode-chip-${episode.number}'),
onTap: () => logic.openPlayer(context, index),
borderRadius: BorderRadius.circular(20),
borderRadius: BorderRadius.circular(9),
child: Container(
constraints: const BoxConstraints(minWidth: 32, minHeight: 32),
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5),
alignment: Alignment.center,
decoration: BoxDecoration(
color: selected
@@ -340,7 +364,7 @@ class _DramaDetailPageState extends State<DramaDetailPage> {
: locked
? AppColors.secondary.withValues(alpha: 0.16)
: const Color(0xFF29272B),
borderRadius: BorderRadius.circular(20),
borderRadius: BorderRadius.circular(9),
),
child: Text(
'${episode.number}',