fix(player): 修复竖滑上一集不自动播放

This commit is contained in:
Zhou Weidong committed 2026-10-26 13:43:43 +08:00
1 parent df36890b48
commit 516593499c
10 files changed
+264 -80

No files matched your search

@@ -8,25 +8,33 @@ import 'package:flutter/material.dart';
import '../../../core/config/app_config.dart';
import '../../../core/data/services/sprite_thumbnail_asset_loader.dart';
import '../../../core/data/services/sprite_thumbnail_axis.dart';
import '../../../core/theme/app_colors.dart';
import '../../../core/widgets/remote_image.dart';
import 'scrub_preview_card.dart';
/// 无雪碧图地址时不垫帧,交还给纯黑底。
Widget? playerOpeningFrame(String? thumbnailsUrl) {
/// 封面立即可见,雪碧图首帧解码完成后再覆盖封面。
Widget? playerOpeningFrame(String? thumbnailsUrl, {String? posterUrl}) {
final url = thumbnailsUrl?.trim() ?? '';
if (url.isEmpty) return null;
return PlayerOpeningFrame(thumbnailsUrl: url);
final poster = posterUrl?.trim() ?? '';
if (url.isEmpty && poster.isEmpty) return null;
return PlayerOpeningFrame(
thumbnailsUrl: url.isEmpty ? null : url,
posterUrl: poster.isEmpty ? null : poster,
);
}
/// 解码出视频画面前,用本集雪碧图第一帧垫底。
/// 视频解码前依次使用封面和雪碧图首帧,最终由父层黑色兜底。
class PlayerOpeningFrame extends StatefulWidget {
const PlayerOpeningFrame({
super.key,
required this.thumbnailsUrl,
this.thumbnailsUrl,
this.posterUrl,
this.loader,
this.cache,
});
final String thumbnailsUrl;
final String? thumbnailsUrl;
final String? posterUrl;
final SpriteThumbnailAssetLoader? loader;
final OpeningFrameCache? cache;
@@ -55,8 +63,10 @@ class _PlayerOpeningFrameState extends State<PlayerOpeningFrame> {
Future<void> _load() async {
final serial = ++_serial;
final thumbnailsUrl = widget.thumbnailsUrl;
if (thumbnailsUrl == null) return;
final frame = await (widget.cache ?? OpeningFrameCache.shared).load(
widget.thumbnailsUrl,
thumbnailsUrl,
loader: widget.loader,
);
if (!mounted || serial != _serial) return;
@@ -66,11 +76,25 @@ class _PlayerOpeningFrameState extends State<PlayerOpeningFrame> {
@override
Widget build(BuildContext context) {
final frame = _frame;
if (frame == null) return const SizedBox.expand();
return SpriteCropPreview(
key: const Key('player-opening-sprite'),
image: frame.image,
sourceRect: frame.sourceRect,
final posterUrl = widget.posterUrl;
return Stack(
fit: StackFit.expand,
children: [
const ColoredBox(color: AppColors.mediaBlack),
if (posterUrl != null)
RemoteImage(
posterUrl,
key: const Key('player-opening-poster'),
fit: BoxFit.cover,
fallbackColor: AppColors.mediaBlack,
),
if (frame != null)
SpriteCropPreview(
key: const Key('player-opening-sprite'),
image: frame.image,
sourceRect: frame.sourceRect,
),
],
);
}
}