fix(detail): 选集改为等宽懒加载网格
This commit is contained in:
1 parent
cbbd4c80e4
commit
fbfb9769a0
2 files changed
+135
-20
No files matched your search
@@ -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}',
|
||||
|
||||
Reference in new issue
Block a user