深色模式、首页设置页面和功能优化

This commit is contained in:
Developer
2026-04-02 07:06:55 +08:00
parent f0a62ed68b
commit 954d173329
88 changed files with 12157 additions and 7578 deletions

View File

@@ -0,0 +1,329 @@
import 'dart:convert';
import 'dart:math' show Random;
import 'dart:io' as io;
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter/foundation.dart' show kIsWeb;
import 'package:get/get.dart';
import '../../constants/app_constants.dart';
import '../../controllers/history_controller.dart';
import '../../controllers/shared_preferences_storage_controller.dart';
import '../isweb/wakelock_service.dart';
import '../../views/profile/guide/tongji.dart';
class ProfileController extends GetxController with WidgetsBindingObserver {
// 页面状态
var currentPage = 1.obs; // 默认显示第2页设置
var isCardExpanded = false.obs; // 个人卡片展开状态
var isStatsHidden = false.obs; // 统计数据隐藏状态
var isScreenWakeEnabled = false.obs; // 屏幕常亮状态
var startY = 0.0.obs;
// 历史记录相关
var poetryHistory = <Map<String, dynamic>>[].obs;
// 答题统计数据
var correctAnswers = 0.obs;
var weekQuestions = 0.obs;
// 统计数据
var todayViews = 0.obs;
var weekViews = 0.obs;
var firstUseTime = '未记录'.obs;
var useDays = 1.obs;
var dataSize = '0 B'.obs;
var noteCount = 0.obs;
var totalQuestions = 0.obs;
var todayQuestions = 0.obs;
var todayLikes = 0.obs;
// 可爱的emoji列表
final List<String> avatars = [
'👤',
'😊',
'🎉',
'🌟',
'🔥',
'💎',
'🌈',
'🦋',
'🌸',
'🐱',
'🐶',
'🐼',
'🐨',
'🐵',
'🦄',
'🐸',
'🐹',
'🐰',
'🦊',
'🐻',
];
// 模拟用户数据
var userData = {
'avatar': '👤', // 使用emoji代替网络图片
'nickname': '诗词爱好者',
'signature': '人生如诗,岁月如歌',
'level': 'Lv.12',
'vip': true,
'posts': 156,
'followers': 1280,
'following': 89,
'likes': 2560,
'favorites': 128,
'views': 3560,
}.obs;
@override
void onInit() {
super.onInit();
WidgetsBinding.instance.addObserver(this);
loadPoetryHistory();
loadPoetryStatistics();
loadStatistics();
}
@override
void onClose() {
WidgetsBinding.instance.removeObserver(this);
super.onClose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.resumed) {
// 应用恢复时刷新数据
refreshData();
}
}
// 更换头像
void changeAvatar() {
final random = Random();
userData['avatar'] = avatars[random.nextInt(avatars.length)];
}
// 刷新所有数据
Future<void> refreshData() async {
await loadPoetryStatistics();
await loadStatistics();
}
// 页面切换
void onPageChanged(int page) {
currentPage.value = page;
HapticFeedback.lightImpact();
}
// 切换卡片展开状态
void toggleCardExpanded() {
isCardExpanded.value = !isCardExpanded.value;
}
// 切换统计数据显示状态
void toggleStatsHidden() {
isStatsHidden.value = !isStatsHidden.value;
HapticFeedback.lightImpact();
}
// === 历史记录相关方法 ===
Future<void> loadPoetryHistory() async {
try {
final history = await HistoryController.getHistory();
poetryHistory.value = history;
} catch (e) {
print('加载历史记录失败: $e');
}
}
// === 答题统计相关方法 ===
Future<void> loadPoetryStatistics() async {
try {
// 加载总体统计
correctAnswers.value = await SharedPreferencesStorageController.getInt(
'correctAnswers',
defaultValue: 0,
);
// 加载答题记录列表来计算今日和本周答题数
List<String> records =
await SharedPreferencesStorageController.getStringList(
'poetryAnswerRecords',
defaultValue: [],
);
final now = DateTime.now();
final todayStart = DateTime(now.year, now.month, now.day);
final weekStart = todayStart.subtract(
Duration(days: todayStart.weekday - 1),
);
todayQuestions.value = 0;
weekQuestions.value = 0;
for (String recordStr in records) {
try {
final record = jsonDecode(recordStr) as Map<String, dynamic>;
final answerTime = record['answerTime'];
if (answerTime != null) {
final time = DateTime.parse(answerTime);
if (time.isAfter(todayStart)) {
todayQuestions.value++;
}
if (time.isAfter(weekStart)) {
weekQuestions.value++;
}
}
} catch (e) {
continue;
}
}
} catch (e) {
print('加载答题统计失败: $e');
}
}
// === 加载统计数据 ===
Future<void> loadStatistics() async {
try {
// 加载浏览统计
todayViews.value = await StatisticsManager().getTodayViews();
weekViews.value = await StatisticsManager().getWeekViews();
firstUseTime.value = await StatisticsManager().getFirstUseTime();
useDays.value = await StatisticsManager().getUseDays();
dataSize.value = await StatisticsManager().getDataSize();
todayLikes.value = await StatisticsManager().getTodayLikes();
todayQuestions.value = await StatisticsManager().getTodayQuestions();
// 加载笔记总数
noteCount.value = await HistoryController.getNotesCount();
// 加载累计答题数
totalQuestions.value = await SharedPreferencesStorageController.getInt(
'totalQuestions',
defaultValue: 0,
);
} catch (e) {
print('加载统计数据失败: $e');
}
}
// === 屏幕常亮相关方法 ===
Future<void> toggleScreenWake(bool enable) async {
// Web 平台不支持 wakelock_plus
if (kIsWeb) {
Get.snackbar('提示', 'Web 平台不支持屏幕常亮功能');
return;
}
try {
// 使用 io.Platform 检测平台
final String osName = io.Platform.operatingSystem;
final String osVersion = io.Platform.operatingSystemVersion;
print('Current platform: $osName, version: $osVersion');
if (enable) {
await WakelockService.instance.enable();
Get.snackbar('提示', '屏幕常亮已开启');
} else {
await WakelockService.instance.disable();
Get.snackbar('提示', '屏幕常亮已关闭');
}
// 不再更新开关状态,由 UI 层直接控制
// isScreenWakeEnabled.value = enable;
} catch (e, stackTrace) {
print('WakelockService error: $e');
print('Stack trace: $stackTrace');
// 检查错误类型,判断是否是设备不支持
String errorMessage;
if (e.toString().contains('not supported') ||
e.toString().contains('unsupported') ||
e.toString().contains('不支持')) {
errorMessage = '该设备不支持屏幕常亮功能';
} else {
errorMessage = '屏幕常亮功能异常: $e';
}
// 不再更新开关状态,由 UI 层直接控制
// isScreenWakeEnabled.value = enable;
// 显示错误提示,但不影响开关状态
Get.dialog(
AlertDialog(
title: const Text('提示'),
content: Text(errorMessage),
actions: [
TextButton(onPressed: () => Get.back(), child: const Text('确定')),
],
),
);
}
}
// === 导航方法 ===
void navigateToHistoryPage() {
Get.toNamed('/history');
}
void navigateToAppFunSettings() {
Get.toNamed('/app-fun-settings');
}
void navigateToUserPlanPage() {
Get.toNamed('/user-plan');
}
void navigateToOfflineDataPage() {
Get.toNamed('/offline-data');
}
void navigateToPermissionPage() {
Get.toNamed('/permission');
}
void navigateToAppDataPage() {
Get.toNamed('/app-data');
}
void navigateToPrivacyPage() {
Get.toNamed('/privacy');
}
void navigateToLearnUsPage() {
Get.toNamed('/learn-us');
}
void navigateToAppInfoPage() {
Get.toNamed('/app-info');
}
void navigateToAppDiyPage() {
Get.toNamed('/app-diy');
}
void navigateToVotePage() {
Get.toNamed('/vote');
}
void navigateToPoetryLevelPage() {
Get.toNamed('/poetry-level');
}
void navigateToEntirePage() {
Get.toNamed('/entire');
}
void navigateToManuscriptPage() {
Get.toNamed('/manuscript');
}
// === 显示提示 ===
void showSnackBar(String message) {
Get.snackbar('提示', message);
}
}