1
This commit is contained in:
@@ -3,6 +3,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:share_plus/share_plus.dart';
|
||||
|
||||
import '../../../core/media/download_manager.dart';
|
||||
import '../../../core/player/feed_player_pool.dart';
|
||||
import '../../../core/theme/app_theme.dart';
|
||||
import '../../../models/video_item.dart';
|
||||
@@ -25,6 +26,7 @@ class FeedVideoPage extends ConsumerStatefulWidget {
|
||||
required this.onLike,
|
||||
this.onFavorite,
|
||||
this.onComment,
|
||||
this.onReturnFromPlayer,
|
||||
});
|
||||
|
||||
final VideoItem item;
|
||||
@@ -35,6 +37,9 @@ class FeedVideoPage extends ConsumerStatefulWidget {
|
||||
final void Function(int videoId)? onFavorite;
|
||||
final void Function(VideoItem item)? onComment;
|
||||
|
||||
/// 从全屏播放器返回后的恢复回调(重新绑定 Feed 当前页)
|
||||
final VoidCallback? onReturnFromPlayer;
|
||||
|
||||
@override
|
||||
ConsumerState<FeedVideoPage> createState() => _FeedVideoPageState();
|
||||
}
|
||||
@@ -89,7 +94,10 @@ class _FeedVideoPageState extends ConsumerState<FeedVideoPage> {
|
||||
shape: const RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.vertical(top: Radius.circular(16)),
|
||||
),
|
||||
builder: (sheetContext) => Padding(
|
||||
builder: (sheetContext) => Theme(
|
||||
// 弹窗是白底,APP 主题为暗色(默认白字),需显式套用亮色主题
|
||||
data: ThemeData.light(),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.fromLTRB(20, 20, 20, 12),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
@@ -165,8 +173,38 @@ class _FeedVideoPageState extends ConsumerState<FeedVideoPage> {
|
||||
_share();
|
||||
},
|
||||
),
|
||||
|
||||
// 下载(已下载/下载中置灰)
|
||||
Builder(builder: (_) {
|
||||
final dm = ref.read(downloadManagerProvider);
|
||||
final downloaded = dm.items
|
||||
.any((e) => e.videoId == widget.item.videoId);
|
||||
final downloading =
|
||||
dm.progress.containsKey(widget.item.videoId);
|
||||
return ListTile(
|
||||
contentPadding: EdgeInsets.zero,
|
||||
leading: Icon(downloaded
|
||||
? Icons.check_circle_outline
|
||||
: Icons.download_outlined),
|
||||
title: Text(downloaded
|
||||
? '已下载'
|
||||
: (downloading ? '下载中…' : '下载')),
|
||||
enabled: !downloaded && !downloading,
|
||||
onTap: () {
|
||||
Navigator.of(sheetContext).pop();
|
||||
showTopToast(context, '开始下载,可在「我的 → 已下载」查看');
|
||||
ref
|
||||
.read(downloadManagerProvider.notifier)
|
||||
.start(widget.item)
|
||||
.catchError((_) {
|
||||
if (mounted) showTopToast(context, '下载失败,请重试');
|
||||
});
|
||||
},
|
||||
);
|
||||
}),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
@@ -185,7 +223,9 @@ class _FeedVideoPageState extends ConsumerState<FeedVideoPage> {
|
||||
shape: const RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.vertical(top: Radius.circular(16)),
|
||||
),
|
||||
builder: (_) => DraggableScrollableSheet(
|
||||
builder: (_) => Theme(
|
||||
data: ThemeData.light(),
|
||||
child: DraggableScrollableSheet(
|
||||
initialChildSize: 0.6,
|
||||
minChildSize: 0.4,
|
||||
maxChildSize: 0.9,
|
||||
@@ -273,6 +313,7 @@ class _FeedVideoPageState extends ConsumerState<FeedVideoPage> {
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
@@ -287,10 +328,13 @@ class _FeedVideoPageState extends ConsumerState<FeedVideoPage> {
|
||||
duration: (ep['duration'] as num?)?.toInt() ?? 0,
|
||||
author: widget.item.author,
|
||||
);
|
||||
// 先暂停 Feed 页播放器,再打开 SimplePlayerScreen
|
||||
widget.pool.pauseExcept(slotIndex: -1);
|
||||
// 彻底停止 Feed 层播放器:stopAll 断音 + 断缓存下载(pause 不停止缓冲)
|
||||
widget.pool.stopAll();
|
||||
// ignore: use_build_context_synchronously
|
||||
context.push('/player', extra: newItem);
|
||||
context.push('/player', extra: newItem).then((_) {
|
||||
// 从播放器返回:恢复 Feed 当前页(槽位已清空,需重新绑定)
|
||||
if (mounted) widget.onReturnFromPlayer?.call();
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -327,6 +371,7 @@ class _FeedVideoPageState extends ConsumerState<FeedVideoPage> {
|
||||
slotIndex: widget.slotIndex,
|
||||
coverUrl: widget.item.coverUrl,
|
||||
isCurrent: widget.isCurrent,
|
||||
durationSeconds: widget.item.duration,
|
||||
),
|
||||
|
||||
// 双击爱心动画
|
||||
|
||||
Reference in New Issue
Block a user