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 = >[].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 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 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 loadPoetryHistory() async { try { final history = await HistoryController.getHistory(); poetryHistory.value = history; } catch (e) { print('加载历史记录失败: $e'); } } // === 答题统计相关方法 === Future loadPoetryStatistics() async { try { // 加载总体统计 correctAnswers.value = await SharedPreferencesStorageController.getInt( 'correctAnswers', defaultValue: 0, ); // 加载答题记录列表来计算今日和本周答题数 List 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; 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 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 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); } }