new_user_controller.dart 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. import 'package:flutter/material.dart';
  2. import 'package:injectable/injectable.dart';
  3. import 'package:keyboard/data/bean/keyboard_info.dart';
  4. import 'package:keyboard/data/repository/keyboard_repository.dart';
  5. import 'package:keyboard/main.dart';
  6. import 'package:keyboard/module/main/main_page.dart';
  7. import 'package:keyboard/module/new_user/result/new_user_result_page.dart';
  8. import 'package:keyboard/module/new_user/step/birthday/step_birthday_logic.dart';
  9. import 'package:keyboard/module/new_user/step/gender/step_gender_logic.dart';
  10. import 'package:keyboard/module/new_user/step/intimacy/step_intimacy_stages_logic.dart';
  11. import 'package:keyboard/module/new_user/step/nickname/step_nickname_logic.dart';
  12. import 'package:keyboard/module/new_user/step/partner/step_partner_logic.dart';
  13. import 'package:keyboard/utils/atmob_log.dart';
  14. import 'package:intl/intl.dart';
  15. import '../../base/base_controller.dart';
  16. import '../../data/api/response/keyboard_generate_response.dart';
  17. import '../../data/bean/default_avatar_info.dart';
  18. import '../../data/repository/account_repository.dart';
  19. import 'package:get/get.dart';
  20. import '../../dialog/keyboard_generating_dialog.dart';
  21. import '../../utils/error_handler.dart';
  22. import '../../utils/http_handler.dart';
  23. import '../../utils/toast_util.dart';
  24. enum NewUserStepType {
  25. stepGenDer(0),
  26. stepBirthday(1),
  27. stepNickname(2),
  28. stepIntimacyStages(3),
  29. stepPartner(4);
  30. final int value;
  31. const NewUserStepType(this.value);
  32. }
  33. @injectable
  34. class NewUserController extends BaseController
  35. with
  36. StepGenDerLogic,
  37. StepBirthdayLogic,
  38. StepNicknameLogic,
  39. StepIntimacyStagesLogic,
  40. StepPartnerLogic {
  41. final AccountRepository accountRepository;
  42. final KeyboardRepository keyboardRepository;
  43. NewUserController(this.accountRepository, this.keyboardRepository);
  44. final RxInt _currentStep = 1.obs;
  45. int get currentStep => _currentStep.value;
  46. final RxInt _totalSteps = 5.obs;
  47. int get totalSteps => _totalSteps.value;
  48. final PageController pageController = PageController();
  49. final Rx<KeyboardInfo> _keyboardInfo = KeyboardInfo().obs;
  50. @override
  51. void onInit() {
  52. super.onInit();
  53. updateAvatarListsAndSelectFirst(currentDefaultAvatarInfo.value);
  54. ever<DefaultAvatarInfo?>(currentDefaultAvatarInfo, (info) {
  55. updateAvatarListsAndSelectFirst(info);
  56. });
  57. }
  58. void clickBack() {
  59. if (currentStep > 1) {
  60. pageController.previousPage(
  61. duration: const Duration(milliseconds: 300),
  62. curve: Curves.easeOut,
  63. );
  64. _currentStep.value--;
  65. } else {
  66. Get.back();
  67. }
  68. }
  69. void clickNextButton() {
  70. if (!isCurrentStepValid) {
  71. ToastUtil.show(currentStepValidationError ?? "请完成当前步骤");
  72. return;
  73. }
  74. if (currentStep == totalSteps) {
  75. _generateKeyboard();
  76. } else {
  77. pageController.nextPage(
  78. duration: const Duration(milliseconds: 300),
  79. curve: Curves.easeIn,
  80. );
  81. _settingUseInfo();
  82. _currentStep.value++;
  83. }
  84. }
  85. void clickUseGeneralMode() {
  86. MainPage.start();
  87. }
  88. void clickSkip() {
  89. MainPage.start();
  90. }
  91. /// 当前步骤是否完成验证
  92. bool get isCurrentStepValid {
  93. switch (currentStep) {
  94. case 1: // 性别
  95. return currentGender != null;
  96. case 2: // 生日
  97. return currentBirthday != null;
  98. case 3: // 昵称
  99. return nickname.trim().isNotEmpty;
  100. case 4: // 亲密阶段
  101. return currentIntimacyMedian > 0;
  102. case 5: // 伴侣信息
  103. return partnerName.value.trim().isNotEmpty &&
  104. currentPartnerBirthday != null &&
  105. partnerAvatarUrl.isNotEmpty &&
  106. partnerGender != null;
  107. default:
  108. return false;
  109. }
  110. }
  111. /// 获取当前步骤未完成提示
  112. String? get currentStepValidationError {
  113. switch (currentStep) {
  114. case 1:
  115. return currentGender == null ? "请选择性别" : null;
  116. case 2:
  117. return currentBirthday == null ? "请选择生日" : null;
  118. case 3:
  119. if (nickname.trim().isEmpty) return "请输入昵称";
  120. if (nickname.contains(' ')) return "昵称不能包含空格";
  121. return null;
  122. case 4:
  123. return currentIntimacyMedian == 0 ? "请选择亲密阶段" : null;
  124. case 5:
  125. if (partnerName.value.isEmpty) return "请填写TA姓名";
  126. if (partnerGender == null) return "请选择TA性别";
  127. if (currentPartnerBirthday == null) return "请填写TA生日";
  128. if (partnerAvatarUrl.isEmpty) return "请选择TA头像";
  129. return null;
  130. default:
  131. return null;
  132. }
  133. }
  134. Future<void> _settingUseInfo() async {
  135. try {
  136. accountRepository.setUserInfo(
  137. name: nickname.value,
  138. birthday:
  139. currentBirthday != null
  140. ? DateFormat('yyyy-MM-dd').format(currentBirthday!)
  141. : null,
  142. gender: currentGender,
  143. imageUrl: null,
  144. );
  145. } catch (error) {
  146. if (error is ServerErrorException) {
  147. ToastUtil.show(error.message);
  148. } else {
  149. AtmobLog.i(tag, error.toString());
  150. }
  151. }
  152. }
  153. Future<void> _generateKeyboard() async {
  154. KeyboardGeneratingDialog.show();
  155. try {
  156. KeyboardGenerateResponse keyboardGenerateResponse =
  157. await keyboardRepository.getKeyboardGenerate(
  158. name: partnerName.value,
  159. gender: partnerGender!,
  160. imageUrl: partnerAvatarUrl,
  161. birthday: DateFormat('yyyy-MM-dd').format(currentPartnerBirthday!),
  162. intimacy: currentIntimacyMedian,
  163. );
  164. if (keyboardGenerateResponse.keyboardInfo == null) {
  165. ToastUtil.show("生成失败");
  166. KeyboardGeneratingDialog.hide();
  167. return;
  168. }
  169. _keyboardInfo.value = keyboardGenerateResponse.keyboardInfo!;
  170. keyboardRepository.refreshData();
  171. Future.delayed(const Duration(seconds: 3), () {
  172. KeyboardGeneratingDialog.hide();
  173. NewUserResultPage.start(
  174. newUserKeyboardInfo: _keyboardInfo.value,
  175. );
  176. });
  177. } catch (error) {
  178. KeyboardGeneratingDialog.hide();
  179. if (error is ServerErrorException) {
  180. ToastUtil.show(error.message);
  181. AtmobLog.d(tag, '_generateKeyboard error: ${error.message}');
  182. } else {
  183. AtmobLog.d(tag, '_generateKeyboard error: $error');
  184. }
  185. }
  186. }
  187. }