fix(recommend): 延后推荐数据刷新
This commit is contained in:
1 parent
6be024f86f
commit
4b97f89c0b
2 files changed
+218
-5
No files matched your search
@@ -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();
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user