|
|
@@ -36,161 +36,17 @@ class DiscountPage extends BasePage<DiscountController> {
|
|
|
child: Column(
|
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
|
children: [
|
|
|
- Row(
|
|
|
- children: [
|
|
|
- Container(
|
|
|
- margin: EdgeInsets.only(left: 16.w, top: 14.h),
|
|
|
- child: GestureDetector(
|
|
|
- onTap: () {
|
|
|
- Get.back();
|
|
|
- },
|
|
|
- child: Assets.images.iconStoreClose
|
|
|
- .image(width: 28.w, height: 28.w),
|
|
|
- ),
|
|
|
- ),
|
|
|
- ],
|
|
|
- ),
|
|
|
- Assets.images.iconDiscountTitle
|
|
|
- .image(width: 259.w, height: 55.h),
|
|
|
- SizedBox(
|
|
|
- height: 20.h,
|
|
|
- ),
|
|
|
- Assets.images.iconDiscountPercent
|
|
|
- .image(width: 195.w, height: 86.h),
|
|
|
- SizedBox(
|
|
|
- height: 13.h,
|
|
|
- ),
|
|
|
- Container(
|
|
|
- width: 197.w,
|
|
|
- height: 32.h,
|
|
|
- padding: EdgeInsets.all(1.w),
|
|
|
- decoration: BoxDecoration(
|
|
|
- gradient: LinearGradient(
|
|
|
- begin: Alignment.topCenter,
|
|
|
- end: Alignment.bottomCenter,
|
|
|
- colors: [
|
|
|
- '#CF9EFD'.color,
|
|
|
- '#4DCFFF'.color.withOpacity(0.5),
|
|
|
- ],
|
|
|
- ),
|
|
|
- borderRadius: BorderRadius.all(Radius.circular(18.r)),
|
|
|
- ),
|
|
|
- child: Container(
|
|
|
- decoration: BoxDecoration(
|
|
|
- color: "#05050D".color,
|
|
|
- borderRadius: BorderRadius.all(Radius.circular(18.r)),
|
|
|
- ),
|
|
|
- child: Center(
|
|
|
- child: Text(
|
|
|
- "Get CleanPro Premium",
|
|
|
- style: TextStyle(
|
|
|
- color: Colors.white,
|
|
|
- fontSize: 15.sp,
|
|
|
- fontWeight: FontWeight.w700,
|
|
|
- ),
|
|
|
- ),
|
|
|
- ),
|
|
|
- ),
|
|
|
- ),
|
|
|
- SizedBox(
|
|
|
- height: 26.h,
|
|
|
- ),
|
|
|
+ _AppBar(),
|
|
|
+ _DiscountHeader(),
|
|
|
+ SizedBox(height: 26.h),
|
|
|
// 创建一个1分钟的倒计时
|
|
|
CountdownTimer(duration: const Duration(minutes: 1)),
|
|
|
- SizedBox(
|
|
|
- height: 40.h,
|
|
|
- ),
|
|
|
- InfinitePreviewPageView(
|
|
|
- height: 98.h,
|
|
|
- autoPlay: true,
|
|
|
- autoPlayDuration: const Duration(seconds: 5),
|
|
|
- items: [
|
|
|
- PreviewItem(
|
|
|
- title: 'One-click Remove Similar Photos',
|
|
|
- icon: Assets.images.iconStoreSimilar.image(),
|
|
|
- ),
|
|
|
- PreviewItem(
|
|
|
- title: 'Detect Blurry and Junk Photos',
|
|
|
- icon: Assets.images.iconStoreAi.image(),
|
|
|
- ),
|
|
|
- PreviewItem(
|
|
|
- title: 'Merge Duplicate Contacts',
|
|
|
- icon: Assets.images.iconStoreContacts.image(),
|
|
|
- ),
|
|
|
- PreviewItem(
|
|
|
- title: 'Premium Unlimited',
|
|
|
- icon: Assets.images.iconStorePremium.image(),
|
|
|
- ),
|
|
|
- ],
|
|
|
- ),
|
|
|
+ SizedBox(height: 40.h),
|
|
|
+ _FeaturesPreview(),
|
|
|
Spacer(),
|
|
|
- Text(
|
|
|
- isShowFree
|
|
|
- ? controller.currentSelectedStoreItem.value
|
|
|
- ?.freeTrialName ??
|
|
|
- ""
|
|
|
- : controller.currentSelectedStoreItem.value?.name ?? "",
|
|
|
- style: TextStyle(
|
|
|
- color: Colors.white,
|
|
|
- fontSize: 16.sp,
|
|
|
- fontWeight: FontWeight.w500,
|
|
|
- ),
|
|
|
- ),
|
|
|
- Text(
|
|
|
- isShowFree
|
|
|
- ? controller.currentSelectedStoreItem.value
|
|
|
- ?.freeTrialPriceDesc ??
|
|
|
- ""
|
|
|
- : controller
|
|
|
- .currentSelectedStoreItem.value?.priceDesc ??
|
|
|
- "",
|
|
|
- style: TextStyle(
|
|
|
- color: Colors.white,
|
|
|
- fontSize: 13.sp,
|
|
|
- ),
|
|
|
- ),
|
|
|
- SizedBox(
|
|
|
- height: 14.h,
|
|
|
- ),
|
|
|
- GestureDetector(
|
|
|
- onTap: () {
|
|
|
- controller.onBuyClick();
|
|
|
- },
|
|
|
- child: Container(
|
|
|
- width: 312.w,
|
|
|
- height: 48.h,
|
|
|
- decoration: BoxDecoration(
|
|
|
- color: "#0279FB".color,
|
|
|
- borderRadius: BorderRadius.all(
|
|
|
- Radius.circular(24.r),
|
|
|
- ),
|
|
|
- ),
|
|
|
- child: Center(
|
|
|
- child: Text(
|
|
|
- isShowFree
|
|
|
- ? "START FREE TRIAL"
|
|
|
- : "START NOW",
|
|
|
- style: TextStyle(
|
|
|
- color: Colors.white,
|
|
|
- fontWeight: FontWeight.w700,
|
|
|
- fontSize: 16.sp,
|
|
|
- ),
|
|
|
- ),
|
|
|
- ),
|
|
|
- ),
|
|
|
- ),
|
|
|
- SizedBox(
|
|
|
- height: 5.h,
|
|
|
- ),
|
|
|
- Text(
|
|
|
- isShowFree
|
|
|
- ? "No payment now!"
|
|
|
- : "Cancel anytime",
|
|
|
- style: TextStyle(
|
|
|
- color: isShowFree ? "#57C87A".color : Colors.white,
|
|
|
- fontSize: 12.sp,
|
|
|
- fontWeight: FontWeight.w500,
|
|
|
- ),
|
|
|
+ _PurchaseSection(
|
|
|
+ isShowFree: isShowFree,
|
|
|
+ controller: controller,
|
|
|
),
|
|
|
],
|
|
|
),
|
|
|
@@ -201,3 +57,180 @@ class DiscountPage extends BasePage<DiscountController> {
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+class _AppBar extends StatelessWidget {
|
|
|
+ const _AppBar({Key? key}) : super(key: key);
|
|
|
+
|
|
|
+ @override
|
|
|
+ Widget build(BuildContext context) {
|
|
|
+ return Row(
|
|
|
+ children: [
|
|
|
+ Container(
|
|
|
+ margin: EdgeInsets.only(left: 16.w, top: 14.h),
|
|
|
+ child: GestureDetector(
|
|
|
+ onTap: () {
|
|
|
+ Get.back();
|
|
|
+ },
|
|
|
+ child: Assets.images.iconStoreClose
|
|
|
+ .image(width: 28.w, height: 28.w),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ],
|
|
|
+ );
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+class _DiscountHeader extends StatelessWidget {
|
|
|
+ const _DiscountHeader({Key? key}) : super(key: key);
|
|
|
+
|
|
|
+ @override
|
|
|
+ Widget build(BuildContext context) {
|
|
|
+ return Column(
|
|
|
+ children: [
|
|
|
+ Assets.images.iconDiscountTitle
|
|
|
+ .image(width: 259.w, height: 55.h),
|
|
|
+ SizedBox(height: 20.h),
|
|
|
+ Assets.images.iconDiscountPercent
|
|
|
+ .image(width: 195.w, height: 86.h),
|
|
|
+ SizedBox(height: 13.h),
|
|
|
+ Container(
|
|
|
+ width: 197.w,
|
|
|
+ height: 32.h,
|
|
|
+ padding: EdgeInsets.all(1.w),
|
|
|
+ decoration: BoxDecoration(
|
|
|
+ gradient: LinearGradient(
|
|
|
+ begin: Alignment.topCenter,
|
|
|
+ end: Alignment.bottomCenter,
|
|
|
+ colors: [
|
|
|
+ '#CF9EFD'.color,
|
|
|
+ '#4DCFFF'.color.withOpacity(0.5),
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ borderRadius: BorderRadius.all(Radius.circular(18.r)),
|
|
|
+ ),
|
|
|
+ child: Container(
|
|
|
+ decoration: BoxDecoration(
|
|
|
+ color: "#05050D".color,
|
|
|
+ borderRadius: BorderRadius.all(Radius.circular(18.r)),
|
|
|
+ ),
|
|
|
+ child: Center(
|
|
|
+ child: Text(
|
|
|
+ "Get CleanPro Premium",
|
|
|
+ style: TextStyle(
|
|
|
+ color: Colors.white,
|
|
|
+ fontSize: 15.sp,
|
|
|
+ fontWeight: FontWeight.w700,
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ],
|
|
|
+ );
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+class _FeaturesPreview extends StatelessWidget {
|
|
|
+ const _FeaturesPreview({Key? key}) : super(key: key);
|
|
|
+
|
|
|
+ @override
|
|
|
+ Widget build(BuildContext context) {
|
|
|
+ return InfinitePreviewPageView(
|
|
|
+ height: 98.h,
|
|
|
+ autoPlay: true,
|
|
|
+ autoPlayDuration: const Duration(seconds: 5),
|
|
|
+ items: [
|
|
|
+ PreviewItem(
|
|
|
+ title: 'One-click Remove Similar Photos',
|
|
|
+ icon: Assets.images.iconStoreSimilar.image(),
|
|
|
+ ),
|
|
|
+ PreviewItem(
|
|
|
+ title: 'Detect Blurry and Junk Photos',
|
|
|
+ icon: Assets.images.iconStoreAi.image(),
|
|
|
+ ),
|
|
|
+ PreviewItem(
|
|
|
+ title: 'Merge Duplicate Contacts',
|
|
|
+ icon: Assets.images.iconStoreContacts.image(),
|
|
|
+ ),
|
|
|
+ PreviewItem(
|
|
|
+ title: 'Premium Unlimited',
|
|
|
+ icon: Assets.images.iconStorePremium.image(),
|
|
|
+ ),
|
|
|
+ ],
|
|
|
+ );
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+class _PurchaseSection extends StatelessWidget {
|
|
|
+ final bool isShowFree;
|
|
|
+ final DiscountController controller;
|
|
|
+
|
|
|
+ const _PurchaseSection({
|
|
|
+ Key? key,
|
|
|
+ required this.isShowFree,
|
|
|
+ required this.controller,
|
|
|
+ }) : super(key: key);
|
|
|
+
|
|
|
+ @override
|
|
|
+ Widget build(BuildContext context) {
|
|
|
+ return Column(
|
|
|
+ children: [
|
|
|
+ Text(
|
|
|
+ isShowFree
|
|
|
+ ? controller.currentSelectedStoreItem.value?.freeTrialName ?? ""
|
|
|
+ : controller.currentSelectedStoreItem.value?.name ?? "",
|
|
|
+ style: TextStyle(
|
|
|
+ color: Colors.white,
|
|
|
+ fontSize: 16.sp,
|
|
|
+ fontWeight: FontWeight.w500,
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ Text(
|
|
|
+ isShowFree
|
|
|
+ ? controller.currentSelectedStoreItem.value?.freeTrialPriceDesc ?? ""
|
|
|
+ : controller.currentSelectedStoreItem.value?.priceDesc ?? "",
|
|
|
+ style: TextStyle(
|
|
|
+ color: Colors.white,
|
|
|
+ fontSize: 13.sp,
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ SizedBox(height: 14.h),
|
|
|
+ GestureDetector(
|
|
|
+ onTap: () {
|
|
|
+ controller.onBuyClick();
|
|
|
+ },
|
|
|
+ child: Container(
|
|
|
+ width: 312.w,
|
|
|
+ height: 48.h,
|
|
|
+ decoration: BoxDecoration(
|
|
|
+ color: "#0279FB".color,
|
|
|
+ borderRadius: BorderRadius.all(
|
|
|
+ Radius.circular(24.r),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ child: Center(
|
|
|
+ child: Text(
|
|
|
+ isShowFree ? "START FREE TRIAL" : "START NOW",
|
|
|
+ style: TextStyle(
|
|
|
+ color: Colors.white,
|
|
|
+ fontWeight: FontWeight.w700,
|
|
|
+ fontSize: 16.sp,
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ SizedBox(height: 5.h),
|
|
|
+ Text(
|
|
|
+ isShowFree ? "No payment now!" : "Cancel anytime",
|
|
|
+ style: TextStyle(
|
|
|
+ color: isShowFree ? "#57C87A".color : Colors.white,
|
|
|
+ fontSize: 12.sp,
|
|
|
+ fontWeight: FontWeight.w500,
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ],
|
|
|
+ );
|
|
|
+ }
|
|
|
+}
|
|
|
+
|