fix(recommend): 延后推荐数据刷新

This commit is contained in:
Zhou Weidong committed 2026-10-27 09:19:18 +08:00
1 parent 6be024f86f
commit 4b97f89c0b
2 files changed
+218 -5

No files matched your search

+35 -5
View File
@@ -14,6 +14,7 @@ import '../../core/data/services/playlist_controller.dart';
import '../../core/theme/app_colors.dart';
import '../../core/widgets/empty_state.dart';
import '../../l10n/app_localizations.dart';
import '../home/home_feed_channel.dart';
import '../player/open_player.dart';
import '../player/player_view.dart';
import 'recommend_types.dart';
@@ -51,6 +52,8 @@ class _RecommendPageState extends State<RecommendPage>
RecommendInnerTab _tab = RecommendInnerTab.feed;
final PageController _pageController = PageController();
int _scrubCancelRequest = 0;
bool _recommendDataRefreshScheduled = false;
HomeFeedChannel? _observedFeedChannel;
@override
bool get wantKeepAlive => true;
@@ -58,22 +61,48 @@ class _RecommendPageState extends State<RecommendPage>
@override
void initState() {
super.initState();
_observedFeedChannel = widget.feedController.channel;
widget.feedController.addListener(_handleFeedControllerChanged);
if (widget.active) _scheduleRecommendData();
}
@override
void didUpdateWidget(RecommendPage oldWidget) {
super.didUpdateWidget(oldWidget);
if (widget.active && !oldWidget.active) _scheduleRecommendData();
if (oldWidget.feedController != widget.feedController) {
oldWidget.feedController.removeListener(_handleFeedControllerChanged);
_observedFeedChannel = widget.feedController.channel;
widget.feedController.addListener(_handleFeedControllerChanged);
}
if (_requiresRecommendDataRefresh(oldWidget)) {
_scheduleRecommendData();
}
}
bool _requiresRecommendDataRefresh(RecommendPage oldWidget) {
if (!widget.active) return false;
return !oldWidget.active ||
oldWidget.feedController != widget.feedController ||
oldWidget.catalogApi != widget.catalogApi;
}
void _handleFeedControllerChanged() {
final channel = widget.feedController.channel;
if (channel == _observedFeedChannel) return;
_observedFeedChannel = channel;
if (widget.active) _scheduleRecommendData();
}
void _scheduleRecommendData() {
final feed = widget.feedController;
if (!feed.loaded && !feed.loadingFirstPage) {
unawaited(feed.refreshCurrent());
}
if (_recommendDataRefreshScheduled) return;
_recommendDataRefreshScheduled = true;
WidgetsBinding.instance.addPostFrameCallback((_) {
_recommendDataRefreshScheduled = false;
if (!mounted || !widget.active) return;
final feed = widget.feedController;
if (!feed.loaded && !feed.loadingFirstPage) {
unawaited(feed.refreshCurrent());
}
final playlists = _readPlaylists();
if (playlists != null && !playlists.loaded && !playlists.loading) {
unawaited(playlists.load());
@@ -83,6 +112,7 @@ class _RecommendPageState extends State<RecommendPage>
@override
void dispose() {
widget.feedController.removeListener(_handleFeedControllerChanged);
_pageController.dispose();
super.dispose();
}