mine_page.dart 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. import 'package:flutter/cupertino.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter/src/widgets/framework.dart';
  4. import 'package:flutter_screenutil/flutter_screenutil.dart';
  5. import 'package:get/get.dart';
  6. import 'package:get/get_core/src/get_main.dart';
  7. import 'package:location/base/base_page.dart';
  8. import 'package:location/resource/assets.gen.dart';
  9. import 'package:location/resource/colors.gen.dart';
  10. import 'package:location/resource/string.gen.dart';
  11. import 'package:location/utils/common_expand.dart';
  12. import '../../router/app_pages.dart';
  13. import '../../utils/date_util.dart';
  14. import '../../widget/common_view.dart';
  15. import 'mine_controller.dart';
  16. class MinePage extends BasePage<MineController> {
  17. const MinePage({super.key});
  18. static void start() {
  19. Get.toNamed(RoutePath.mine);
  20. }
  21. @override
  22. bool immersive() {
  23. return true;
  24. }
  25. @override
  26. Color backgroundColor() {
  27. return '#FAFAFA'.color;
  28. }
  29. @override
  30. Widget buildBody(BuildContext context) {
  31. return Stack(
  32. children: [
  33. Assets.images.bgPageBackground.image(width: double.infinity),
  34. SafeArea(
  35. child: SingleChildScrollView(
  36. child: Column(children: [
  37. SizedBox(height: 70.w),
  38. Row(
  39. children: [
  40. SizedBox(width: 12.w),
  41. Obx(() {
  42. return controller.isLogin
  43. ? Assets.images.iconMineLogged
  44. .image(width: 54.w, height: 54.w)
  45. : Assets.images.iconMineNoLogin
  46. .image(width: 54.w, height: 54.w);
  47. }),
  48. SizedBox(width: 10.w),
  49. buildLoginInfo(),
  50. Spacer(),
  51. buildMemberTryOutView()
  52. ],
  53. ),
  54. SizedBox(height: 20.w),
  55. buildExperienceContent(),
  56. SizedBox(height: 16.w),
  57. buildFunList()
  58. ]),
  59. ),
  60. ),
  61. buildBackBtn(),
  62. ],
  63. );
  64. }
  65. Widget buildMineFunItem(
  66. ImageProvider icon, String funName, VoidCallback onTap) {
  67. return GestureDetector(
  68. behavior: HitTestBehavior.translucent,
  69. onTap: onTap,
  70. child: Container(
  71. padding: EdgeInsets.symmetric(vertical: 15.w, horizontal: 12.w),
  72. child: Row(
  73. children: [
  74. Image(image: icon, width: 24.w, height: 24.w),
  75. SizedBox(width: 6.w),
  76. Text(funName,
  77. style: TextStyle(fontSize: 15.sp, color: '#202020'.color)),
  78. Spacer(),
  79. Assets.images.iconMineFunArrow.image(width: 20.w, height: 20.w)
  80. ],
  81. ),
  82. ),
  83. );
  84. }
  85. Widget buildExperienceContent() {
  86. return Stack(
  87. children: [
  88. Column(
  89. children: [
  90. AspectRatio(
  91. aspectRatio: 332 / 57, child: SizedBox(width: double.infinity)),
  92. Stack(
  93. children: [
  94. Container(
  95. margin: EdgeInsets.symmetric(horizontal: 14.w),
  96. width: double.infinity,
  97. height: 50.w,
  98. decoration: BoxDecoration(
  99. borderRadius: BorderRadius.only(
  100. bottomLeft: Radius.circular(8.w),
  101. bottomRight: Radius.circular(8.w)),
  102. gradient: LinearGradient(
  103. begin: Alignment.centerLeft,
  104. end: Alignment.centerRight,
  105. colors: ['#FFF8DA'.color, '#FFF1BA'.color]),
  106. ),
  107. ),
  108. Positioned(
  109. bottom: 0,
  110. left: 0,
  111. right: 0,
  112. child: Container(
  113. margin: EdgeInsets.symmetric(horizontal: 14.w),
  114. height: 32.w,
  115. child: Row(
  116. children: [
  117. SizedBox(width: 15.w),
  118. Assets.images.iconExperiment
  119. .image(width: 16.w, height: 16.w),
  120. SizedBox(width: 4.w),
  121. Text(StringName.memberExperienceVip,
  122. style: TextStyle(
  123. fontSize: 13.sp, color: '#8A5F03'.color)),
  124. Spacer(),
  125. Text(StringName.memberExperienceVipReceive,
  126. style: TextStyle(
  127. fontSize: 13.sp, color: '#8A5F03'.color)),
  128. Assets.images.iconMemberVipReceiveArrow
  129. .image(width: 16.w, height: 16.w),
  130. SizedBox(width: 13.w),
  131. ],
  132. ),
  133. ),
  134. )
  135. ],
  136. )
  137. ],
  138. ),
  139. buildMemberCard()
  140. ],
  141. );
  142. }
  143. Widget buildLoginInfo() {
  144. return GestureDetector(
  145. behavior: HitTestBehavior.opaque,
  146. onTap: () => controller.onLoginClick(),
  147. child: Column(
  148. mainAxisAlignment: MainAxisAlignment.center,
  149. crossAxisAlignment: CrossAxisAlignment.start,
  150. children: [
  151. Row(
  152. children: [
  153. Obx(() {
  154. String desc = "";
  155. if (controller.isLogin &&
  156. controller.phone?.isNotEmpty == true) {
  157. desc = controller.getUserName(controller.phone!);
  158. } else {
  159. desc = StringName.mineAccountGoLogin;
  160. }
  161. return Text(desc,
  162. style: TextStyle(
  163. fontSize: 16.sp,
  164. color: '#333333'.color,
  165. fontWeight: FontWeight.bold));
  166. }),
  167. SizedBox(width: 6.w),
  168. Obx(() {
  169. return Visibility(
  170. visible: controller.isLogin &&
  171. controller.memberStatusInfo != null &&
  172. controller.memberStatusInfo?.expired == false,
  173. child: Assets.images.iconVip.image(width: 28.w));
  174. })
  175. ],
  176. ),
  177. SizedBox(height: 6.w),
  178. buildLoginDesc(),
  179. ],
  180. ),
  181. );
  182. }
  183. Container buildMemberTryOutView() {
  184. return Container(
  185. margin: EdgeInsets.only(right: 16.w),
  186. decoration: BoxDecoration(
  187. color: '#267B7DFF'.color, borderRadius: BorderRadius.circular(26.w)),
  188. padding: EdgeInsets.symmetric(horizontal: 8.w, vertical: 5.w),
  189. child: Text(StringName.memberTryOut,
  190. style: TextStyle(fontSize: 12.sp, color: '#8163FF'.color)),
  191. );
  192. }
  193. Widget buildBackBtn() {
  194. return SafeArea(
  195. child: GestureDetector(
  196. onTap: controller.onBack,
  197. child: Container(
  198. margin: EdgeInsets.only(top: 16.w, left: 14.w),
  199. child: CommonView.getBackBtnView())),
  200. );
  201. }
  202. Widget buildLoginDesc() {
  203. return Obx(() {
  204. String txt = '';
  205. if (!controller.isLogin) {
  206. txt = StringName.mineNotLoginDesc;
  207. } else if (controller.memberStatusInfo != null &&
  208. controller.memberStatusInfo?.expired == false) {
  209. txt = StringName.mineVip;
  210. } else {
  211. txt = StringName.mineOpenVip;
  212. }
  213. return Text(txt,
  214. style: TextStyle(fontSize: 13.sp, color: '#727272'.color));
  215. });
  216. }
  217. Widget buildMemberCard() {
  218. return AspectRatio(
  219. aspectRatio: 332 / 75,
  220. child: Container(
  221. margin: EdgeInsets.symmetric(horizontal: 14.w),
  222. decoration: BoxDecoration(
  223. image: DecorationImage(
  224. image: Assets.images.bgMineMemberCard.provider(),
  225. fit: BoxFit.fill)),
  226. child: Row(
  227. children: [
  228. SizedBox(width: 14.w),
  229. Column(
  230. crossAxisAlignment: CrossAxisAlignment.start,
  231. mainAxisAlignment: MainAxisAlignment.center,
  232. children: [
  233. Row(
  234. children: [
  235. Assets.images.iconMineUnlockVip.image(width: 68.w),
  236. SizedBox(width: 6.5.w),
  237. Assets.images.iconMineSmallVip
  238. .image(width: 21.6.w, height: 21.6.w),
  239. ],
  240. ),
  241. SizedBox(height: 6.w),
  242. buildMemberCardVipDesc()
  243. ],
  244. ),
  245. Spacer(),
  246. buildBuyMemberCardBtn()
  247. ],
  248. ),
  249. ),
  250. );
  251. }
  252. Widget buildMemberCardVipDesc() {
  253. return Obx(() {
  254. String desc = '';
  255. if (!controller.isLogin) {
  256. desc = StringName.memberCardNoLoginDesc;
  257. } else if (controller.memberStatusInfo == null ||
  258. controller.memberStatusInfo?.expired == true) {
  259. desc = StringName.memberCardNoVipDesc;
  260. } else if (controller.memberStatusInfo?.expired == false &&
  261. controller.memberStatusInfo?.permanent == true) {
  262. desc = StringName.memberCardPermanentVipDesc;
  263. } else {
  264. desc =
  265. '${StringName.memberCardExpirationDesc} ${DateUtil.fromMillisecondsSinceEpoch('yyyy.MM.dd', controller.memberStatusInfo?.endTimestamp ?? 0)}';
  266. }
  267. return Text(desc,
  268. style: TextStyle(fontSize: 12.sp, color: ColorName.white80));
  269. });
  270. }
  271. Widget buildBuyMemberCardBtn() {
  272. return Obx(() {
  273. String txt = "";
  274. if (!controller.isLogin ||
  275. controller.memberStatusInfo == null ||
  276. controller.memberStatusInfo?.expired == true) {
  277. txt = StringName.memberVipUnlock;
  278. } else if (controller.memberStatusInfo?.expired == false &&
  279. controller.memberStatusInfo?.permanent == true) {
  280. txt = StringName.mineMemberPermanent;
  281. } else {
  282. txt = StringName.memberVipRenew;
  283. }
  284. return Container(
  285. margin: EdgeInsets.only(right: 20.w),
  286. decoration: BoxDecoration(
  287. color: ColorName.white, borderRadius: BorderRadius.circular(26.w)),
  288. padding: EdgeInsets.symmetric(horizontal: 13.w, vertical: 6.w),
  289. child: Text(txt,
  290. style: TextStyle(
  291. fontSize: 12.sp,
  292. color: '#5558FC'.color,
  293. fontWeight: FontWeight.bold)),
  294. );
  295. });
  296. }
  297. Widget buildFunList() {
  298. return Container(
  299. decoration: BoxDecoration(
  300. color: ColorName.white, borderRadius: BorderRadius.circular(12.w)),
  301. margin: EdgeInsets.symmetric(horizontal: 12.w),
  302. padding: EdgeInsets.symmetric(vertical: 5.w),
  303. child: Column(
  304. children: [
  305. buildMineFunItem(
  306. Assets.images.iconMineUrgentContact.provider(),
  307. StringName.mineUrgentContact,
  308. () => controller.onUrgentContactClick()),
  309. buildMineFunItem(Assets.images.iconMineFunShare.provider(),
  310. StringName.mineFunShare, () => controller.onShareClick()),
  311. buildMineFunItem(
  312. Assets.images.iconMineFunCustomerService.provider(),
  313. StringName.mineFunCustomerService,
  314. () => controller.onCustomerServiceClick()),
  315. buildMineFunItem(
  316. Assets.images.iconMineFunPermissionSetting.provider(),
  317. StringName.mineFunPermissionSetting,
  318. () => controller.onPermissionSettingClick()),
  319. buildMineFunItem(
  320. Assets.images.iconMineFunAccountFeedback.provider(),
  321. StringName.mineFunAccountFeedback,
  322. () => controller.onAccountFeedbackClick()),
  323. buildMineFunItem(Assets.images.iconMineFunAbout.provider(),
  324. StringName.mineFunAbout, () => controller.onAboutClick()),
  325. Obx(() {
  326. return Visibility(
  327. visible: controller.isLogin,
  328. child: buildMineFunItem(
  329. Assets.images.iconMineFunLogoutAccount.provider(),
  330. StringName.mineFunLogoutAccount,
  331. () => controller.onLogoutAccountClick()),
  332. );
  333. }),
  334. Obx(() {
  335. return Visibility(
  336. visible: controller.isLogin,
  337. child: buildMineFunItem(
  338. Assets.images.iconMineFunExitAccount.provider(),
  339. StringName.mineFunExitAccount,
  340. () => controller.onFunExitAccountClick()),
  341. );
  342. }),
  343. ],
  344. ),
  345. );
  346. }
  347. }