深色模式、首页设置页面和功能优化
This commit is contained in:
329
lib/services/get/profile_controller.dart
Normal file
329
lib/services/get/profile_controller.dart
Normal 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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user