keyboard_controller.dart 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. import 'dart:async';
  2. import 'package:flutter/widgets.dart';
  3. import 'package:get/get.dart';
  4. import 'package:injectable/injectable.dart';
  5. import 'package:keyboard/base/base_controller.dart';
  6. import 'package:keyboard/data/api/response/keyboard_home_info_response.dart';
  7. import 'package:keyboard/data/repository/account_repository.dart';
  8. import 'package:keyboard/data/repository/keyboard_repository.dart';
  9. import 'package:keyboard/module/intimacy_analyse/enums/intimacy_analyse_tab.dart';
  10. import 'package:keyboard/module/keyboard_manage/keyboard_manage_page.dart';
  11. import 'package:keyboard/module/store/new_discount/new_discount_page.dart';
  12. import 'package:keyboard/module/store/store_page.dart';
  13. import 'package:keyboard/module/user_profile/user_profile_page.dart';
  14. import '../../data/api/response/keyboard_love_index_response.dart';
  15. import '../../data/bean/member_info.dart';
  16. import '../../plugins/keyboard_android_platform.dart';
  17. import '../../utils/default_keyboard_helper.dart';
  18. import '../../utils/keyboard_tutorial_util.dart';
  19. import '../intimacy_analyse/intimacy_analyse_page.dart';
  20. import '../intimacy_scale/intimacy_scale_page.dart';
  21. import '../keyboard_guide/keyboard_guide_page.dart';
  22. import '../profile/profile_page.dart';
  23. @injectable
  24. class KeyBoardController extends BaseController {
  25. final tag = "KeyBoardController";
  26. final KeyboardRepository keyboardRepository;
  27. final AccountRepository accountRepository;
  28. KeyboardHomeInfoResponse? get homeInfo => keyboardRepository.homeInfo.value;
  29. MemberInfo? get memberInfo => accountRepository.memberStatusInfo.value;
  30. bool get isLogin => accountRepository.isLogin.value;
  31. Rxn<KeyboardLoveIndexResponse> get loveIndex =>
  32. keyboardRepository.homeLoveIndex;
  33. static const int countdownTime = 10 * 60 * 100;
  34. final RxInt timeLeft = countdownTime.obs;
  35. Timer? _timer;
  36. final RxBool isShowBanner = true.obs;
  37. /// 是否选择为了默认键盘
  38. RxBool get isDefaultKeyboard => DefaultKeyboardHelper.isDefaultKeyboard;
  39. // 各项指标数据
  40. KeyBoardController(this.keyboardRepository, this.accountRepository);
  41. @override
  42. void onInit() {
  43. super.onInit();
  44. // 初始判断一次
  45. _updateBannerState();
  46. // 实时监听登录状态变化
  47. ever(accountRepository.isLogin, (_) {
  48. _updateBannerState();
  49. });
  50. // 实时监听会员信息变化
  51. ever(accountRepository.memberStatusInfo, (_) {
  52. _updateBannerState();
  53. });
  54. }
  55. /// 根据当前登录状态 & 会员信息更新 banner显示逻辑
  56. void _updateBannerState() {
  57. if (isLogin && (memberInfo?.isMember == true)) {
  58. isShowBanner.value = false;
  59. _timer?.cancel(); // 停止倒计时
  60. } else {
  61. if (isShowBanner.value == false) {
  62. isShowBanner.value = true;
  63. }
  64. if (_timer == null || !_timer!.isActive) {
  65. startCountdown();
  66. }
  67. }
  68. }
  69. void clickVip() {
  70. StorePage.start();
  71. }
  72. void clickIntimacyAnalyze() {
  73. debugPrint("click intimacy analyze");
  74. IntimacyAnalysePage.start(tab: IntimacyAnalyseTab.intimacyAnalyseReport);
  75. }
  76. void clickScreenshotReply() {
  77. debugPrint("click screenshot reply");
  78. IntimacyAnalysePage.start(
  79. tab: IntimacyAnalyseTab.intimacyAnalyseScreenshotReply,
  80. );
  81. }
  82. void clickEasyReply() {
  83. KeyboardTutorialUtil.start();
  84. debugPrint("click easy reply");
  85. }
  86. void clickGoKeyboardManage() {
  87. KeyboardManagePage.start();
  88. }
  89. void clickCloseBanner() {
  90. isShowBanner.value = false;
  91. debugPrint("click close banner");
  92. }
  93. void clickAvatar(bool isUser) {
  94. debugPrint("click avatar");
  95. if (!isUser) {
  96. ProfilePage.start();
  97. } else {
  98. UserProfilePage.start();
  99. }
  100. }
  101. void clickBanner() {
  102. debugPrint("click banner");
  103. NewDiscountPage.start();
  104. }
  105. void clickLovePercentage() {
  106. IntimacyScalePage.start();
  107. }
  108. void startCountdown() {
  109. _timer = Timer.periodic(const Duration(milliseconds: 10), (timer) {
  110. if (timeLeft.value > 0) {
  111. timeLeft.value--;
  112. } else {
  113. isShowBanner.value = false;
  114. timer.cancel();
  115. }
  116. });
  117. }
  118. @override
  119. void onClose() {
  120. super.onClose();
  121. _timer?.cancel();
  122. }
  123. String get formattedTime {
  124. final totalMillis = timeLeft.value * 10;
  125. final duration = Duration(milliseconds: totalMillis);
  126. final minutes = duration.inMinutes.toString().padLeft(2, '0');
  127. final seconds = (duration.inSeconds % 60).toString().padLeft(2, '0');
  128. final milliseconds = ((duration.inMilliseconds % 1000) ~/ 10)
  129. .toString()
  130. .padLeft(2, '0');
  131. return "$minutes:$seconds:$milliseconds";
  132. }
  133. }