v1.0.1
This commit is contained in:
318
lib/modules/comic/detail/comic_detail_controller.dart
Normal file
318
lib/modules/comic/detail/comic_detail_controller.dart
Normal file
@@ -0,0 +1,318 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter_dmzj/app/app_constant.dart';
|
||||
import 'package:flutter_dmzj/app/controller/base_controller.dart';
|
||||
import 'package:flutter_dmzj/app/event_bus.dart';
|
||||
import 'package:flutter_dmzj/app/log.dart';
|
||||
import 'package:flutter_dmzj/app/utils.dart';
|
||||
import 'package:flutter_dmzj/models/comic/detail_info.dart';
|
||||
import 'package:flutter_dmzj/models/db/comic_history.dart';
|
||||
import 'package:flutter_dmzj/modules/comic/detail/comic_detail_related_page.dart';
|
||||
import 'package:flutter_dmzj/requests/comic_request.dart';
|
||||
import 'package:flutter_dmzj/requests/user_request.dart';
|
||||
import 'package:flutter_dmzj/routes/app_navigator.dart';
|
||||
import 'package:flutter_dmzj/services/app_settings_service.dart';
|
||||
import 'package:flutter_dmzj/services/db_service.dart';
|
||||
import 'package:flutter_dmzj/services/user_service.dart';
|
||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
class ComicDetailControler extends BaseController {
|
||||
final int comicId;
|
||||
ComicDetailControler(this.comicId);
|
||||
|
||||
final ComicRequest request = ComicRequest();
|
||||
final UserRequest userRequest = UserRequest();
|
||||
|
||||
Rx<ComicDetailInfo> detail = Rx<ComicDetailInfo>(ComicDetailInfo.empty());
|
||||
|
||||
var expandDescription = false.obs;
|
||||
|
||||
/// 是否已订阅
|
||||
var subscribeStatus = false.obs;
|
||||
|
||||
/// 是否已收藏
|
||||
/// 收藏是收藏到本地的,订阅是同步到动漫之家服务器的
|
||||
var favorited = false.obs;
|
||||
|
||||
/// 阅读记录
|
||||
Rx<ComicHistory?> history = Rx<ComicHistory?>(null);
|
||||
|
||||
/// 更新漫画记录
|
||||
StreamSubscription<dynamic>? updateComicSubscription;
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
updateComicSubscription = EventBus.instance.listen(
|
||||
EventBus.kUpdatedComicHistory,
|
||||
(id) {
|
||||
if (id == comicId) {
|
||||
getHistory();
|
||||
}
|
||||
},
|
||||
);
|
||||
favorited.value = DBService.instance.hasComicFavorited(comicId: comicId);
|
||||
// 从本地读取订阅状态
|
||||
subscribeStatus.value =
|
||||
UserService.instance.subscribedComicIds.contains(comicId);
|
||||
getHistory();
|
||||
loadDetail();
|
||||
loadSubscribeStatus();
|
||||
//updateSubscribeRead();
|
||||
super.onInit();
|
||||
}
|
||||
|
||||
void refreshDetail() {
|
||||
getHistory();
|
||||
loadDetail();
|
||||
loadSubscribeStatus();
|
||||
}
|
||||
|
||||
/// 更新订阅的阅读状态
|
||||
void updateSubscribeRead() {
|
||||
try {
|
||||
userRequest.subscribeRead(id: comicId, type: AppConstant.kTypeComic);
|
||||
} catch (e) {
|
||||
Log.logPrint(e);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void onClose() {
|
||||
updateComicSubscription?.cancel();
|
||||
super.onClose();
|
||||
}
|
||||
|
||||
void getHistory() {
|
||||
var comicHistory = DBService.instance.getComicHistory(comicId);
|
||||
if (comicHistory != null) {
|
||||
history.value = comicHistory;
|
||||
history.update((val) {});
|
||||
}
|
||||
}
|
||||
|
||||
void refreshV1() async {
|
||||
try {
|
||||
var result =
|
||||
await request.comicDetail(comicId: comicId, priorityV1: true);
|
||||
if (result.volumes.isEmpty) {
|
||||
return;
|
||||
}
|
||||
if (result.isHide && AppSettingsService.instance.collectHideComic.value) {
|
||||
favorite();
|
||||
}
|
||||
detail.update((val) {
|
||||
val!.volumes = result.volumes;
|
||||
});
|
||||
} catch (e) {
|
||||
SmartDialog.showToast("无法获取章节");
|
||||
}
|
||||
}
|
||||
|
||||
/// 加载信息
|
||||
void loadDetail() async {
|
||||
try {
|
||||
pageLoadding.value = true;
|
||||
pageError.value = false;
|
||||
var result = await request.comicDetail(comicId: comicId);
|
||||
detail.value = result;
|
||||
if (result.volumes.isEmpty && !result.isHide) {
|
||||
refreshV1();
|
||||
}
|
||||
if (result.isHide && AppSettingsService.instance.collectHideComic.value) {
|
||||
favorite();
|
||||
}
|
||||
} catch (e) {
|
||||
pageError.value = true;
|
||||
errorMsg.value = e.toString();
|
||||
} finally {
|
||||
pageLoadding.value = false;
|
||||
}
|
||||
}
|
||||
|
||||
/// 检查订阅状态
|
||||
void loadSubscribeStatus() async {
|
||||
try {
|
||||
var result = await userRequest.checkSubscribeStatus(
|
||||
objId: comicId,
|
||||
type: AppConstant.kTypeComic,
|
||||
);
|
||||
subscribeStatus.value = result;
|
||||
if (subscribeStatus.value) {
|
||||
UserService.instance.subscribedComicIds.add(comicId);
|
||||
} else {
|
||||
UserService.instance.subscribedComicIds.remove(comicId);
|
||||
}
|
||||
} catch (e) {
|
||||
Log.logPrint(e);
|
||||
}
|
||||
}
|
||||
|
||||
/// 查看评论
|
||||
void comment() {
|
||||
AppNavigator.toComment(objId: comicId, type: AppConstant.kTypeComic);
|
||||
}
|
||||
|
||||
/// 分享
|
||||
void share() {
|
||||
if (detail.value.id == 0) {
|
||||
return;
|
||||
}
|
||||
Utils.share(
|
||||
"http://m.idmzj.com/info/${detail.value.comicPy}.html",
|
||||
content: detail.value.title,
|
||||
);
|
||||
}
|
||||
|
||||
/// 订阅
|
||||
void subscribe() async {
|
||||
var result = await (subscribeStatus.value
|
||||
? UserService.instance
|
||||
.cancelSubscribe([comicId], AppConstant.kTypeComic)
|
||||
: UserService.instance.addSubscribe([comicId], AppConstant.kTypeComic));
|
||||
if (result) {
|
||||
subscribeStatus.value = !subscribeStatus.value;
|
||||
}
|
||||
}
|
||||
|
||||
/// 下载
|
||||
void download() {
|
||||
AppNavigator.toComicDownloadSelect(comicId);
|
||||
}
|
||||
|
||||
/// 开始/继续阅读
|
||||
void read() {
|
||||
if (detail.value.volumes.isEmpty) {
|
||||
SmartDialog.showToast("没有可阅读的章节");
|
||||
return;
|
||||
}
|
||||
if (detail.value.volumes.first.chapters.isEmpty) {
|
||||
SmartDialog.showToast("没有可阅读的章节");
|
||||
return;
|
||||
}
|
||||
//查找记录
|
||||
if (history.value != null && history.value!.chapterId != 0) {
|
||||
ComicDetailVolume? volume;
|
||||
ComicDetailChapterItem? chapter;
|
||||
for (var volumeItem in detail.value.volumes) {
|
||||
var chapterItem = volumeItem.chapters.firstWhereOrNull(
|
||||
(x) => x.chapterId == history.value!.chapterId,
|
||||
);
|
||||
if (chapterItem != null) {
|
||||
volume = volumeItem;
|
||||
chapter = chapterItem;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (volume != null && chapter != null) {
|
||||
var chapters = List<ComicDetailChapterItem>.from(volume.chapters);
|
||||
//正序
|
||||
chapters.sort((a, b) => a.chapterOrder.compareTo(b.chapterOrder));
|
||||
AppNavigator.toComicReader(
|
||||
comicId: comicId,
|
||||
comicTitle: detail.value.title,
|
||||
comicCover: detail.value.cover,
|
||||
chapters: chapters,
|
||||
chapter: chapter,
|
||||
isLongComic: detail.value.isLong,
|
||||
);
|
||||
} else {
|
||||
SmartDialog.showToast("未找到历史记录对应章节,将从头开始阅读");
|
||||
readStart();
|
||||
}
|
||||
} else {
|
||||
readStart();
|
||||
}
|
||||
}
|
||||
|
||||
void readStart() {
|
||||
//从头开始
|
||||
var volume = detail.value.volumes.first;
|
||||
var chapters = List<ComicDetailChapterItem>.from(volume.chapters);
|
||||
//正序
|
||||
chapters.sort((a, b) => a.chapterOrder.compareTo(b.chapterOrder));
|
||||
var chapter = chapters.first;
|
||||
AppNavigator.toComicReader(
|
||||
comicId: comicId,
|
||||
comicCover: detail.value.cover,
|
||||
comicTitle: detail.value.title,
|
||||
chapters: chapters,
|
||||
chapter: chapter,
|
||||
isLongComic: detail.value.isLong,
|
||||
);
|
||||
}
|
||||
|
||||
void readChapter(ComicDetailVolume volume, ComicDetailChapterItem item) {
|
||||
//禁止观看VIP章节
|
||||
if (item.isVip) {
|
||||
SmartDialog.showToast("请使用动漫之家官方APP观看VIP章节");
|
||||
return;
|
||||
}
|
||||
var chapters = List<ComicDetailChapterItem>.from(volume.chapters);
|
||||
//正序
|
||||
chapters.sort((a, b) => a.chapterOrder.compareTo(b.chapterOrder));
|
||||
AppNavigator.toComicReader(
|
||||
comicId: comicId,
|
||||
comicCover: detail.value.cover,
|
||||
comicTitle: detail.value.title,
|
||||
chapters: chapters,
|
||||
chapter: item,
|
||||
isLongComic: detail.value.isLong,
|
||||
);
|
||||
}
|
||||
|
||||
void related() async {
|
||||
try {
|
||||
SmartDialog.showLoading();
|
||||
var data = await request.related(id: comicId);
|
||||
SmartDialog.dismiss(status: SmartStatus.loading);
|
||||
AppNavigator.showBottomSheet(
|
||||
ComicDetailRelatedPage(data),
|
||||
isScrollControlled: true,
|
||||
);
|
||||
} catch (e) {
|
||||
SmartDialog.showToast(e.toString());
|
||||
} finally {
|
||||
SmartDialog.dismiss(status: SmartStatus.loading);
|
||||
}
|
||||
}
|
||||
|
||||
void toAuthorDetail(ComicDetailTag e) {
|
||||
if (e.tagId == 0) {
|
||||
//神隐漫画没有ID,直接跳转搜索
|
||||
AppNavigator.toComicSearch(keyword: e.tagName);
|
||||
} else {
|
||||
AppNavigator.toComicAuthorDetail(e.tagId);
|
||||
}
|
||||
}
|
||||
|
||||
void toCategoryDetail(ComicDetailTag e) {
|
||||
if (e.tagId == 0) {
|
||||
//神隐漫画没有ID,直接跳转搜索
|
||||
AppNavigator.toComicSearch(keyword: e.tagName);
|
||||
} else {
|
||||
AppNavigator.toComicCategoryDetail(e.tagId);
|
||||
}
|
||||
}
|
||||
|
||||
void favorite() {
|
||||
if (detail.value.id == 0) {
|
||||
return;
|
||||
}
|
||||
if (!DBService.instance.hasComicFavorited(comicId: comicId)) {
|
||||
DBService.instance.putComicFavorite(
|
||||
comicId: comicId,
|
||||
title: detail.value.title,
|
||||
cover: detail.value.cover,
|
||||
);
|
||||
favorited.value = true;
|
||||
SmartDialog.showToast("已将漫画添加至本地收藏");
|
||||
}
|
||||
}
|
||||
|
||||
void cancelFavorite() {
|
||||
DBService.instance.removeComicFavorite(comicId: comicId);
|
||||
favorited.value = false;
|
||||
SmartDialog.showToast("已从本地收藏删除漫画");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user