member_controller.dart 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. import 'dart:async';
  2. import 'dart:math';
  3. import 'package:flutter/cupertino.dart';
  4. import 'package:flutter/material.dart';
  5. import 'package:flutter_screenutil/flutter_screenutil.dart';
  6. import 'package:get/get.dart';
  7. import 'package:injectable/injectable.dart';
  8. import 'package:location/base/base_controller.dart';
  9. import 'package:location/data/bean/goods_bean.dart';
  10. import 'package:location/data/bean/pay_item_bean.dart';
  11. import 'package:location/data/repositories/account_repository.dart';
  12. import 'package:location/data/repositories/member_repository.dart';
  13. import 'package:location/handler/error_handler.dart';
  14. import 'package:location/module/login/login_page.dart';
  15. import 'package:location/resource/assets.gen.dart';
  16. import 'package:location/utils/async_util.dart';
  17. import 'package:location/utils/common_expand.dart';
  18. import '../../data/bean/member_status_info.dart';
  19. import '../../data/consts/web_url.dart';
  20. import '../../resource/string.gen.dart';
  21. import '../../widget/animated_switcher_widget.dart';
  22. import '../browser/browser_view.dart';
  23. import 'member_evaluate_bean.dart';
  24. import 'member_fun_bean.dart';
  25. @injectable
  26. class MemberController extends BaseController {
  27. final AccountRepository accountRepository;
  28. final MemberRepository memberRepository;
  29. final switcherController = SwitcherController();
  30. final ScrollController scrollController = ScrollController();
  31. StreamController? _changeStreamController;
  32. final random = Random();
  33. final RxDouble _toolBarOpacity = 0.0.obs;
  34. double get toolBarOpacity => _toolBarOpacity.value;
  35. final List<String> _storeTypes = ['终身会员', '年度会员', '月度会员'];
  36. String? get phone => accountRepository.loginPhoneNum.value;
  37. bool get isLogin => accountRepository.isLogin.value;
  38. MemberStatusInfo? get memberStatusInfo =>
  39. accountRepository.memberStatusInfo.value;
  40. final RxList<GoodsBean> goodsList = <GoodsBean>[].obs;
  41. final Rxn<GoodsBean> _selectedGoods = Rxn<GoodsBean>();
  42. GoodsBean? get selectedGoods => _selectedGoods.value;
  43. final RxList<PayItemBean> payItemList = <PayItemBean>[].obs;
  44. CancelableFuture? _memberDataFuture;
  45. final List<MemberFunBean> funList = [
  46. MemberFunBean(1, Assets.images.iconMemberFun1.path,
  47. StringName.memberFunName1, StringName.memberFunName1Desc),
  48. MemberFunBean(2, Assets.images.iconMemberFun2.path,
  49. StringName.memberFunName2, StringName.memberFunName2Desc),
  50. MemberFunBean(3, Assets.images.iconMemberFun3.path,
  51. StringName.memberFunName3, StringName.memberFunName3Desc),
  52. // MemberFunBean(4, Assets.images.iconMemberFun4.path, StringName.memberFunName4, StringName.memberFunName4Desc), //该功能还未开发
  53. MemberFunBean(5, Assets.images.iconMemberFun5.path,
  54. StringName.memberFunName5, StringName.memberFunName5Desc),
  55. MemberFunBean(6, Assets.images.iconMemberFun6.path,
  56. StringName.memberFunName6, StringName.memberFunName6Desc),
  57. ];
  58. final List<MemberEvaluateBean> evaluateList = [
  59. MemberEvaluateBean(1, Assets.images.iconEvaluate1.path, '用户189****7913',
  60. "上班没时间,远程遛娃,非常方便很好用。"),
  61. MemberEvaluateBean(2, Assets.images.iconEvaluate2.path, '用户177****2345',
  62. "这个功能太棒了!尤其是夜间出行时,一键报警让我感觉特别安心。"),
  63. MemberEvaluateBean(3, Assets.images.iconEvaluate3.path, '用户138****6789',
  64. "强烈推荐!我和家人经常用这个功能来共享位置,尤其是旅游时,走散了也不怕。"),
  65. MemberEvaluateBean(4, Assets.images.iconEvaluate4.path, '用户159****3456',
  66. "实时定位非常精准,用来监控孩子的行踪特别方便,再也不用担心他们乱跑了。"),
  67. MemberEvaluateBean(5, Assets.images.iconEvaluate5.path, '用户182****9012',
  68. "用来遛狗也很方便,再也不用担心狗狗跑丢了,真是个好工具!"),
  69. ];
  70. MemberController(this.accountRepository, this.memberRepository);
  71. @override
  72. void onReady() async {
  73. super.onReady();
  74. _startAnimationSwitcher();
  75. scrollController.addListener(() {
  76. double offset = scrollController.offset;
  77. double opacity = offset / 100;
  78. if (opacity > 1) {
  79. opacity = 1;
  80. } else if (opacity < 0) {
  81. opacity = 0;
  82. }
  83. _toolBarOpacity.value = opacity;
  84. });
  85. refreshMemberData();
  86. }
  87. void _startAnimationSwitcher() {
  88. _changeStreamController = AsyncUtil.interval(
  89. (time) => changeSwitcherContent(), Duration(seconds: 3), -1);
  90. }
  91. Future<void> changeSwitcherContent() async {
  92. int userId = random.nextInt(10000);
  93. String userIdStr = userId.toString();
  94. int padLength = 4 - userIdStr.length;
  95. for (int i = 0; i < padLength; i++) {
  96. userIdStr = random.nextInt(10).toString() + userIdStr;
  97. }
  98. bool isHour = random.nextBool();
  99. String secondsOrHour;
  100. if (isHour) {
  101. secondsOrHour = "${1 + random.nextInt(8)}小时";
  102. } else {
  103. secondsOrHour = "${1 + random.nextInt(59)}分钟";
  104. }
  105. int index = random.nextInt(_storeTypes.length);
  106. switcherController.updateWidget(Row(
  107. mainAxisAlignment: MainAxisAlignment.center,
  108. children: [
  109. RichText(
  110. text: TextSpan(
  111. style: TextStyle(fontSize: 12.sp, color: Colors.white),
  112. children: [
  113. TextSpan(text: userIdStr),
  114. TextSpan(text: '用户 '),
  115. TextSpan(text: secondsOrHour),
  116. TextSpan(text: '前购买了'),
  117. TextSpan(
  118. text: _storeTypes[index],
  119. style: TextStyle(color: '#FFC95D'.color)),
  120. ]))
  121. ],
  122. ));
  123. }
  124. String getUserName(String phone) {
  125. if (phone.length > 4) {
  126. phone = phone.substring(phone.length - 4);
  127. }
  128. return '${StringName.mineAccountLoggedDesc}$phone';
  129. }
  130. void back() {
  131. Get.back();
  132. }
  133. @override
  134. void onClose() {
  135. super.onClose();
  136. _changeStreamController?.close();
  137. _memberDataFuture?.cancel();
  138. scrollController.dispose();
  139. }
  140. void onLoginClick() {
  141. if (accountRepository.isLogin.value) {
  142. return;
  143. }
  144. LoginPage.start();
  145. }
  146. void refreshMemberData() {
  147. _memberDataFuture?.cancel();
  148. _memberDataFuture =
  149. AsyncUtil.retryWithExponentialBackoff(() => _requestMemberData(), 4);
  150. _memberDataFuture?.catchError((error) {
  151. ErrorHandler.toastError(error);
  152. });
  153. }
  154. Future<void> _requestMemberData() {
  155. return memberRepository.getMemberList().then((response) {
  156. goodsList.clear();
  157. payItemList.clear();
  158. _selectedGoods.value = null;
  159. if (response.goodsList?.isNotEmpty == true) {
  160. goodsList.addAll(response.goodsList!);
  161. _selectedGoods.value = goodsList.first;
  162. }
  163. if (response.payInfoList?.isNotEmpty == true) {
  164. payItemList.addAll(response.payInfoList!);
  165. }
  166. });
  167. }
  168. void onGoodsItemClick(GoodsBean item) {
  169. _selectedGoods.value = item;
  170. }
  171. void onPrivacyPolicyClick() {
  172. BrowserPage.start(WebUrl.privacyPolicy);
  173. }
  174. void onTermOfServiceClick() {
  175. BrowserPage.start(WebUrl.userAgreement);
  176. }
  177. }