Files
ReelShort/lib/pages/home/home_logic.dart
T

163 lines
3.9 KiB
Dart

// 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<Drama> dramas) : currentDrama = dramas.first;
final scaffoldKey = GlobalKey<ScaffoldState>();
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<void> openCurrentSeries(BuildContext context) async {
detailOpen = true;
notify();
await WidgetsBinding.instance.endOfFrame;
if (!context.mounted) return;
try {
await Navigator.of(context).push<void>(
MaterialPageRoute(builder: (_) => DramaDetailPage(drama: currentDrama)),
);
} finally {
if (context.mounted) {
detailOpen = false;
notify();
}
}
}
void openDrama(BuildContext context, Drama drama) {
Navigator.of(context).push(
MaterialPageRoute<void>(builder: (_) => DramaDetailPage(drama: drama)),
);
}
Future<void> playDrama(BuildContext context, Drama drama) async {
// 列表卡片只有一集预览,进入播放前补齐完整剧集,否则选集列表是空的。
var playable = drama;
try {
playable = await context.read<CatalogController>().requireDetail(drama);
} catch (_) {
// 取详情失败就用卡片自带的那一集起播。
}
if (!context.mounted) return;
Navigator.of(context).push(
MaterialPageRoute<void>(
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();
}
}