This commit is contained in:
2026-03-07 17:24:59 +08:00
parent 4418ebecac
commit b0ec8ab4bd
417 changed files with 42546 additions and 2 deletions

View File

@@ -0,0 +1,282 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_dmzj/app/log.dart';
import 'package:flutter_dmzj/models/comic/detail_info.dart';
import 'package:flutter_dmzj/models/comment/comment_item.dart';
import 'package:flutter_dmzj/models/novel/novel_detail_model.dart';
import 'package:flutter_dmzj/routes/route_path.dart';
import 'package:flutter_dmzj/services/comic_download_service.dart';
import 'package:flutter_dmzj/services/novel_download_service.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
import 'package:url_launcher/url_launcher_string.dart';
class AppNavigator {
/// 当前内容路由的名称
static String currentContentRouteName = "/";
/// 子路由ID
static const int kSubNavigatorID = 1;
/// 子路由Key
static final GlobalKey<NavigatorState>? subNavigatorKey =
Get.nestedKey(kSubNavigatorID);
/// 子路由的Context
static BuildContext get subNavigatorContext =>
subNavigatorKey!.currentContext!;
static void toPage(String name, {dynamic arg}) {
Get.toNamed(name, arguments: arg);
}
/// 跳转子路由页面
static void toContentPage(String name, {dynamic arg, bool replace = false}) {
if (currentContentRouteName == name && replace) {
Get.offAndToNamed(name, arguments: arg, id: kSubNavigatorID);
} else {
Get.toNamed(name, arguments: arg, id: kSubNavigatorID);
}
}
/// 关闭页面
/// 优先关闭主路由的页面
static void closePage() {
if (Navigator.canPop(Get.context!)) {
Get.back();
} else {
Get.back(id: 1);
}
}
/// 打开新闻详情
static void toNewsDetail({
required String url,
String title = "资讯详情",
int newsId = 0,
}) {
if (!url.startsWith("http:") && !url.startsWith("https:")) {
SmartDialog.showToast("无法打开此此链接:$url");
return;
}
//https://news.dmzj.com/article/77288.html
if (url.contains("article/")) {
toContentPage(RoutePath.kNewsDetail, arg: {
"title": title,
"newsUrl": url,
"newsId": newsId,
});
} else {
toWebView(url);
}
}
/// 打开漫画详情
static void toComicDetail(int id) {
toContentPage(RoutePath.kComicDetail, arg: id);
}
/// 打开小说详情
static void toNovelDetail(int id) {
Log.w("打开小说:$id");
toContentPage(RoutePath.kNovelDetail, arg: id);
}
/// 打开评论
static void toComment({
required int objId,
required int type,
}) {
toContentPage(RoutePath.kComment, arg: {
"objId": objId,
"type": type,
});
}
/// 打开WebView
static void toWebView(String url) {
url = url.trimRight().trimLeft();
if (Platform.isAndroid || Platform.isIOS) {
toContentPage(RoutePath.kWebView, arg: url);
} else {
launchUrlString(url);
}
}
/// 打开漫画分类详情
static void toComicCategoryDetail(int id) {
toContentPage(RoutePath.kComicCategoryDetail, arg: id);
}
/// 打开漫画作者详情
static void toComicAuthorDetail(int id) {
toContentPage(RoutePath.kComicAuthorDetail, arg: id);
}
/// 打开专题详情
static void toSpecialDetail(int id) {
toContentPage(RoutePath.kSpecialDetail, arg: id);
}
/// 打开漫画搜索
static void toComicSearch({String keyword = ""}) {
toContentPage(RoutePath.kComicSearch, arg: keyword);
}
/// 打开轻小说搜索
static void toNovelSearch({String keyword = ""}) {
toContentPage(RoutePath.kNovelSearch, arg: keyword);
}
/// 打开漫画分类详情
static void toNovelCategoryDetail(int id) {
toContentPage(RoutePath.kNovelCategoryDetail, arg: id);
}
/// 打开用户订阅
/// - [type] 0=漫画,1=小说,2=新闻
static void toUserSubscribe({int type = 0}) {
toContentPage(RoutePath.kUserSubscribe, arg: type);
}
/// 打开用户历史记录
/// - [type] 0=漫画,1=小说
static void toUserHistory({int type = 0}) {
toContentPage(RoutePath.kUserHistory, arg: type);
}
/// 打开本地历史记录
/// - [type] 0=漫画,1=小说
static void toLocalHistory({int type = 0}) {
toContentPage(RoutePath.kLocalHistory, arg: type);
}
/// 打开本地历史记录
/// - [type] 0=漫画,1=小说,2=下载
static void toSettings({int type = 0}) {
toContentPage(RoutePath.kSettings, arg: type);
}
/// 打开漫画阅读
static Future toComicReader({
required int comicId,
required String comicTitle,
required String comicCover,
required List<ComicDetailChapterItem> chapters,
required ComicDetailChapterItem chapter,
required bool isLongComic,
}) async {
// 使用主路由跳转
await Get.toNamed(RoutePath.kComicReader, arguments: {
"comicId": comicId,
"comicTitle": comicTitle,
"comicCover": comicCover,
"chapters": chapters,
"chapter": chapter,
"isLongComic": isLongComic,
});
}
/// 打开漫画阅读
static Future toNovelReader({
required int novelId,
required String novelTitle,
required String novelCover,
required List<NovelDetailChapter> chapters,
required NovelDetailChapter chapter,
}) async {
// 使用主路由跳转
await Get.toNamed(RoutePath.kNovelReader, arguments: {
"novelId": novelId,
"novelTitle": novelTitle,
"novelCover": novelCover,
"chapters": chapters,
"chapter": chapter,
});
}
/// 打开漫画下载-选择章节
static void toComicDownloadSelect(int id) {
toContentPage(RoutePath.kComicDownloadSelect, arg: id);
}
/// 打开小说下载-选择章节
static void toNovelDownloadSelect(int id) {
toContentPage(RoutePath.kNovelDownloadSelect, arg: id);
}
/// 打开漫画下载管理
/// * [type] 0=下载完成1=下载中
static void toComicDownloadManage(int type) {
toContentPage(RoutePath.kComicDownload, arg: type);
}
/// 打开已下载的漫画
/// * [info] 已下载的漫画信息
static void toComicDownloadDetail(ComicDownloadedItem info) {
toContentPage(RoutePath.kComicDownloadDetail, arg: info);
}
/// 打开小说下载管理
/// * [type] 0=下载完成1=下载中
static void toNovelDownloadManage(int type) {
toContentPage(RoutePath.kNovelDownload, arg: type);
}
/// 打开已下载的小说
/// * [info] 已下载的漫画信息
static void toNovelDownloadDetail(NovelDownloadedItem info) {
toContentPage(RoutePath.kNovelDownloadDetail, arg: info);
}
/// 打开添加/回复评论
static void toAddComment({
required int objId,
required int type,
CommentItem? replyItem,
}) {
toContentPage(RoutePath.kCommentAdd, arg: {
"objId": objId,
"type": type,
"replyItem": replyItem,
});
}
/// 打开用户的评论
/// * [userId] 用户ID
static void toUserComment(int userId) {
toContentPage(RoutePath.kUserComment, arg: userId);
}
/// 打开用户中心
/// * [userId] 用户ID
static void toUserCenter(int userId) {
//TODO 跳转至用户中心
toUserComment(userId);
}
/// 打开本机收藏
static void tolocalFavorite() {
toContentPage(RoutePath.kLocalFavorite);
}
static void showBottomSheet(
Widget widget, {
bool isScrollControlled = false,
}) {
showModalBottomSheet(
context: subNavigatorContext,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(12),
topRight: Radius.circular(12),
),
),
isScrollControlled: isScrollControlled,
backgroundColor: Get.theme.cardColor,
builder: (context) => widget,
routeSettings: const RouteSettings(name: "/modalBottomSheet"),
);
}
}

281
lib/routes/app_pages.dart Normal file
View File

@@ -0,0 +1,281 @@
import 'package:flutter/material.dart';
import 'package:flutter_dmzj/modules/comic/author_detail/author_detail_page.dart';
import 'package:flutter_dmzj/modules/comic/category_detail/category_detail_page.dart';
import 'package:flutter_dmzj/modules/comic/detail/comic_detail_page.dart';
import 'package:flutter_dmzj/modules/comic/home/comic_home_controller.dart';
import 'package:flutter_dmzj/modules/comic/reader/comic_reader_controller.dart';
import 'package:flutter_dmzj/modules/comic/reader/comic_reader_page.dart';
import 'package:flutter_dmzj/modules/comic/search/comic_search_page.dart';
import 'package:flutter_dmzj/modules/comic/select_chapter/comic_select_chapter_page.dart';
import 'package:flutter_dmzj/modules/comic/special_detail/special_detail_page.dart';
import 'package:flutter_dmzj/modules/common/comment/add_comment_page.dart';
import 'package:flutter_dmzj/modules/common/comment/comment_page.dart';
import 'package:flutter_dmzj/modules/common/download/comic/comic_download_page.dart';
import 'package:flutter_dmzj/modules/common/download/comic/comic_downloaded_detail_page.dart';
import 'package:flutter_dmzj/modules/common/download/novel/novel_download_page.dart';
import 'package:flutter_dmzj/modules/common/download/novel/novel_downloaded_detail_page.dart';
import 'package:flutter_dmzj/modules/common/empty_page.dart';
import 'package:flutter_dmzj/modules/common/test_subroute_page.dart';
import 'package:flutter_dmzj/modules/common/webview/webview_page.dart';
import 'package:flutter_dmzj/modules/index/index_controller.dart';
import 'package:flutter_dmzj/modules/index/index_page.dart';
import 'package:flutter_dmzj/modules/news/detail/news_detail_page.dart';
import 'package:flutter_dmzj/modules/novel/category_detail/novel_category_detail_page.dart';
import 'package:flutter_dmzj/modules/novel/detail/novel_detail_page.dart';
import 'package:flutter_dmzj/modules/novel/reader/novel_reader_controller.dart';
import 'package:flutter_dmzj/modules/novel/reader/novel_reader_page.dart';
import 'package:flutter_dmzj/modules/novel/search/novel_search_page.dart';
import 'package:flutter_dmzj/modules/novel/select_chapter/novel_select_chapter_page.dart';
import 'package:flutter_dmzj/modules/user/comment/user_comment_page.dart';
import 'package:flutter_dmzj/modules/user/history/user_history_page.dart';
import 'package:flutter_dmzj/modules/user/local_favorite/local_favorite_page.dart';
import 'package:flutter_dmzj/modules/user/local_history/local_history_page.dart';
import 'package:flutter_dmzj/modules/user/settings/settings_page.dart';
import 'package:flutter_dmzj/modules/user/subscribe/user_subscribe_pgae.dart';
import 'package:flutter_dmzj/modules/user/user_home_controller.dart';
import 'package:flutter_dmzj/routes/route_path.dart';
import 'package:flutter_dmzj/services/comic_download_service.dart';
import 'package:flutter_dmzj/services/novel_download_service.dart';
import 'package:get/get.dart';
class AppPages {
AppPages._();
static const kIndex = RoutePath.kIndex;
static final routes = [
GetPage(
name: RoutePath.kIndex,
page: () => const IndexPage(),
bindings: [
BindingsBuilder.put(
() => IndexController(),
),
BindingsBuilder.put(
() => ComicHomeController(),
),
BindingsBuilder.put(
() => UserHomeController(),
),
],
),
GetPage(
name: RoutePath.kComicReader,
page: () => const ComicReaderPage(),
binding: BindingsBuilder.put(
() => ComicReaderController(
comicId: Get.arguments["comicId"],
comicTitle: Get.arguments["comicTitle"],
comicCover: Get.arguments["comicCover"],
chapters: Get.arguments["chapters"],
chapter: Get.arguments["chapter"],
isLongComic: Get.arguments["isLongComic"] ?? false,
),
),
),
GetPage(
name: RoutePath.kNovelReader,
page: () => const NovelReaderPage(),
binding: BindingsBuilder.put(
() => NovelReaderController(
novelId: Get.arguments["novelId"],
novelTitle: Get.arguments["novelTitle"],
novelCover: Get.arguments["novelCover"],
chapters: Get.arguments["chapters"],
chapter: Get.arguments["chapter"],
),
),
),
];
/// 定义子路由
static Route<dynamic>? generateSubRoute(RouteSettings settings) {
switch (settings.name) {
case "/":
return GetPageRoute(
settings: settings,
page: () => const EmptyPage(),
);
case RoutePath.kTestSubRoute:
return GetPageRoute(
settings: settings,
transition: Transition.native,
page: () => const TestSubRoutePage(),
);
case RoutePath.kNewsDetail:
var parameter = settings.arguments as Map;
return GetPageRoute(
settings: settings,
page: () => NewsDetailPage(
title: parameter["title"],
newsUrl: parameter["newsUrl"],
newsId: parameter["newsId"],
),
);
case RoutePath.kComment:
var parameter = settings.arguments as Map;
return GetPageRoute(
settings: settings,
page: () => CommentPage(
objId: parameter["objId"],
type: parameter["type"],
),
);
case RoutePath.kCommentAdd:
var parameter = settings.arguments as Map;
return GetPageRoute(
settings: settings,
page: () => AddCommentPage(
objId: parameter["objId"],
type: parameter["type"],
replyItem: parameter["replyItem"],
),
);
case RoutePath.kWebView:
return GetPageRoute(
settings: settings,
page: () => WebViewPage(
url: settings.arguments.toString(),
),
);
case RoutePath.kComicCategoryDetail:
return GetPageRoute(
settings: settings,
page: () => CategoryDetailPage(
settings.arguments as int,
),
);
case RoutePath.kSpecialDetail:
return GetPageRoute(
settings: settings,
page: () => SpecialDetailPage(
settings.arguments as int,
),
);
case RoutePath.kComicAuthorDetail:
return GetPageRoute(
settings: settings,
page: () => ComicAuthorDetailPage(
settings.arguments as int,
),
);
case RoutePath.kComicDetail:
return GetPageRoute(
settings: settings,
page: () => ComicDetailPage(
settings.arguments as int,
),
);
case RoutePath.kComicSearch:
return GetPageRoute(
settings: settings,
page: () => ComicSearchPage(
keyword: settings.arguments.toString(),
),
);
case RoutePath.kNovelSearch:
return GetPageRoute(
settings: settings,
page: () => NovelSearchPage(
keyword: settings.arguments.toString(),
),
);
case RoutePath.kNovelCategoryDetail:
return GetPageRoute(
settings: settings,
page: () => NovelCategoryDetailPage(
settings.arguments as int,
),
);
case RoutePath.kUserSubscribe:
return GetPageRoute(
settings: settings,
page: () => UserSubscribePage(
type: settings.arguments as int,
),
);
case RoutePath.kUserHistory:
return GetPageRoute(
settings: settings,
page: () => UserHistoryPage(
type: settings.arguments as int,
),
);
case RoutePath.kLocalHistory:
return GetPageRoute(
settings: settings,
page: () => LocalHistoryPage(
type: settings.arguments as int,
),
);
case RoutePath.kSettings:
return GetPageRoute(
settings: settings,
page: () => SettingsPage(
index: settings.arguments as int,
),
);
case RoutePath.kNovelDetail:
return GetPageRoute(
settings: settings,
page: () => NovelDetailPage(
settings.arguments as int,
),
);
case RoutePath.kComicDownloadSelect:
return GetPageRoute(
settings: settings,
page: () => ComicSelectChapterPage(
settings.arguments as int,
),
);
case RoutePath.kComicDownload:
return GetPageRoute(
settings: settings,
page: () => ComicDownloadPage(
settings.arguments as int,
),
);
case RoutePath.kComicDownloadDetail:
return GetPageRoute(
settings: settings,
page: () => ComicDownloadedDetailPage(
settings.arguments as ComicDownloadedItem,
),
);
case RoutePath.kNovelDownloadSelect:
return GetPageRoute(
settings: settings,
page: () => NovelSelectChapterPage(
settings.arguments as int,
),
);
case RoutePath.kNovelDownload:
return GetPageRoute(
settings: settings,
page: () => NovelDownloadPage(
settings.arguments as int,
),
);
case RoutePath.kNovelDownloadDetail:
return GetPageRoute(
settings: settings,
page: () => NovelDownloadedDetailPage(
settings.arguments as NovelDownloadedItem,
),
);
case RoutePath.kUserComment:
return GetPageRoute(
settings: settings,
page: () => UserCommentPage(
settings.arguments as int,
),
);
case RoutePath.kLocalFavorite:
return GetPageRoute(
settings: settings,
page: () => LocalFavoritePage(),
);
default:
return GetPageRoute(page: () => const EmptyPage());
}
}
}

View File

@@ -0,0 +1,90 @@
class RoutePath {
/// 首页
static const kIndex = "/index";
/// 空白
static const kEmpty = "/empty";
/// 登录
static const kUserLogin = "/user/login";
static const kTestSubRoute = "/test/sub_route";
/// WebView
static const kWebView = "/other/webview";
/// 新闻详情
static const kNewsDetail = "/news/detail";
/// 评论
static const kComment = "/comment";
/// 漫画详情
static const kComicDetail = "/comic/detail";
/// 漫画阅读
static const kComicReader = "/comic/reader";
/// 漫画分类详情
static const kComicCategoryDetail = "/comic/category/detail";
/// 专题详情
static const kSpecialDetail = "/comic/special/detail";
/// 漫画作者详情
static const kComicAuthorDetail = "/comic/author/detail";
/// 漫画搜索
static const kComicSearch = "/comic/search";
/// 轻小说搜索
static const kNovelSearch = "/novel/search";
/// 轻小说分类详情
static const kNovelCategoryDetail = "/novel/category/detail";
/// 用户订阅
static const kUserSubscribe = "/user/subscribe";
/// 用户观看记录
static const kUserHistory = "/user/history";
/// 本机观看记录
static const kLocalHistory = "/user/local/history";
/// 设置
static const kSettings = "/user/settings";
/// 小说详情
static const kNovelDetail = "/novel/detail";
/// 小说阅读
static const kNovelReader = "/novel/reader";
/// 漫画下载,选择章节
static const kComicDownloadSelect = "/comic/download/chapter";
/// 小说下载,选择章节
static const kNovelDownloadSelect = "/novel/download/chapter";
/// 漫画下载管理
static const kComicDownload = "/download/comic";
/// 漫画下载详情
static const kComicDownloadDetail = "/download/comic/detail";
/// 小说下载管理
static const kNovelDownload = "/download/novel";
/// 小说下载详情
static const kNovelDownloadDetail = "/download/novel/chapter";
/// 添加/回复评论
static const kCommentAdd = "/comment/add";
/// 用户的评论
static const kUserComment = "/user/comment";
/// 本机收藏
static const kLocalFavorite = "/user/local/favorite";
}