import 'dart:io'; import 'package:dio/dio.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:fluwx/fluwx.dart'; import 'package:huixiang/utils/font_weight.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../../generated/l10n.dart'; import '../../retrofit/data/base_data.dart'; import '../../retrofit/data/vip_card_home.dart'; import '../../retrofit/data/wx_pay.dart'; import '../../retrofit/retrofit_api.dart'; import '../../utils/flutter_utils.dart'; import '../../utils/min.dart'; import 'package:tobias/tobias.dart' as tobias; class VipTop extends StatefulWidget { final VipCardHome vipCardHome; // final Function queryVipHome; VipTop(this.vipCardHome); @override State createState() { return _VipTop(); } } class _VipTop extends State { int selectIndex = 0; ApiService apiService; var payType = 1; dynamic payListen; @override void initState() { super.initState(); payListen = weChatResponseEventHandler.listen((event) async { print("payCallback: ${event.errCode}"); if (event.errCode == 0) { // widget.queryVipHome(); SmartDialog.showToast("支付成功", alignment: Alignment.center); } else { SmartDialog.showToast("支付失败", alignment: Alignment.center); return; } }); } @override void dispose() { super.dispose(); if (payListen != null) payListen.cancel(); } rechargeVIP() async { if (apiService == null) { SharedPreferences value = await SharedPreferences.getInstance(); apiService = ApiService(Dio(), context: context, token: value.getString("token"), showLoading: true); } BaseData baseData = await apiService.orderVip({ "cardId": widget?.vipCardHome?.cards[selectIndex]?.id, "type": payType }).catchError((error) {}); if (baseData != null && baseData.isSuccess) { if (payType == 1) { if (Platform.isAndroid) { if (!(await Min.isInitialize())) { // 小程序的微信支付和app的充值支付使用同一个WXPayEntryActivity回调, // 然而充值时小程序未初始化会导致回调内部代码调用getPackage空指针, // 故而在此初始化一下 await Min.initialize(); } } WxPay wxPay = WxPay.fromJson(baseData.data); await registerWxApi( appId: wxPay.appId, doOnAndroid: true, universalLink: "https://hx.lotus-wallet.com/app/", ); payWithWeChat( appId: wxPay.appId, partnerId: wxPay.partnerId, prepayId: wxPay.prepayId, packageValue: wxPay.packageValue, nonceStr: wxPay.nonceStr, timeStamp: int.tryParse(wxPay.timeStamp), sign: wxPay.sign, ); } else { tobias.isAliPayInstalled().then((value) => { // 判断是否安装了支付宝 if (!value) {SmartDialog.showToast("请安装支付宝", alignment: Alignment.center)} else { tobias.aliPay(baseData.data["body"]).then((payRes) { if (payRes['resultStatus'] == 9000 || payRes['resultStatus'] == '9000') { // widget.queryVipHome(); SmartDialog.showToast("支付成功", alignment: Alignment.center); } else { SmartDialog.showToast(payRes['memo'], alignment: Alignment.center); } }) } }); } } else { SmartDialog.showToast(baseData.msg, alignment: Alignment.center); } } @override Widget build(BuildContext context) { return Stack( children: [ Container( height: 246.h, decoration: BoxDecoration( color: Color(0xff32A060), borderRadius: BorderRadius.vertical( bottom: Radius.circular(8.w), ), ), ), Container( child: Column( children: [ vipCard(), // if(widget?.vipCardHome?.cards?.length != 0) // SizedBox( // height: 15.h, // ), // (!(widget?.vipCardHome?.member?.isVip ?? false)) // ? (widget?.vipCardHome?.cards?.length == 0 ? Container():vipCardList()) // : Padding( // padding: EdgeInsets.symmetric(horizontal: 16.w), // child: Row( // children: [ // Expanded( // child: Container( // alignment: Alignment.center, // padding: EdgeInsets.symmetric( // horizontal: 10.w, vertical: 15.h), // decoration: BoxDecoration( // borderRadius: BorderRadius.circular(4.w), // color: Color(0xffffffff), // boxShadow: [ // BoxShadow( // color: Colors.black.withAlpha(12), // offset: Offset(0, 3), // blurRadius: 14, // spreadRadius: 0, // ) // ], // ), // child: Text.rich( // TextSpan( // children: [ // TextSpan( // text: S // .of(context) // .yixianghuiyuanquanyi, // style: TextStyle( // fontWeight: MyFontWeight.semi_bold, // fontSize: 15.sp, // color: Color(0xff32A060), // ), // ), // TextSpan( // text: widget?.vipCardHome?.member // ?.vipDuration // .toString() ?? // "0", // style: TextStyle( // fontWeight: MyFontWeight.semi_bold, // fontSize: 18.sp, // color: Color(0xffF96519), // ), // ), // TextSpan( // text: " 天", // style: TextStyle( // fontWeight: MyFontWeight.semi_bold, // fontSize: 15.sp, // color: Color(0xff32A060), // ), // ), // ], // ), // textDirection: TextDirection.ltr, // ))), // SizedBox( // width: 10.w, // ), // Expanded( // child: GestureDetector( // onTap: () { // setState(() { // vipRenewShowBottomSheet(); // }); // }, // child: Container( // alignment: Alignment.center, // padding: EdgeInsets.symmetric( // horizontal: 10.w, vertical: 15.h), // decoration: BoxDecoration( // borderRadius: BorderRadius.circular(4.w), // color: Color(0xffffffff), // boxShadow: [ // BoxShadow( // color: Colors.black.withAlpha(12), // offset: Offset(0, 3), // blurRadius: 14, // spreadRadius: 0, // ) // ], // ), // child: Row( // mainAxisAlignment: // MainAxisAlignment.center, // crossAxisAlignment: // CrossAxisAlignment.center, // children: [ // Text( // "${(widget?.vipCardHome?.member?.isVipSubscribe ?? false) ? "已开通自动续费" : "续费回乡VIP"}", // style: TextStyle( // color: Color((widget // ?.vipCardHome // ?.member // ?.isVipSubscribe ?? // false) // ? 0xff3A3936 // : 0xff32A060), // fontSize: 15.sp, // fontWeight: MyFontWeight.semi_bold, // ), // ), // SizedBox( // width: 6.w, // ), // Image.asset( // "${(widget?.vipCardHome?.member?.isVipSubscribe ?? false) ? "assets/image/vip_xf.webp" : "assets/image/icon_right.webp"}", // width: 16, // height: 16, // fit: BoxFit.fill, // color: Color(0xff32A060), // ), // ], // ))), // ) // ], // ), // ), rechargeGuide(), ], ), ) ], ); } ///充值引导 Widget rechargeGuide() { return Container( margin: EdgeInsets.only(left: 14.w, right: 14.w, bottom:21.h,top:16.h), width: double.infinity, padding: EdgeInsets.only(top:14.h, left:12.h, bottom:8.h, right:14.w), decoration: BoxDecoration( borderRadius: BorderRadius.circular(6.w), color: Colors.white, boxShadow: [ BoxShadow( color: Colors.black.withAlpha(12), offset: Offset(0, 3), blurRadius: 14, spreadRadius: 0, ) ], ), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded(child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text.rich( TextSpan( children: [ TextSpan( text: "充值", style: TextStyle( fontWeight: MyFontWeight.extra_bold, fontSize: 18.sp, fontFamily: 'JDZhengHT', color: Color(0xFF262626), ), ), TextSpan( text: "¥200以上", style: TextStyle( fontSize: 18.sp, color: Color(0xffFF7E12), fontWeight: MyFontWeight.semi_bold, ), ), TextSpan( text: "即开通回乡VIP卡", style: TextStyle( fontSize: 18.sp, color: Color(0xFF262626), fontWeight: MyFontWeight.semi_bold, ), ), ], ), textDirection: TextDirection.ltr, ), Padding( padding: EdgeInsets.only(top: 6.h, bottom: 10.h), child: Text( "享受多门店商品9.2折优惠价!", style: TextStyle( color: Color(0xFF32A060), fontSize: 15.sp, fontWeight: MyFontWeight.semi_bold, ), )), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( "*活动一切解释权归海峡姐妹品牌公司所有", style: TextStyle( color: Color(0xFF151515), fontSize: 8.sp, fontWeight: MyFontWeight.semi_bold, ), ), GestureDetector( behavior: HitTestBehavior.opaque, onTap: (){ Navigator.of(context).pushNamed('/router/recharge_page'); }, child: Container( decoration: BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(100)), border: Border.all( width: 1.w, color: Color(0xFF32A060), style: BorderStyle.solid, ), color: Color(0xFFFFFFFF), ), padding: EdgeInsets.symmetric(vertical: 4.h,horizontal: 12.w), child: Row(children: [ Text( "去储值", style: TextStyle( color: Color(0xFF32A060), fontSize: 14.sp, fontWeight: MyFontWeight.regular, ), ), Image.asset( "assets/image/icon_right.webp", width:13, fit: BoxFit.fill, height:13, color: Color(0xFF32A060), ) ]), ), ) ], ) ], )), SizedBox(width: 11.h,), Padding(padding:EdgeInsets.only(top:4.h), child: Image.asset( "assets/image/vip_cz.webp", fit: BoxFit.fill, //填充剩余空间 height:50.w, width: 54.h, ),) ], ), ); } ///vip卡 Widget vipCard() { return Container( margin: EdgeInsets.fromLTRB( 14.w, (MediaQuery.of(context).padding.top + 50.h), 14.w, 8.h), width: double.infinity, height: 207.h, decoration: BoxDecoration( borderRadius: BorderRadius.circular(8.w), color: Colors.white, boxShadow: [ BoxShadow( color: Colors.black.withAlpha(12), offset: Offset(0, 3), blurRadius: 14, spreadRadius: 0, ) ], ), child: Stack( // alignment: Alignment.center, children: [ Image.asset( "assets/image/vip_card.webp", fit: BoxFit.fill, //填充剩余空间 height: double.infinity, width: double.infinity, ), Container( padding: EdgeInsets.only(top: 24.h, right: 16.w), alignment: Alignment.topRight, child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( widget?.vipCardHome?.member?.nickname ?? "", style: TextStyle( color: Color(0xff32A060), fontSize: 15.sp, fontWeight: MyFontWeight.medium, ), ), SizedBox( height: 15.h, ), if (widget?.vipCardHome?.member?.isVip ?? false) Text( "有效期至 ${(widget?.vipCardHome?.member?.vipExpire ?? "").substring(0, (widget?.vipCardHome?.member?.vipExpire ?? "").indexOf(" "))}", style: TextStyle( color: Color(0xff32A060), fontSize: 13.sp, fontWeight: MyFontWeight.regular, ), ), ], ), ), ], ), ); } ///VIP购买套餐 Widget vipCardList() { return Container( height: 136.h, margin: EdgeInsets.symmetric(horizontal: 14.w), child: ListView.builder( scrollDirection: Axis.horizontal, physics: BouncingScrollPhysics(), itemCount: widget?.vipCardHome?.cards?.length ?? 0, itemBuilder: (context, position) { return GestureDetector( onTap: () { setState(() { selectIndex = position; if (widget?.vipCardHome?.member?.isVip ?? false) { vipShowBottomSheet(); } else { vipTreatyShowBottomSheet(); } }); }, child: vipCardItem(widget?.vipCardHome?.cards[position], position), ); }, ), ); } Widget vipCardItem(Cards cards, index) { return Stack( alignment: Alignment.topRight, children: [ Container( height: double.infinity, width: 166.w, alignment: Alignment.center, padding: EdgeInsets.symmetric(horizontal: 10.w, vertical: 25.h), margin: EdgeInsets.only(right: 15.w), decoration: BoxDecoration( borderRadius: BorderRadius.circular(6.w), color: Color(selectIndex == index ? 0xffF0FAF4 : 0xffffffff), border: Border.all( color: Color(selectIndex == index ? 0xff32A060 : 0xFFEAEAEA), width: 2, ), boxShadow: [ BoxShadow( color: Colors.black.withAlpha(12), offset: Offset(0, 3), blurRadius: 14, spreadRadius: 0, ) ], ), child: Column( children: [ Row( children: [ Expanded( child: Text( "${cards?.duration.toString() ?? ""}天", textAlign: TextAlign.center, style: TextStyle( color: Colors.black, fontSize: 15.sp, fontFamily: 'JDZhengHT', fontWeight: MyFontWeight.medium, ), ), ), Expanded( child: Text( cards?.name ?? "", textAlign: TextAlign.center, maxLines: 1, overflow: TextOverflow.ellipsis, style: TextStyle( color: Colors.black, fontSize: 15.sp, fontWeight: MyFontWeight.medium, ), ), ), ], ), SizedBox( height: 10.h, ), Text.rich( TextSpan(children: [ TextSpan( text: "¥", style: TextStyle( fontSize: 20.sp, color: Color(0xff32A060), fontFamily: 'JDZhengHT', fontWeight: MyFontWeight.medium, ), ), TextSpan( text: "${AppUtils.calculateDouble(double.tryParse(cards?.price ?? ""))}", style: TextStyle( fontSize: 36.sp, color: Color(0xff32A060), fontFamily: 'JDZhengHT', fontWeight: MyFontWeight.medium, ), ), ]), ), ], ), ), if (cards.autoSubscribe) Container( padding: EdgeInsets.symmetric(vertical: 4.h, horizontal: 6.w), margin: EdgeInsets.only(right: 15.w), decoration: BoxDecoration( borderRadius: BorderRadius.only( topRight: Radius.circular(6.r), bottomLeft: Radius.circular(6.r), ), color: Color(0xff32A060), ), child: Text( S.of(context).gengyouhui, style: TextStyle( color: Colors.white, fontSize: 12.sp, fontWeight: MyFontWeight.regular, ), ), ) ], ); } ///会员卡续费弹窗 vipRenewShowBottomSheet() { showModalBottomSheet( builder: (BuildContext context) { return StatefulBuilder(builder: ( context, state, ) { return renewBuildBottomSheetWidget(context, state); }); }, backgroundColor: Colors.transparent, context: context); } Widget renewBuildBottomSheetWidget(BuildContext context, state) { return Container( padding: EdgeInsets.only( top: 10.h, ), decoration: new BoxDecoration( color: Colors.white, borderRadius: new BorderRadius.only( topLeft: const Radius.circular(8.0), topRight: const Radius.circular(8.0))), child: Container( height: 275.h, child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center, children: [ Padding( padding: EdgeInsets.only(right: 14.w), child: Row( children: [ Expanded( child: Text( S.of(context).xuefeihuiyuan, textAlign: TextAlign.center, style: TextStyle( fontWeight: MyFontWeight.medium, fontSize: 15.sp, color: Color(0xff0D0D0D), ), )), GestureDetector( onTap: () { Navigator.of(context).pop(); }, child: Icon( Icons.clear, color: Colors.black, ), ), ], )), SizedBox( height: 11.h, ), Container( height: 136.h, margin: EdgeInsets.symmetric(horizontal: 14.w), child: ListView.builder( scrollDirection: Axis.horizontal, physics: BouncingScrollPhysics(), itemCount: widget?.vipCardHome?.cards?.length ?? 0, itemBuilder: (context, position) { return GestureDetector( onTap: () { state(() { selectIndex = position; }); }, child: vipCardItem( widget?.vipCardHome?.cards[position], position), ); }, ), ), Container( width: double.infinity, height: 40.h, margin: EdgeInsets.only( top: 14.h, left: 14.w, right: 14.w, bottom: 5.h), decoration: new BoxDecoration( color: Color(0xff383A38), borderRadius: BorderRadius.circular(24)), child: GestureDetector( onTap: () { Navigator.of(context).pop(); vipShowBottomSheet(); }, child: Container( height: double.infinity, alignment: Alignment.center, padding: EdgeInsets.symmetric(horizontal: 16.w), decoration: new BoxDecoration( color: Color(0xff32A060), borderRadius: BorderRadius.circular(24)), child: Text( S.of(context).likexufei, style: TextStyle( fontSize: 16.sp, height: 1.3.h, fontWeight: MyFontWeight.regular, color: Color(0xFFFFFFFF), ), ), ), ), ), GestureDetector( onTap: () { Navigator.of(context) .pushNamed('/router/user_vip_service_page'); }, child: Padding( padding: EdgeInsets.only(left: 14.w, bottom: 15.h), child: Text.rich( TextSpan( children: [ TextSpan( text: "开通即默认同意", style: TextStyle( fontWeight: MyFontWeight.regular, fontSize: 12.sp, color: Color(0xff4D4D4D), ), ), TextSpan( text: "《回乡VIP会员卡规则协议》", style: TextStyle( fontWeight: MyFontWeight.regular, fontSize: 12.sp, color: Color(0xff32A060), ), ), ], ), textDirection: TextDirection.ltr, ), ), ), ], ), )); } ///会员卡包月协议弹窗 vipTreatyShowBottomSheet() { showModalBottomSheet( builder: (BuildContext context) { return treatyBuildBottomSheetWidget(context); }, backgroundColor: Colors.transparent, context: context); } Widget treatyBuildBottomSheetWidget(BuildContext context) { return Container( padding: EdgeInsets.symmetric(vertical: 20.h, horizontal: 14.w), height: 127.h, decoration: new BoxDecoration( color: Colors.white, borderRadius: new BorderRadius.only( topLeft: const Radius.circular(6.0), topRight: const Radius.circular(6.0))), child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ GestureDetector( onTap: () { Navigator.of(context) .pushNamed('/router/user_vip_service_page'); }, child: Padding( padding: EdgeInsets.only(left: 4.w), child: Text.rich( TextSpan( children: [ TextSpan( text: "开通即默认同意", style: TextStyle( fontWeight: MyFontWeight.regular, fontSize: 12.sp, color: Color(0xff4D4D4D), ), ), TextSpan( text: "《回乡VIP会员卡规则协议》", style: TextStyle( fontWeight: MyFontWeight.regular, fontSize: 12.sp, color: Color(0xff32A060), ), ), ], ), textDirection: TextDirection.ltr, ), ), ), GestureDetector( onTap: () { Navigator.of(context).pop(); vipShowBottomSheet(); }, child: Container( height: 40.h, alignment: Alignment.center, margin: EdgeInsets.only(top: 26.h), padding: EdgeInsets.symmetric(horizontal: 16.w), decoration: new BoxDecoration( color: Color(0xff32A060), borderRadius: BorderRadius.circular(24)), child: Text( S.of(context).likekaitong, style: TextStyle( fontSize: 16.sp, height: 1.3.h, fontWeight: MyFontWeight.regular, color: Color(0xFFFFFFFF), ), ), ), ) ], )); } ///会员卡包月购买弹窗 vipShowBottomSheet() { showModalBottomSheet( builder: (BuildContext context) { return StatefulBuilder(builder: ( context, state, ) { return buildBottomSheetWidget(context, state); }); }, backgroundColor: Colors.transparent, context: context); } Widget buildBottomSheetWidget(BuildContext context, state) { return Container( padding: EdgeInsets.only(top: 16.h, left: 16.w, right: 16.w, bottom: 35.h), decoration: new BoxDecoration( color: Colors.white, borderRadius: new BorderRadius.only( topLeft: const Radius.circular(8.0), topRight: const Radius.circular(8.0))), child: Container( height: 230.h, child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center, children: [ Row( children: [ Expanded( child: Text( S.of(context).zhifufangshi, textAlign: TextAlign.center, style: TextStyle( fontWeight: MyFontWeight.regular, fontSize: 15.sp, color: Color(0xff0D0D0D), ), )), GestureDetector( onTap: () { Navigator.of(context).pop(); }, child: Icon( Icons.clear, color: Colors.black, ), ), ], ), if (!(widget?.vipCardHome?.cards[selectIndex]?.autoSubscribe ?? false)) GestureDetector( onTap: () { state(() { payType = 1; }); }, child: Container( padding: EdgeInsets.only( left: 14.w, right: 32.w, top: 11.h, bottom: 11.h), margin: EdgeInsets.only(top: 17.h), decoration: BoxDecoration( borderRadius: BorderRadius.circular(4.w), color: Color(payType == 1 ? 0xFFF0FAF4 : 0xffF9F9F9), border: Border.all( color: Color(payType == 1 ? 0xFF32A060 : 0xFFFAFAFA), width: payType == 1 ? 2 : 0, ), boxShadow: [ BoxShadow( color: Color(0xffF9F9F9).withAlpha(12), offset: Offset(0, 3), blurRadius: 14, spreadRadius: 0, ) ], ), child: Row( children: [ Image.asset( "assets/image/icon_we_chat.webp", width: 20, fit: BoxFit.fill, height: 20, ), SizedBox( width: 8.w, ), Text( S.of(context).weixinzhifu, style: TextStyle( fontWeight: MyFontWeight.regular, fontSize: 15.sp, color: Color(0xff0D0D0D), ), ), SizedBox( width: 20.w, ), ], ), ), ), GestureDetector( onTap: () { state(() { payType = 2; }); }, child: Container( padding: EdgeInsets.only( left: 14.w, right: 32.w, top: 11.h, bottom: 11.h), margin: EdgeInsets.only(top: 17.h), decoration: BoxDecoration( borderRadius: BorderRadius.circular(4.w), color: Color(payType == 2 ? 0xFFF0FAF4 : 0xffF9F9F9), border: Border.all( color: Color(payType == 2 ? 0xFF32A060 : 0xFFFAFAFA), width: payType == 2 ? 2 : 0, ), boxShadow: [ BoxShadow( color: Color(0xffF9F9F9).withAlpha(12), offset: Offset(0, 3), blurRadius: 14, spreadRadius: 0, ) ], ), child: Row( children: [ Image.asset( "assets/image/icon_alipay.webp", width: 20, fit: BoxFit.fill, height: 20, ), SizedBox( width: 8.w, ), Text( S.of(context).zhifubaozhifu, style: TextStyle( fontWeight: MyFontWeight.regular, fontSize: 15.sp, color: Color(0xff0D0D0D), ), ), SizedBox( width: 20.w, ), ], ), ), ), Spacer(), Container( width: double.infinity, height: 40.h, decoration: new BoxDecoration( color: Color(0xff383A38), borderRadius: BorderRadius.circular(24)), child: Row( children: [ SizedBox( width: 16.w, ), Expanded( child: Text.rich( TextSpan( children: [ TextSpan( text: "¥", style: TextStyle( fontWeight: MyFontWeight.regular, fontSize: 12.sp, fontFamily: 'JDZhengHT', color: Colors.white, ), ), TextSpan( text: AppUtils.calculateDouble(double.tryParse( widget?.vipCardHome?.cards[selectIndex] ?.price ?? "")), style: TextStyle( fontWeight: MyFontWeight.regular, fontSize: 20.sp, fontFamily: 'JDZhengHT', color: Colors.white, ), ), ], ), textDirection: TextDirection.ltr, )), GestureDetector( onTap: () { Navigator.of(context).pop(); rechargeVIP(); }, child: Container( height: double.infinity, alignment: Alignment.center, padding: EdgeInsets.symmetric(horizontal: 16.w), decoration: new BoxDecoration( color: Color(0xff32A060), borderRadius: BorderRadius.circular(24)), child: Text( S.of(context).likezhifu, style: TextStyle( fontSize: 16.sp, height: 1.3.h, fontWeight: MyFontWeight.regular, color: Color(0xFFFFFFFF), ), ), ), ) ], ), ), ], ), )); } }