Files
DMZJ_F/lib/services/local_storage_service.dart
2026-03-07 17:24:59 +08:00

202 lines
5.7 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import 'package:flutter_dmzj/app/log.dart';
import 'package:flutter/foundation.dart' show kIsWeb;
import 'package:get/get.dart';
import 'package:hive/hive.dart';
import 'package:path_provider/path_provider.dart';
import 'dart:io';
// ignore: depend_on_referenced_packages
import 'package:path/path.dart' as p;
class LocalStorageService extends GetxService {
static LocalStorageService get instance => Get.find<LocalStorageService>();
static bool kDebug = false;
/// 显示模式
/// * [0] 跟随系统
/// * [1] 浅色模式
/// * [2] 深色模式
static const String kThemeMode = "ThemeMode";
/// 首次运行
static const String kFirstRun = "FirstRun";
/// 用户登录信息
/// * 类型LoginResultModel
static const String kUserAuthInfo = "UserAuthInfo";
/// 漫画阅读方向
static const String kComicReaderDirection = "ComicReaderDirection";
/// 漫画全屏阅读
static const String kComicReaderFullScreen = "ComicReaderFullScreen";
/// 漫画阅读显示状态信息
static const String kComicReaderShowStatus = "ComicReaderShowStatus";
/// 漫画阅读尾页显示观点/吐槽
static const String kComicReaderShowViewPoint = "ComicReaderShowViewPoint";
/// 启用旧版吐槽
static const String kComicReaderOldViewPoint = "ComicReaderOldViewPoint";
/// 小说阅读方向
static const String kNovelReaderDirection = "NovelReaderDirection";
/// 小说字体大小
static const String kNovelReaderFontSize = "NovelReaderFontSize";
/// 小说行距
static const String kNovelReaderLineSpacing = "NovelReaderLineSpacing";
/// 小说阅读主题
static const String kNovelReaderTheme = "NovelReaderTheme";
/// 小说阅读显示状态信息
static const String kNovelReaderShowStatus = "NovelReaderShowStatus";
/// 小说全屏阅读
static const String kNovelReaderFullScreen = "NovelReaderFullScreen";
/// 下载是否允许使用流量
static const String kDownloadAllowCellular = "DownloadAllowCellular";
/// 下载小说最大任务数
static const String kDownloadNovelTaskCount = "DownloadNovelTaskCount";
/// 下载漫画最大任务数
static const String kDownloadComicTaskCount = "DownloadComicTaskCount";
/// 漫画搜索使用Web接口
static const String kComicSearchUseWebApi = "ComicSearchUseWebApi";
/// 显示字体大小跟随系统
static const String kUseSystemFontSize = "UseSystemFontSize";
/// 漫画-左手模式
static const String kComicReaderLeftHandMode = "ComicReaderLeftHandMode";
/// 小说-左手模式
static const String kNovelReaderLeftHandMode = "NovelReaderLeftHandMode";
/// 漫画阅读优先加载高清图
static const String kComicReaderHD = "ComicReaderHD";
/// 漫画阅读-翻页动画
static const String kComicReaderPageAnimation = "ComicReaderPageAnimation";
/// 小说阅读-翻页动画
static const String kNovelReaderPageAnimation = "NovelReaderPageAnimation";
/// 新闻字体大小
static const String kNewsFontSize = "NewsFontSize";
/// 自动添加神隐漫画至收藏夹
static const String kCollectHideComic = "CollectHideComic";
/// 代理地址
static const String kProxyAddress = "ProxyAddress";
/// 是否使用MD动态取色
static const String kUseDynamicColor = "UseDynamicColor";
late Box settingsBox;
Future init() async {
if (kIsWeb) {
settingsBox = await Hive.openBox("LocalStorage");
} else {
var dir = await getApplicationSupportDirectory();
settingsBox = await Hive.openBox(
"LocalStorage",
path: dir.path,
);
}
}
T getValue<T>(dynamic key, T defaultValue) {
var value = settingsBox.get(key, defaultValue: defaultValue) as T;
Log.d("Get LocalStorage$key\r\n$value");
return value;
}
Future setValue<T>(dynamic key, T value) async {
Log.d("Set LocalStorage$key\r\n$value");
return await settingsBox.put(key, value);
}
Future removeValue<T>(dynamic key) async {
Log.d("Remove LocalStorage$key");
return await settingsBox.delete(key);
}
bool get isFirst => getValue("First", true);
void setNoFirst() {
setValue("First", false);
}
Future<Directory> getNovelCacheDirectory() async {
var dir = await getApplicationSupportDirectory();
var novelDir = Directory(p.join(dir.path, "novel_cache"));
if (!await novelDir.exists()) {
novelDir = await novelDir.create();
}
return novelDir;
}
Future saveNovelContent({
required int volumeId,
required int chapterId,
required String content,
}) async {
try {
var novelDir = await getNovelCacheDirectory();
var fileName = p.join(novelDir.path, "${volumeId}_$chapterId.txt");
var file = File(fileName);
await file.writeAsString(content);
} catch (e) {
Log.logPrint(e);
}
}
Future<String?> getNovelContent(
{required int volumeId, required int chapterId}) async {
try {
var novelDir = await getNovelCacheDirectory();
var fileName = p.join(novelDir.path, "${volumeId}_$chapterId.txt");
var file = File(fileName);
if (await file.exists()) {
var content = await file.readAsString();
return content;
}
return null;
} catch (e) {
Log.logPrint(e);
return null;
}
}
Future<int> getNovelCacheSize() async {
var novelDir = await getNovelCacheDirectory();
var size = 0;
await for (var item in novelDir.list()) {
size += item.statSync().size;
}
return size;
}
Future<bool> cleanNovelCacheSize() async {
try {
var novelDir = await getNovelCacheDirectory();
await novelDir.delete(recursive: true);
return true;
} catch (e) {
Log.logPrint(e);
return false;
}
}
}