fix(player): 收藏与评论数实时刷新

This commit is contained in:
Zhou Weidong committed 2026-10-21 11:39:58 +08:00
1 parent 97bbced02c
commit 5e2b8d9e4d
11 files changed
+275 -29

No files matched your search

+21 -2
View File
@@ -35,6 +35,7 @@ class DramaDetailLogic extends ChangeNotifier {
int? continueIndex;
WatchProgress? progress;
String? progressError;
int _favoriteCountDelta = 0;
bool _disposed = false;
void notify() {
@@ -118,8 +119,26 @@ class DramaDetailLogic extends ChangeNotifier {
await loadContinue();
}
/// 收藏切换:乐观更新失败时会回滚,由调用方给出提示。
Future<bool> toggleFavorite() => favorites.toggle(drama.id, card: drama);
/// 详情页展示用的收藏数;没有服务端计数时继续保持缺省展示。
int? get adjustedFavoriteCount {
final base = drama.favoriteCount;
if (base == null) return null;
final adjusted = base + _favoriteCountDelta;
return adjusted < 0 ? 0 : adjusted;
}
/// 收藏切换:乐观状态由控制器负责回滚,这里只在成功后同步计数。
Future<bool> toggleFavorite() async {
final wasSaved = favorites.isSaved(drama.id);
final ok = await favorites.toggle(drama.id, card: drama);
if (!ok) return false;
final nowSaved = favorites.isSaved(drama.id);
if (nowSaved != wasSaved) {
_favoriteCountDelta += nowSaved ? 1 : -1;
notify();
}
return true;
}
@override
void dispose() {
@@ -142,7 +142,11 @@ class _DramaDetailPageState extends State<DramaDetailPage> {
),
),
SliverToBoxAdapter(
child: DramaStatsCard(l10n: l10n, drama: drama),
child: DramaStatsCard(
l10n: l10n,
drama: drama,
favoriteCount: logic.adjustedFavoriteCount,
),
),
SliverToBoxAdapter(
child: DramaSynopsisSection(
@@ -29,16 +29,23 @@ const TextStyle _synopsisStyle = TextStyle(
/// 详情页三项数据卡:热度、收藏与点赞,缺失值不做伪造。
class DramaStatsCard extends StatelessWidget {
const DramaStatsCard({super.key, required this.l10n, required this.drama});
const DramaStatsCard({
super.key,
required this.l10n,
required this.drama,
this.favoriteCount,
});
final AppLocalizations l10n;
final Drama drama;
final int? favoriteCount;
@override
Widget build(BuildContext context) {
final favorite = drama.favoriteCount == null
final currentFavoriteCount = favoriteCount ?? drama.favoriteCount;
final favorite = currentFavoriteCount == null
? l10n.episodeCountLabel(drama.episodeCount)
: '${formatInteractionCount(drama.favoriteCount!)} ${l10n.favorite}';
: '${formatInteractionCount(currentFavoriteCount)} ${l10n.favorite}';
final like = drama.likeCount == null
? '—'
: '${formatInteractionCount(drama.likeCount!)} ${l10n.like}';