// Author: fruit.com.cn import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../../core/data/models/drama.dart'; import '../../core/data/services/catalog_controller.dart'; import '../discover/discover_logic.dart'; import '../drama_detail/drama_detail_view.dart'; import '../mine/mine_logic.dart'; import '../player/player_view.dart'; class HomeLogic extends ChangeNotifier { HomeLogic(List dramas) : currentDrama = dramas.first; final scaffoldKey = GlobalKey(); Drama currentDrama; int tab = 0; int searchRequest = 0; int sectionRequest = 0; int resumeRequest = 0; int backRequest = 0; int mySection = 0; bool drawerOpen = false; bool detailOpen = false; bool videoImmersive = false; bool profile = false; bool _disposed = false; void notify() { if (!_disposed) notifyListeners(); } void select( int nextTab, { bool search = false, bool watchlist = false, bool resume = false, int? mySection, }) { FocusManager.instance.primaryFocus?.unfocus(); tab = nextTab; if (search) searchRequest++; if (watchlist || mySection != null) { this.mySection = mySection ?? 1; sectionRequest++; } if (resume) resumeRequest++; notify(); } void setMenuOpen(bool value) { if (drawerOpen == value) return; drawerOpen = value; notify(); } void selectFromMenu(int nextTab, {int? mySection}) { drawerOpen = false; select(nextTab, mySection: mySection); } 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) async { // 列表卡片只有一集预览,进入播放前补齐完整剧集,否则选集列表是空的。 var playable = drama; try { playable = await context.read().requireDetail(drama); } catch (_) { // 取详情失败就用卡片自带的那一集起播。 } if (!context.mounted) return; Navigator.of(context).push( MaterialPageRoute( builder: (_) => PlayerPage(drama: playable, initialIndex: 0), ), ); } void openProfile() { profile = true; select(2, mySection: 0); } void openLibrary({int section = 1}) { profile = false; select(2, mySection: section); } void discoverAction(BuildContext context, DiscoverPageAction action) { switch (action) { case DiscoverPageAction.home: select(0); case DiscoverPageAction.my: select(2); case DiscoverPageAction.watchlist: openLibrary(); case DiscoverPageAction.resume: select(0, resume: true); case DiscoverPageAction.detail: openDrama(context, currentDrama); } } void myAction(MyPageAction action) { switch (action) { case MyPageAction.home: select(0); case MyPageAction.discover: select(1, search: true); case MyPageAction.resume: select(0, resume: true); } } void onSystemBack() { if (videoImmersive) { backRequest++; notify(); } else if (tab != 1) { select(1); } } void onDramaChanged(Drama drama) { currentDrama = drama; notify(); } void onImmersiveChanged(bool value) { videoImmersive = value; notify(); } @override void dispose() { _disposed = true; super.dispose(); } }