// Author: fruit.com.cn import 'package:flutter/material.dart'; import '../../core/data/models/drama.dart'; import '../discover/discover_logic.dart'; import '../drama_detail/drama_detail_view.dart'; import '../mine/mine_logic.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 _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 openMenu() { drawerOpen = true; notify(); scaffoldKey.currentState?.openDrawer(); } void selectFromMenu(int nextTab, {int? mySection}) { scaffoldKey.currentState?.closeDrawer(); select(nextTab, mySection: mySection); } Future openCurrentSeries(BuildContext context) async { detailOpen = true; notify(); scaffoldKey.currentState?.closeDrawer(); 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)), ); } void discoverAction(BuildContext context, DiscoverPageAction action) { switch (action) { case DiscoverPageAction.home: select(0); case DiscoverPageAction.my: select(2); case DiscoverPageAction.watchlist: select(2, watchlist: true); 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 (drawerOpen) { scaffoldKey.currentState?.closeDrawer(); } else if (videoImmersive) { backRequest++; notify(); } else if (tab != 0) { select(0); } else { backRequest++; notify(); } } void onDrawerChanged(bool opened) { if (drawerOpen == opened) return; drawerOpen = opened; notify(); } void onDramaChanged(Drama drama) { currentDrama = drama; notify(); } void onImmersiveChanged(bool value) { videoImmersive = value; notify(); } @override void dispose() { _disposed = true; super.dispose(); } }