345 lines
8.7 KiB
Dart
345 lines
8.7 KiB
Dart
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';
|
||
import 'theme_controller.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 {
|
||
final themeController = Get.find<ThemeController>();
|
||
// Web 平台不支持 wakelock_plus
|
||
if (kIsWeb) {
|
||
Get.snackbar(
|
||
'提示',
|
||
'Web 平台不支持屏幕常亮功能',
|
||
colorText: themeController.currentThemeColor,
|
||
);
|
||
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(
|
||
'提示',
|
||
'屏幕常亮已开启',
|
||
colorText: themeController.currentThemeColor,
|
||
);
|
||
} else {
|
||
await WakelockService.instance.disable();
|
||
Get.snackbar(
|
||
'提示',
|
||
'屏幕常亮已关闭',
|
||
colorText: themeController.currentThemeColor,
|
||
);
|
||
}
|
||
|
||
// 不再更新开关状态,由 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) {
|
||
final themeController = Get.find<ThemeController>();
|
||
Get.snackbar('提示', message, colorText: themeController.currentThemeColor);
|
||
}
|
||
}
|