|
|
@@ -0,0 +1,354 @@
|
|
|
+import 'package:flutter/cupertino.dart';
|
|
|
+import 'package:flutter/material.dart';
|
|
|
+import 'package:flutter/src/widgets/framework.dart';
|
|
|
+import 'package:flutter_screenutil/flutter_screenutil.dart';
|
|
|
+import 'package:get/get.dart';
|
|
|
+import 'package:get/get_core/src/get_main.dart';
|
|
|
+import 'package:location/base/base_page.dart';
|
|
|
+import 'package:location/resource/assets.gen.dart';
|
|
|
+import 'package:location/resource/colors.gen.dart';
|
|
|
+import 'package:location/resource/string.gen.dart';
|
|
|
+import 'package:location/utils/expand.dart';
|
|
|
+import '../../router/app_pages.dart';
|
|
|
+import '../../utils/date_util.dart';
|
|
|
+import '../../widget/common_view.dart';
|
|
|
+import 'mine_controller.dart';
|
|
|
+
|
|
|
+class MinePage extends BasePage<MineController> {
|
|
|
+ const MinePage({super.key});
|
|
|
+
|
|
|
+ static void start() {
|
|
|
+ Get.toNamed(RoutePath.mine);
|
|
|
+ }
|
|
|
+
|
|
|
+ @override
|
|
|
+ bool immersive() {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ @override
|
|
|
+ Color backgroundColor() {
|
|
|
+ return '#FAFAFA'.color;
|
|
|
+ }
|
|
|
+
|
|
|
+ @override
|
|
|
+ Widget buildBody(BuildContext context) {
|
|
|
+ return Stack(
|
|
|
+ children: [
|
|
|
+ Assets.images.bgPageBackground.image(width: double.infinity),
|
|
|
+ SafeArea(
|
|
|
+ child: SingleChildScrollView(
|
|
|
+ child: Column(children: [
|
|
|
+ SizedBox(height: 70.w),
|
|
|
+ Row(
|
|
|
+ children: [
|
|
|
+ SizedBox(width: 12.w),
|
|
|
+ Obx(() {
|
|
|
+ return controller.isLogin
|
|
|
+ ? Assets.images.iconMineLogged
|
|
|
+ .image(width: 54.w, height: 54.w)
|
|
|
+ : Assets.images.iconMineNoLogin
|
|
|
+ .image(width: 54.w, height: 54.w);
|
|
|
+ }),
|
|
|
+ SizedBox(width: 10.w),
|
|
|
+ buildLoginInfo(),
|
|
|
+ Spacer(),
|
|
|
+ buildMemberTryOutView()
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ SizedBox(height: 20.w),
|
|
|
+ buildExperienceContent(),
|
|
|
+ SizedBox(height: 16.w),
|
|
|
+ buildFunList()
|
|
|
+ ]),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ buildBackBtn(),
|
|
|
+ ],
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ Widget buildMineFunItem(
|
|
|
+ ImageProvider icon, String funName, VoidCallback onTap) {
|
|
|
+ return Container(
|
|
|
+ padding: EdgeInsets.symmetric(vertical: 15.w, horizontal: 12.w),
|
|
|
+ child: Row(
|
|
|
+ children: [
|
|
|
+ Image(image: icon, width: 24.w, height: 24.w),
|
|
|
+ SizedBox(width: 6.w),
|
|
|
+ Text(funName,
|
|
|
+ style: TextStyle(fontSize: 15.sp, color: '#202020'.color)),
|
|
|
+ Spacer(),
|
|
|
+ Assets.images.iconMineFunArrow.image(width: 20.w, height: 20.w)
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ Widget buildExperienceContent() {
|
|
|
+ return Stack(
|
|
|
+ children: [
|
|
|
+ Column(
|
|
|
+ children: [
|
|
|
+ AspectRatio(
|
|
|
+ aspectRatio: 332 / 57, child: SizedBox(width: double.infinity)),
|
|
|
+ Stack(
|
|
|
+ children: [
|
|
|
+ Container(
|
|
|
+ margin: EdgeInsets.symmetric(horizontal: 14.w),
|
|
|
+ width: double.infinity,
|
|
|
+ height: 50.w,
|
|
|
+ decoration: BoxDecoration(
|
|
|
+ borderRadius: BorderRadius.only(
|
|
|
+ bottomLeft: Radius.circular(8.w),
|
|
|
+ bottomRight: Radius.circular(8.w)),
|
|
|
+ gradient: LinearGradient(
|
|
|
+ begin: Alignment.centerLeft,
|
|
|
+ end: Alignment.centerRight,
|
|
|
+ colors: ['#FFF8DA'.color, '#FFF1BA'.color]),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ Positioned(
|
|
|
+ bottom: 0,
|
|
|
+ left: 0,
|
|
|
+ right: 0,
|
|
|
+ child: Container(
|
|
|
+ margin: EdgeInsets.symmetric(horizontal: 14.w),
|
|
|
+ height: 32.w,
|
|
|
+ child: Row(
|
|
|
+ children: [
|
|
|
+ SizedBox(width: 15.w),
|
|
|
+ Assets.images.iconExperiment
|
|
|
+ .image(width: 16.w, height: 16.w),
|
|
|
+ SizedBox(width: 4.w),
|
|
|
+ Text(StringName.memberExperienceVip,
|
|
|
+ style: TextStyle(
|
|
|
+ fontSize: 13.sp, color: '#8A5F03'.color)),
|
|
|
+ Spacer(),
|
|
|
+ Text(StringName.memberExperienceVipReceive,
|
|
|
+ style: TextStyle(
|
|
|
+ fontSize: 13.sp, color: '#8A5F03'.color)),
|
|
|
+ Assets.images.iconMemberVipReceiveArrow
|
|
|
+ .image(width: 16.w, height: 16.w),
|
|
|
+ SizedBox(width: 13.w),
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ )
|
|
|
+ ],
|
|
|
+ )
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ buildMemberCard()
|
|
|
+ ],
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ Widget buildLoginInfo() {
|
|
|
+ return GestureDetector(
|
|
|
+ behavior: HitTestBehavior.opaque,
|
|
|
+ onTap: () => controller.onLoginClick(),
|
|
|
+ child: Column(
|
|
|
+ mainAxisAlignment: MainAxisAlignment.center,
|
|
|
+ crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
+ children: [
|
|
|
+ Row(
|
|
|
+ children: [
|
|
|
+ Obx(() {
|
|
|
+ String desc = "";
|
|
|
+ if (controller.isLogin &&
|
|
|
+ controller.phone?.isNotEmpty == true) {
|
|
|
+ desc = controller.getUserName(controller.phone!);
|
|
|
+ } else {
|
|
|
+ desc = StringName.mineAccountGoLogin;
|
|
|
+ }
|
|
|
+ return Text(desc,
|
|
|
+ style: TextStyle(
|
|
|
+ fontSize: 16.sp,
|
|
|
+ color: '#333333'.color,
|
|
|
+ fontWeight: FontWeight.bold));
|
|
|
+ }),
|
|
|
+ SizedBox(width: 6.w),
|
|
|
+ Obx(() {
|
|
|
+ return Visibility(
|
|
|
+ visible: controller.isLogin &&
|
|
|
+ controller.memberStatusInfo != null &&
|
|
|
+ controller.memberStatusInfo?.expired == false,
|
|
|
+ child: Assets.images.iconVip.image(width: 28.w));
|
|
|
+ })
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ SizedBox(height: 6.w),
|
|
|
+ buildLoginDesc(),
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ Container buildMemberTryOutView() {
|
|
|
+ return Container(
|
|
|
+ margin: EdgeInsets.only(right: 16.w),
|
|
|
+ decoration: BoxDecoration(
|
|
|
+ color: '#267B7DFF'.color, borderRadius: BorderRadius.circular(26.w)),
|
|
|
+ padding: EdgeInsets.symmetric(horizontal: 8.w, vertical: 5.w),
|
|
|
+ child: Text(StringName.memberTryOut,
|
|
|
+ style: TextStyle(fontSize: 12.sp, color: '#8163FF'.color)),
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ Widget buildBackBtn() {
|
|
|
+ return SafeArea(
|
|
|
+ child: GestureDetector(
|
|
|
+ onTap: controller.onBack,
|
|
|
+ child: Container(
|
|
|
+ margin: EdgeInsets.only(top: 16.w, left: 14.w),
|
|
|
+ child: CommonView.getBackBtnView())),
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ Widget buildLoginDesc() {
|
|
|
+ return Obx(() {
|
|
|
+ String txt = '';
|
|
|
+ if (!controller.isLogin) {
|
|
|
+ txt = StringName.mineNotLoginDesc;
|
|
|
+ } else if (controller.memberStatusInfo != null &&
|
|
|
+ controller.memberStatusInfo?.expired == false) {
|
|
|
+ txt = StringName.mineVip;
|
|
|
+ } else {
|
|
|
+ txt = StringName.mineOpenVip;
|
|
|
+ }
|
|
|
+ return Text(txt,
|
|
|
+ style: TextStyle(fontSize: 13.sp, color: '#727272'.color));
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ Widget buildMemberCard() {
|
|
|
+ return AspectRatio(
|
|
|
+ aspectRatio: 332 / 75,
|
|
|
+ child: Container(
|
|
|
+ margin: EdgeInsets.symmetric(horizontal: 14.w),
|
|
|
+ decoration: BoxDecoration(
|
|
|
+ image: DecorationImage(
|
|
|
+ image: Assets.images.bgMineMemberCard.provider(),
|
|
|
+ fit: BoxFit.fill)),
|
|
|
+ child: Row(
|
|
|
+ children: [
|
|
|
+ SizedBox(width: 14.w),
|
|
|
+ Column(
|
|
|
+ crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
+ mainAxisAlignment: MainAxisAlignment.center,
|
|
|
+ children: [
|
|
|
+ Row(
|
|
|
+ children: [
|
|
|
+ Assets.images.iconMineUnlockVip.image(width: 68.w),
|
|
|
+ SizedBox(width: 6.5.w),
|
|
|
+ Assets.images.iconMineSmallVip
|
|
|
+ .image(width: 21.6.w, height: 21.6.w),
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ SizedBox(height: 6.w),
|
|
|
+ buildMemberCardVipDesc()
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ Spacer(),
|
|
|
+ buildBuyMemberCardBtn()
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ Widget buildMemberCardVipDesc() {
|
|
|
+ return Obx(() {
|
|
|
+ String desc = '';
|
|
|
+ if (!controller.isLogin) {
|
|
|
+ desc = StringName.memberCardNoLoginDesc;
|
|
|
+ } else if (controller.memberStatusInfo == null ||
|
|
|
+ controller.memberStatusInfo?.expired == true) {
|
|
|
+ desc = StringName.memberCardNoVipDesc;
|
|
|
+ } else if (controller.memberStatusInfo?.expired == false &&
|
|
|
+ controller.memberStatusInfo?.permanent == true) {
|
|
|
+ desc = StringName.memberCardPermanentVipDesc;
|
|
|
+ } else {
|
|
|
+ desc =
|
|
|
+ '${StringName.memberCardExpirationDesc} ${DateUtil.fromMillisecondsSinceEpoch('yyyy.MM.dd', controller.memberStatusInfo?.endTimestamp ?? 0)}';
|
|
|
+ }
|
|
|
+ return Text(desc,
|
|
|
+ style: TextStyle(fontSize: 12.sp, color: ColorName.white80));
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ Widget buildBuyMemberCardBtn() {
|
|
|
+ return Obx(() {
|
|
|
+ String txt = "";
|
|
|
+ if (!controller.isLogin ||
|
|
|
+ controller.memberStatusInfo == null ||
|
|
|
+ controller.memberStatusInfo?.expired == true) {
|
|
|
+ txt = StringName.memberVipUnlock;
|
|
|
+ } else if (controller.memberStatusInfo?.expired == false &&
|
|
|
+ controller.memberStatusInfo?.permanent == true) {
|
|
|
+ txt = StringName.mineMemberPermanent;
|
|
|
+ } else {
|
|
|
+ txt = StringName.memberVipRenew;
|
|
|
+ }
|
|
|
+ return Container(
|
|
|
+ margin: EdgeInsets.only(right: 20.w),
|
|
|
+ decoration: BoxDecoration(
|
|
|
+ color: ColorName.white, borderRadius: BorderRadius.circular(26.w)),
|
|
|
+ padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 6.w),
|
|
|
+ child: Text(txt,
|
|
|
+ style: TextStyle(
|
|
|
+ fontSize: 12.sp,
|
|
|
+ color: '#5558FC'.color,
|
|
|
+ fontWeight: FontWeight.bold)),
|
|
|
+ );
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ Widget buildFunList() {
|
|
|
+ return Container(
|
|
|
+ decoration: BoxDecoration(
|
|
|
+ color: ColorName.white, borderRadius: BorderRadius.circular(12.w)),
|
|
|
+ margin: EdgeInsets.symmetric(horizontal: 12.w),
|
|
|
+ padding: EdgeInsets.symmetric(vertical: 5.w),
|
|
|
+ child: Column(
|
|
|
+ children: [
|
|
|
+ buildMineFunItem(Assets.images.iconMineFunShare.provider(),
|
|
|
+ StringName.mineFunShare, () => controller.onShareClick()),
|
|
|
+ buildMineFunItem(
|
|
|
+ Assets.images.iconMineFunCustomerService.provider(),
|
|
|
+ StringName.mineFunCustomerService,
|
|
|
+ () => controller.onCustomerServiceClick()),
|
|
|
+ buildMineFunItem(
|
|
|
+ Assets.images.iconMineFunPermissionSetting.provider(),
|
|
|
+ StringName.mineFunPermissionSetting,
|
|
|
+ () => controller.onPermissionSettingClick()),
|
|
|
+ buildMineFunItem(
|
|
|
+ Assets.images.iconMineFunAccountFeedback.provider(),
|
|
|
+ StringName.mineFunAccountFeedback,
|
|
|
+ () => controller.onAccountFeedbackClick()),
|
|
|
+ buildMineFunItem(Assets.images.iconMineFunAbout.provider(),
|
|
|
+ StringName.mineFunAbout, () => controller.onAboutClick()),
|
|
|
+ Obx(() {
|
|
|
+ return Visibility(
|
|
|
+ visible: controller.isLogin,
|
|
|
+ child: buildMineFunItem(
|
|
|
+ Assets.images.iconMineFunLogoutAccount.provider(),
|
|
|
+ StringName.mineFunLogoutAccount,
|
|
|
+ () => controller.onLogoutAccountClick()),
|
|
|
+ );
|
|
|
+ }),
|
|
|
+ Obx(() {
|
|
|
+ return Visibility(
|
|
|
+ visible: controller.isLogin,
|
|
|
+ child: buildMineFunItem(
|
|
|
+ Assets.images.iconMineFunExitAccount.provider(),
|
|
|
+ StringName.mineFunExitAccount,
|
|
|
+ () => controller.onFunExitAccountClick()),
|
|
|
+ );
|
|
|
+ }),
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ );
|
|
|
+ }
|
|
|
+}
|