// Author: fruit.com.cn import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import '../../core/data/models/drama.dart'; import '../discover/discover_types.dart'; import '../drama_detail/drama_detail_view.dart'; import '../favorites/favorites_page.dart'; import '../mine/mine_types.dart'; import '../player/open_player.dart'; import '../watch_records/watch_records_page.dart'; class HomeLogic extends ChangeNotifier { HomeLogic(List dramas) : currentDrama = dramas.first; final scaffoldKey = GlobalKey(); Drama currentDrama; int tab = 0; int searchRequest = 0; int resumeRequest = 0; int backRequest = 0; bool drawerOpen = false; bool detailOpen = false; bool videoImmersive = false; bool _dramaNotifyScheduled = false; bool _disposed = false; void notify() { if (!_disposed) notifyListeners(); } void select(int nextTab, {bool search = false, bool resume = false}) { FocusManager.instance.primaryFocus?.unfocus(); tab = nextTab; if (search) searchRequest++; if (resume) resumeRequest++; notify(); } void setMenuOpen(bool value) { if (drawerOpen == value) return; drawerOpen = value; notify(); } Future openCurrentSeries(BuildContext context) async { detailOpen = true; notify(); await WidgetsBinding.instance.endOfFrame; if (!context.mounted) return; try { await Navigator.of(context).push( MaterialPageRoute(builder: (_) => DramaDetailPage(drama: currentDrama)), ); } finally { if (context.mounted) { detailOpen = false; notify(); } } } void openDrama(BuildContext context, Drama drama) { Navigator.of(context).push( MaterialPageRoute(builder: (_) => DramaDetailPage(drama: drama)), ); } Future playDrama( BuildContext context, Drama drama, { String? episodeId, }) => playDramaFromCatalog(context, drama, episodeId: episodeId); void openProfile() => select(3); void discoverAction(DiscoverPageAction action) { switch (action) { case DiscoverPageAction.home: select(0); case DiscoverPageAction.recommend: select(1, search: true); case DiscoverPageAction.following: select(2); case DiscoverPageAction.mine: select(3); } } void openFavorites(BuildContext context) { Navigator.of( context, ).push(MaterialPageRoute(builder: (_) => const FavoritesPage())); } void openHistory(BuildContext context) { Navigator.of( context, ).push(MaterialPageRoute(builder: (_) => const WatchRecordsPage())); } void myAction(MyPageAction action) { switch (action) { case MyPageAction.home: select(0); case MyPageAction.recommend: select(1, search: true); case MyPageAction.following: select(2); case MyPageAction.mine: select(3); case MyPageAction.resume: select(0, resume: true); } } void onSystemBack() { if (videoImmersive) { backRequest++; notify(); } else if (tab != 0) { select(0); } } void onDramaChanged(Drama drama) { currentDrama = drama; if (SchedulerBinding.instance.schedulerPhase == SchedulerPhase.idle) { notify(); return; } if (_dramaNotifyScheduled || _disposed) return; _dramaNotifyScheduled = true; WidgetsBinding.instance.addPostFrameCallback((_) { _dramaNotifyScheduled = false; if (!_disposed) notify(); }); SchedulerBinding.instance.scheduleFrame(); } void onImmersiveChanged(bool value) { videoImmersive = value; notify(); } @override void dispose() { _disposed = true; super.dispose(); } }