new_discount_page.dart 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763
  1. import 'package:flutter/src/widgets/framework.dart';
  2. import 'package:flutter_screenutil/flutter_screenutil.dart';
  3. import 'package:keyboard/base/base_page.dart';
  4. import 'package:keyboard/data/bean/goods_info.dart';
  5. import 'package:keyboard/module/store/new_discount/new_discount_controller.dart';
  6. import 'package:flutter/material.dart';
  7. import 'package:carousel_slider/carousel_slider.dart';
  8. import 'package:get/get.dart';
  9. import '../../../data/bean/character_info.dart';
  10. import '../../../data/consts/payment_type.dart';
  11. import '../../../data/consts/web_url.dart';
  12. import '../../../resource/assets.gen.dart';
  13. import '../../../resource/colors.gen.dart';
  14. import '../../../resource/string.gen.dart';
  15. import '../../../router/app_pages.dart';
  16. import '../../../utils/styles.dart';
  17. import '../../../widget/auto_scroll_list_view.dart';
  18. import '../../../widget/click_text_span.dart';
  19. class NewDiscountPage extends BasePage<NewDiscountController> {
  20. const NewDiscountPage({super.key});
  21. /// 跳转
  22. static Future<void> start() async {
  23. await Get.toNamed(RoutePath.newDiscount);
  24. }
  25. @override
  26. bool immersive() {
  27. return true;
  28. }
  29. @override
  30. backgroundColor() => Colors.white;
  31. @override
  32. Widget buildBody(BuildContext context) {
  33. return PopScope(
  34. canPop: false,
  35. onPopInvokedWithResult: (didPop, result) {
  36. if (didPop) {
  37. return;
  38. }
  39. controller.clickBack();
  40. },
  41. child: Stack(
  42. children: [
  43. Positioned(top: 0.w, child: _buildBanner()),
  44. Positioned(
  45. top: 408.w,
  46. child: Container(
  47. decoration: BoxDecoration(
  48. color: ColorName.white,
  49. borderRadius: BorderRadius.only(
  50. topLeft: Radius.circular(24.r),
  51. topRight: Radius.circular(24.r),
  52. ),
  53. ),
  54. width: 360.w,
  55. height: 392.w,
  56. child: SingleChildScrollView(
  57. child: Column(
  58. children: [
  59. SizedBox(height: 16.w),
  60. _buildGoodsCard(),
  61. SizedBox(height: 12.w),
  62. _buildPayWayCard(),
  63. SizedBox(height: 8.w),
  64. _buildSelectedDesc(),
  65. SizedBox(height: 30.w),
  66. _buildMemberCard(),
  67. SizedBox(height: 200.w),
  68. ],
  69. ),
  70. ),
  71. ),
  72. ),
  73. Positioned(top: 0, left: 0, right: 0, child: _buildTitle()),
  74. Positioned(bottom: 0, left: 0, right: 0, child: _buildBuyButtonCard()),
  75. ],
  76. ));
  77. }
  78. _buildTitle() {
  79. return SafeArea(
  80. child: Container(
  81. alignment: Alignment.centerLeft,
  82. padding: EdgeInsets.only(top: 16.h, left: 16.w, right: 16.w),
  83. child: Row(
  84. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  85. children: [
  86. GestureDetector(
  87. onTap: controller.clickBack,
  88. child: Assets.images.iconDiscountClose.image(
  89. width: 32.w,
  90. height: 32.w,
  91. ),
  92. ),
  93. ],
  94. ),
  95. ),
  96. );
  97. }
  98. Widget _buildBanner() {
  99. return SizedBox(
  100. width: 360.w,
  101. child: Stack(
  102. children: [
  103. CarouselSlider(
  104. carouselController: controller.carouselSliderController,
  105. options: CarouselOptions(
  106. height: 438.w,
  107. viewportFraction: 1,
  108. initialPage: 0,
  109. enableInfiniteScroll: true,
  110. reverse: false,
  111. autoPlay: true,
  112. autoPlayInterval: const Duration(seconds: 3),
  113. autoPlayAnimationDuration: const Duration(milliseconds: 500),
  114. autoPlayCurve: Curves.fastOutSlowIn,
  115. scrollDirection: Axis.horizontal,
  116. onPageChanged: (index, reason) {
  117. controller.onBannerChanged(index, reason);
  118. },
  119. ),
  120. items:
  121. controller.bannerList.map((item) {
  122. return item.image(width: 360.w, fit: BoxFit.contain);
  123. }).toList(),
  124. ),
  125. Positioned(
  126. bottom: 149.16.w,
  127. left: 31.w,
  128. child: Assets.images.iconNewDiscountCharacterTitle.image(
  129. width: 296.w,
  130. height: 39.w,
  131. ),
  132. ),
  133. Positioned(
  134. bottom: 211.13.w,
  135. left: 42.w,
  136. right: 0,
  137. child: _buildIndicator(),
  138. ),
  139. Positioned(
  140. bottom: 0,
  141. left: 0,
  142. right: 0,
  143. child: _buildAutoCharacterList(),
  144. ),
  145. ],
  146. ),
  147. );
  148. }
  149. /// 指示器
  150. _buildIndicator() {
  151. return Row(
  152. children:
  153. controller.bannerList.asMap().entries.map((entry) {
  154. return Obx(() {
  155. final isSelectedBanner =
  156. controller.currentBannerIndex == entry.key;
  157. return Row(
  158. mainAxisAlignment: MainAxisAlignment.spaceAround,
  159. children: [
  160. GestureDetector(
  161. onTap:
  162. () => controller.carouselSliderController.animateToPage(
  163. entry.key,
  164. ),
  165. child: AnimatedContainer(
  166. duration: const Duration(milliseconds: 300),
  167. margin: EdgeInsets.only(right: 5.w),
  168. height: 5.w,
  169. width: isSelectedBanner ? 10.w : 5.w,
  170. decoration: BoxDecoration(
  171. color:
  172. isSelectedBanner
  173. ? const Color(0xff483459)
  174. : const Color(0xffAFB4BF),
  175. borderRadius: BorderRadius.circular(5.r),
  176. ),
  177. ),
  178. ),
  179. ],
  180. );
  181. });
  182. }).toList(),
  183. );
  184. }
  185. Widget _buildAutoCharacterList() {
  186. return Obx(() {
  187. if (controller.charactersList.isEmpty) {
  188. return Container();
  189. }
  190. return SizedBox(
  191. height: 130.w,
  192. child: AutoScrollListView(
  193. itemCount: (controller.charactersList.length / 2).ceil(),
  194. scrollDirection: Axis.horizontal,
  195. itemBuilder: (context, columnIndex) {
  196. int rowCount = 2;
  197. int startIndex = columnIndex * rowCount;
  198. final List<CharacterInfo> columnItems =
  199. controller.charactersList
  200. .skip(startIndex)
  201. .take(rowCount)
  202. .toList();
  203. return Column(
  204. children:
  205. columnItems.map((item) {
  206. final emoji = item.emoji ?? "";
  207. final name = item.name ?? "";
  208. return Padding(
  209. padding: EdgeInsets.symmetric(
  210. vertical: 4.w,
  211. horizontal: 4.w,
  212. ),
  213. child: Container(
  214. padding: EdgeInsets.symmetric(
  215. horizontal: 12.w,
  216. vertical: 6.w,
  217. ),
  218. decoration: ShapeDecoration(
  219. color: Colors.white,
  220. shape: RoundedRectangleBorder(
  221. side: BorderSide(
  222. width: 1.w,
  223. color: const Color(0xFFF4F1FF),
  224. ),
  225. borderRadius: BorderRadius.circular(31.r),
  226. ),
  227. ),
  228. child: Text(
  229. "$emoji$name",
  230. style: TextStyle(
  231. color: Colors.black.withAlpha(204),
  232. fontSize: 13.sp,
  233. fontWeight: FontWeight.w400,
  234. ),
  235. ),
  236. ),
  237. );
  238. }).toList(),
  239. );
  240. },
  241. ),
  242. );
  243. });
  244. }
  245. Widget _buildBuyButtonCard() {
  246. return Container(
  247. width: 360.w,
  248. padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 11.h),
  249. decoration: ShapeDecoration(
  250. color: Colors.white,
  251. shape: RoundedRectangleBorder(
  252. borderRadius: BorderRadius.only(
  253. topLeft: Radius.circular(24.r),
  254. topRight: Radius.circular(24.r),
  255. ),
  256. ),
  257. shadows: [
  258. BoxShadow(
  259. color: Color(0x99FFE498),
  260. blurRadius: 20,
  261. offset: Offset(0, 0),
  262. spreadRadius: 0,
  263. ),
  264. ],
  265. ),
  266. child: Column(
  267. children: [
  268. GestureDetector(
  269. onTap: controller.clickPayNow,
  270. child: Container(
  271. width: 328.w,
  272. height: 56.w,
  273. decoration: ShapeDecoration(
  274. shape: RoundedRectangleBorder(
  275. side: BorderSide(width: 2.w, color: const Color(0xFFFFF6C9)),
  276. borderRadius: BorderRadius.circular(30.55),
  277. ),
  278. ),
  279. child: Container(
  280. width: 328,
  281. height: 54,
  282. decoration: ShapeDecoration(
  283. gradient: LinearGradient(
  284. begin: Alignment(0.60, -0.39),
  285. end: Alignment(0.60, 0.95),
  286. colors: [
  287. const Color(0xFFF95FAC),
  288. const Color(0xFFFD4D99),
  289. const Color(0xFFFF3E75),
  290. const Color(0xFFFF0F53),
  291. ],
  292. ),
  293. shape: RoundedRectangleBorder(
  294. borderRadius: BorderRadius.circular(30.55),
  295. ),
  296. ),
  297. child: Center(
  298. child: Text(
  299. StringName.newDiscountUnlockNow,
  300. style: Styles.getTextStyleWhiteW500(17.sp),
  301. ),
  302. ),
  303. ),
  304. ),
  305. ),
  306. SizedBox(height: 11.h),
  307. _buildPrivacyTextSpan(),
  308. ],
  309. ),
  310. );
  311. }
  312. Widget _buildGoodsCard() {
  313. return Container(
  314. margin: EdgeInsets.symmetric(horizontal: 16.w),
  315. child: Column(
  316. crossAxisAlignment: CrossAxisAlignment.start,
  317. mainAxisAlignment: MainAxisAlignment.start,
  318. children: [
  319. Obx(() {
  320. final goodsList = controller.filteredGoodsList;
  321. if (goodsList.isEmpty) {
  322. return CircularProgressIndicator();
  323. }
  324. return Column(
  325. children: List.generate(goodsList.length, (index) {
  326. final item = goodsList[index];
  327. final isSelected =
  328. controller.selectedGoodsInfoItem?.id == item.id;
  329. return Column(
  330. children: [
  331. GestureDetector(
  332. onTap: () => controller.onGoodsItemClick(item),
  333. child: _buildGoodsItem(item, isSelected),
  334. ),
  335. if (index != goodsList.length - 1) SizedBox(height: 10.w),
  336. ],
  337. );
  338. }),
  339. );
  340. }),
  341. ],
  342. ),
  343. );
  344. }
  345. Widget _buildPayWayCard() {
  346. return GestureDetector(
  347. onTap: () => controller.clickPayWaySwitch(),
  348. child: Container(
  349. margin: EdgeInsets.symmetric(horizontal: 16.w),
  350. height: 36.h,
  351. padding: EdgeInsets.symmetric(horizontal: 10.w),
  352. decoration: ShapeDecoration(
  353. shape: RoundedRectangleBorder(
  354. side: BorderSide(width: 1, color: const Color(0xFFECEBE0)),
  355. borderRadius: BorderRadius.circular(10.r),
  356. ),
  357. ),
  358. child: Row(
  359. children: [
  360. Text(
  361. StringName.storePayWay,
  362. style: Styles.getTextStyleBlack204W400(14.sp),
  363. ),
  364. const Spacer(),
  365. Obx(() {
  366. if (controller.selectedPayWay == null) {
  367. return SizedBox.shrink();
  368. }
  369. return Row(
  370. children: [
  371. Image.asset(
  372. getPaymentIconPath(
  373. payMethod: controller.selectedPayWay!.payMethod,
  374. payPlatform: controller.selectedPayWay!.payPlatform,
  375. ),
  376. width: 20.w,
  377. height: 20.w,
  378. ),
  379. SizedBox(width: 4.w),
  380. Text(
  381. controller.selectedPayWay?.title ?? '',
  382. style: Styles.getTextStyleBlack204W400(14.sp),
  383. ),
  384. SizedBox(width: 6.w),
  385. Assets.images.iconStoreSwitchPay.image(
  386. width: 20.w,
  387. height: 20.w,
  388. fit: BoxFit.fill,
  389. ),
  390. ],
  391. );
  392. }),
  393. ],
  394. ),
  395. ),
  396. );
  397. }
  398. Widget _buildGoodsItem(GoodsInfo item, bool isSelected) {
  399. return Container(
  400. height: 70.w,
  401. width: 328.w,
  402. padding: EdgeInsets.symmetric(horizontal: 16.w),
  403. decoration:
  404. isSelected
  405. ? BoxDecoration(
  406. borderRadius: BorderRadius.circular(16.w),
  407. image: DecorationImage(
  408. image: Assets.images.bgNewDiscountItemSelect.provider(),
  409. fit: BoxFit.fill,
  410. ),
  411. )
  412. : BoxDecoration(
  413. borderRadius: BorderRadius.circular(16.w),
  414. image: DecorationImage(
  415. image: Assets.images.bgNewDiscountItemUnselect.provider(),
  416. fit: BoxFit.fill,
  417. ),
  418. ),
  419. child: Row(
  420. children: [
  421. Text(
  422. "¥",
  423. style: TextStyle(
  424. color:
  425. isSelected
  426. ? const Color(0xFFFF684E)
  427. : Colors.black.withAlpha(204),
  428. fontSize: 16.sp,
  429. fontWeight: FontWeight.w700,
  430. ),
  431. ),
  432. Text(
  433. (item.code == "vip_permanent")
  434. ? '${item.priceDescNumber}'
  435. : '${item.amountText}',
  436. textAlign: TextAlign.center,
  437. style: TextStyle(
  438. color:
  439. isSelected
  440. ? const Color(0xFFFF684E)
  441. : Colors.black.withAlpha(204),
  442. fontSize: 29.sp,
  443. fontWeight: FontWeight.w700,
  444. ),
  445. ),
  446. if (item.code == "vip_permanent")
  447. Text(
  448. item.priceDescUnit,
  449. style: TextStyle(
  450. color: Colors.black.withAlpha(153),
  451. fontSize: 12.sp,
  452. fontWeight: FontWeight.w400,
  453. ),
  454. ),
  455. SizedBox(width: 9.w),
  456. Column(
  457. crossAxisAlignment: CrossAxisAlignment.start,
  458. mainAxisAlignment: MainAxisAlignment.center,
  459. children: [
  460. Row(
  461. children: [
  462. Text(
  463. item.name,
  464. style: TextStyle(
  465. color: Colors.black.withAlpha(204),
  466. fontSize: 14.sp,
  467. fontWeight: FontWeight.w500,
  468. ),
  469. ),
  470. SizedBox(width: 4.5.w),
  471. if (item.timeLimitDesc?.isNotEmpty == true)
  472. Container(
  473. padding: EdgeInsets.symmetric(
  474. horizontal: 4.w,
  475. vertical: 2.w,
  476. ),
  477. margin: EdgeInsets.only(bottom: 4.w),
  478. decoration: ShapeDecoration(
  479. gradient: LinearGradient(
  480. begin: Alignment(0.00, 0.50),
  481. end: Alignment(1.00, 0.50),
  482. colors: [
  483. const Color(0xFFFF684E),
  484. const Color(0xFFFF4F9A),
  485. ],
  486. ),
  487. shape: RoundedRectangleBorder(
  488. borderRadius: BorderRadius.only(
  489. topLeft: Radius.circular(10.50),
  490. topRight: Radius.circular(10.50),
  491. bottomRight: Radius.circular(10.50),
  492. ),
  493. ),
  494. ),
  495. child: Text(
  496. item.timeLimitDesc!,
  497. style: TextStyle(
  498. color: Colors.white,
  499. fontSize: 12.sp,
  500. fontWeight: FontWeight.w500,
  501. ),
  502. ),
  503. ),
  504. ],
  505. ),
  506. Text(
  507. (item.code == "vip_permanent")
  508. ? '${item.description}'
  509. : '${item.priceDesc}',
  510. style: TextStyle(
  511. color: Colors.black.withAlpha(153),
  512. fontSize: 12.sp,
  513. fontWeight: FontWeight.w400,
  514. ),
  515. ),
  516. ],
  517. ),
  518. // Spacer(),
  519. // isSelected
  520. // ? Assets.images.iconCustomCharacterAddDialogSelect.image(
  521. // width: 20.w,
  522. // height: 20.w,
  523. // fit: BoxFit.contain,
  524. // )
  525. // : Container(
  526. // width: 20.w,
  527. // height: 20.w,
  528. // decoration: ShapeDecoration(
  529. // color: Colors.white,
  530. // shape: OvalBorder(
  531. // side: BorderSide(
  532. // width: 2.w,
  533. // color: const Color(0xFFE6E6E6),
  534. // ),
  535. // ),
  536. // ),
  537. // ),
  538. ],
  539. ),
  540. );
  541. }
  542. _buildSelectedDesc() {
  543. return Obx(() {
  544. return Container(
  545. margin: EdgeInsets.symmetric(horizontal: 16.w),
  546. child: Row(
  547. children: [
  548. Text(
  549. controller.selectedGoodsInfoItem?.selectDesc ?? "",
  550. style: TextStyle(
  551. color: Colors.black.withAlpha(102),
  552. fontSize: 12.sp,
  553. fontWeight: FontWeight.w400,
  554. ),
  555. ),
  556. ],
  557. ),
  558. );
  559. });
  560. }
  561. Widget _buildMemberCard() {
  562. return Container(
  563. margin: EdgeInsets.symmetric(horizontal: 16.w),
  564. child: Column(
  565. mainAxisAlignment: MainAxisAlignment.start,
  566. crossAxisAlignment: CrossAxisAlignment.start,
  567. children: [
  568. Assets.images.iconNewDiscountMembershipCardTitle.image(
  569. width: 79.w,
  570. height: 24.w,
  571. ),
  572. SizedBox(height: 6.w),
  573. Text(
  574. StringName.newDiscountMemberCardDesc,
  575. style: TextStyle(
  576. color: Colors.black.withValues(alpha: 87),
  577. fontSize: 11.sp,
  578. fontWeight: FontWeight.w400,
  579. ),
  580. ),
  581. SizedBox(height: 8.w),
  582. _buildMemberCardItem(),
  583. SizedBox(height: 28.w),
  584. _buildUserNotice(),
  585. ],
  586. ),
  587. );
  588. }
  589. // 卡片权益
  590. _buildMemberCardItem() {
  591. return SizedBox(
  592. height: 80.w,
  593. child: AutoScrollListView(
  594. scrollDirection: Axis.horizontal,
  595. itemBuilder: (context, index) {
  596. final item = controller.memberCardList[index];
  597. return Container(
  598. margin: EdgeInsets.only(right: 8.w),
  599. width: 140.w,
  600. height: 65.w,
  601. decoration: ShapeDecoration(
  602. gradient: item.gradient,
  603. shape: RoundedRectangleBorder(
  604. side: BorderSide(width: 1.w, color: Colors.black.withAlpha(8)),
  605. borderRadius: BorderRadius.circular(20.r),
  606. ),
  607. ),
  608. child: Row(
  609. mainAxisAlignment: MainAxisAlignment.center,
  610. crossAxisAlignment: CrossAxisAlignment.center,
  611. children: [
  612. item.imageUrl.image(width: 28.w, height: 27.62.w),
  613. SizedBox(width: 8.w),
  614. Column(
  615. crossAxisAlignment: CrossAxisAlignment.start,
  616. mainAxisAlignment: MainAxisAlignment.center,
  617. children: [
  618. Text(
  619. item.title,
  620. style: TextStyle(
  621. color: Colors.black.withAlpha(204),
  622. fontSize: 12.sp,
  623. fontWeight: FontWeight.w700,
  624. ),
  625. ),
  626. SizedBox(height: 6.w),
  627. Text(
  628. item.desc,
  629. style: TextStyle(
  630. color: Colors.black.withAlpha(128),
  631. fontSize: 10.sp,
  632. fontWeight: FontWeight.w400,
  633. ),
  634. ),
  635. ],
  636. ),
  637. ],
  638. ),
  639. );
  640. },
  641. itemCount: controller.memberCardList.length,
  642. ),
  643. );
  644. }
  645. Widget _buildPrivacyTextSpan() {
  646. return Row(
  647. mainAxisAlignment: MainAxisAlignment.center,
  648. children: [
  649. Obx(() {
  650. return GestureDetector(
  651. behavior: HitTestBehavior.opaque,
  652. onTap: () {
  653. controller.isAgree.value = !controller.isAgree.value;
  654. },
  655. child:
  656. controller.isAgree.value
  657. ? Assets.images.iconStoreAgreePrivacy.image(
  658. width: 16.w,
  659. height: 16.w,
  660. )
  661. : SizedBox(
  662. child: Container(
  663. padding: EdgeInsets.all(1.w),
  664. width: 16.w,
  665. height: 16.w,
  666. child: Container(
  667. decoration: BoxDecoration(
  668. shape: BoxShape.circle,
  669. border: Border.all(
  670. color: Colors.black.withAlpha(153),
  671. width: 1.w,
  672. ),
  673. ),
  674. ),
  675. ),
  676. ),
  677. );
  678. }),
  679. Text.rich(
  680. TextSpan(
  681. children: [
  682. TextSpan(
  683. text: StringName.textSpanIHaveReadAndAgree,
  684. style: TextStyle(
  685. color: Colors.black.withAlpha(153),
  686. fontSize: 10.sp,
  687. fontWeight: FontWeight.w400,
  688. ),
  689. ),
  690. ClickTextSpan(
  691. text: StringName.textSpanPrivacyPolicy,
  692. url: WebUrl.privacyPolicy,
  693. ),
  694. ClickTextSpan(
  695. text: StringName.textSpanServiceTerms,
  696. url: WebUrl.serviceAgreement,
  697. ),
  698. TextSpan(
  699. text: StringName.textSpanAnd,
  700. style: TextStyle(
  701. color: Colors.black.withAlpha(153),
  702. fontSize: 10.sp,
  703. fontWeight: FontWeight.w400,
  704. ),
  705. ),
  706. ClickTextSpan(
  707. text: StringName.textSpanMembershipAgreement,
  708. url: WebUrl.memberServiceAgreement,
  709. ),
  710. ],
  711. ),
  712. ),
  713. ],
  714. );
  715. }
  716. // 用户须知
  717. Widget _buildUserNotice() {
  718. return Container(
  719. decoration: BoxDecoration(borderRadius: BorderRadius.circular(16.r)),
  720. child: Column(
  721. crossAxisAlignment: CrossAxisAlignment.start,
  722. children: [
  723. Text('购买须知', style: Styles.getTextStyleBlack204W400(12.sp)),
  724. SizedBox(height: 8.h),
  725. Text(
  726. "1.会员权益将在购买成功后自动生效,如遇延迟,请耐心等待5-10分钟。若长时间未生效,请联系客服处理;\n"
  727. "2.本服务为虚拟商品,一经购买成功即视为使用,恕不支持退款或转让,感谢您的理解;\n"
  728. "3.您的支持是我们持续优化与服务的动力,我们将竭诚为您提供更好的体验;\n"
  729. "4.相关细则以《会员服务协议》为准,在法律允许范围内,我们保留最终解释权。开通即视为同意协议条款,请谨慎购买。\n"
  730. "如有疑问,欢迎随时咨询在线客服!",
  731. style: Styles.getTextStyleBlack153W400(10.sp),
  732. ),
  733. ],
  734. ),
  735. );
  736. }
  737. }