import 'dart:io'; import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_html/flutter_html.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:fluwx/fluwx.dart'; import 'package:huixiang/generated/l10n.dart'; import 'package:huixiang/retrofit/data/base_data.dart'; import 'package:huixiang/retrofit/data/recharge_list.dart'; import 'package:huixiang/retrofit/data/user_info.dart'; import 'package:huixiang/retrofit/data/vip_benefit_list.dart'; import 'package:huixiang/retrofit/data/vip_rule_details.dart'; import 'package:huixiang/retrofit/data/wx_pay.dart'; import 'package:huixiang/retrofit/retrofit_api.dart'; import 'package:huixiang/utils/flutter_utils.dart'; import 'package:huixiang/utils/font_weight.dart'; import 'package:huixiang/utils/min.dart'; import 'package:huixiang/view_widget/item_input_widget.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:huixiang/view_widget/my_appbar.dart'; import 'package:huixiang/view_widget/round_button.dart'; import 'package:shared_preferences/shared_preferences.dart'; class RechargePage extends StatefulWidget { @override State createState() { return _RechargePage(); } } class _RechargePage extends State { ApiService apiService; TextEditingController controller = TextEditingController(); VipRuleDetails vipRuleDetails; List vipBenefitList = []; Color color = Colors.black; double discount = 100; List rechargeA; int selectIndex = 0; UserInfo userInfo; dynamic mBalance; @override void initState() { super.initState(); SharedPreferences.getInstance().then((value) { apiService = ApiService(Dio(), context: context, token: value.getString("token"), pay: true); queryBenefitList(); queryRuleDetails(); queryRechargeList(); queryUserBalance(); }); weChatResponseEventHandler.listen((event) async { print("payCallback: ${event.errCode}"); if (event.errCode == 0) { queryUserBalance(); SmartDialog.showToast("充值成功", alignment: Alignment.center); } // else{ // SmartDialog.showToast("充值失败", alignment: Alignment.center); // return; // } }); } ///会员权益列表 queryBenefitList() async { BaseData> baseData = await apiService.benefitList().catchError((onError) {}); if (baseData != null && baseData.isSuccess) { setState(() { vipBenefitList.clear(); vipBenefitList.addAll(baseData.data); vipBenefitList.forEach((element) { if (element.have && element.config != null && element.code == "RECHARGE") { discount = double.parse(element.config); } }); }); } EasyLoading.dismiss(); } queryUserBalance() async { BaseData baseData = await apiService.queryInfo().catchError((onError) {}); if (baseData != null && baseData.isSuccess) { userInfo = baseData.data; mBalance = double.tryParse(userInfo?.money ?? "0"); if (mounted) setState(() {}); } } ///会员权益介绍/规则/说明/储值说明 queryRuleDetails() async { BaseData baseData = await apiService.vipBenefit().catchError((onError) {}); if (baseData != null && baseData.isSuccess) { setState(() { vipRuleDetails = baseData.data; }); } EasyLoading.dismiss(); } ///充值列表 queryRechargeList() async { if (apiService == null) { SharedPreferences value = await SharedPreferences.getInstance(); apiService = ApiService( Dio(), context: context, token: value.getString("token"), ); } BaseData> baseData = await apiService.rechargeAct().catchError((onError) {}); if (baseData != null && baseData.isSuccess) { setState(() { rechargeA = baseData.data; }); } EasyLoading.dismiss(); } @override Widget build(BuildContext context) { return Scaffold( appBar: MyAppBar( title: S.of(context).chongzhi, titleColor: Colors.black, titleSize: 18.sp, background: Color(0xFFFFFFFF), leadingColor: Colors.black, ), body: Container( color: Color(0xFFFFFFFF), child: Stack( children: [ Column(children: [ SingleChildScrollView( physics: BouncingScrollPhysics(), child: Container( margin: EdgeInsets.only(left: 16, right: 16), child: Column( children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ // ItemInputWidget( // S.of(context).qingshuruchongzhijine, // hintText: "", // controller: controller, // padding: EdgeInsets.all(20), // errorText: S.of(context).chongzhizuixiaojine(100), // titleColor: Color(0xFF727272), // errorTextColor: Color(0xFF32A060), // radius: 8, // discount: discount / 10, // style: TextStyle( // fontWeight: FontWeight.bold, // fontSize: 27.sp, // color: color, // ), // inputLimit: 6, // textInputType: TextInputType.number, // textInputFormatter: // FilteringTextInputFormatter.digitsOnly, // onChanged: (value) { // if (value != null && // value != "" && // double.tryParse(value) < 100) { // color = Colors.red; // } else { // color = Colors.black; // } // setState(() {}); // }, // ), SizedBox(height:20,), Row( children: [ Expanded( child: Text( S.of(context).zhanghuyue, style: TextStyle( fontSize: 15.sp, color: Color(0xFF181818), fontWeight: MyFontWeight.semi_bold), )), Text.rich( TextSpan(children: [ TextSpan( text: "$mBalance", style: TextStyle( fontSize: 26.sp, color: Color(0xFF181818), fontWeight: MyFontWeight.semi_bold), ), TextSpan( text: "元", style: TextStyle( fontSize: 15.sp, color: Color(0xFF181818), fontWeight: MyFontWeight.semi_bold), ), ]), ), ], ), SizedBox(height: 28), rechargeList(), SizedBox(height:22), Row( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ if (vipRuleDetails?.recharge != null && vipRuleDetails.recharge != "") Expanded( child: Container( color: Colors.white, child: Html( data: "注意:${vipRuleDetails?.recharge ?? ""}", customImageRenders: { networkSourceMatcher(): networkImageRender( loadingWidget: () { return Container(); }, ), }, ), ), ) ], ), ], ), Container( width: double.infinity, margin: EdgeInsets.only( top: 16.h, bottom: 4.h, ), padding: EdgeInsets.only( top: 20.h, bottom: 20.h, ), // decoration: BoxDecoration( // color: Colors.white, // borderRadius: BorderRadius.circular(4), // ), child: Column( mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: EdgeInsets.only(bottom: 16.h), child: Text( S.of(context).zhifufangshi, style: TextStyle( fontSize: 16.sp, color: Colors.black, fontWeight: FontWeight.bold, ), ), ), GestureDetector( onTap: () { setState(() { checkIndex = 1; }); }, child: Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ Image.asset("assets/image/icon_we_chat.webp"), Expanded( flex: 1, child: Padding( padding: EdgeInsets.only(left: 8.w), child: Text( S.of(context).weixinzhifu, style: TextStyle( fontSize: 14.sp, color: Color(0xff353535), ), ), ), ), checkView(1), ], ), ), ], ), ), ], ), ), ) ],), Align( alignment: Alignment.bottomCenter, child: GestureDetector( onTap: (){ recharge(); }, child: Container( height: 56.h, width: double.infinity, alignment: Alignment.center, decoration: BoxDecoration( color: Color(0xFF32A060), borderRadius: BorderRadius.circular(27), ), margin: EdgeInsets.only(left: 16,right: 16,bottom: 21), child: Text( S.of(context).querenchongzhi, style: TextStyle( fontSize: 16.sp, fontWeight: MyFontWeight.medium, color: Colors.white, ), ), ), ), // Container( // height: 56.h, // color: Colors.white, // child: Row( // children: [ // Expanded(child:Container( // padding:EdgeInsets.only(top: 7.h,left:16), // child:Column( // crossAxisAlignment: CrossAxisAlignment.start, // children: [ // Row( // children: [ // Text( // S.of(context).heji, // style: TextStyle( // fontSize: 14.sp, // fontWeight: MyFontWeight.regular, // color: Colors.black, // ), // ), // Text( // controller.text, // style: TextStyle( // fontSize: 16.sp, // fontWeight: MyFontWeight.medium, // color: Color(0xFF32A060), // ), // ), // ], // ), // if(controller.text != "") // Text.rich( // TextSpan( // children: [ // TextSpan( // text: "充值", // style: TextStyle( // fontSize:12.sp, // fontWeight: MyFontWeight.regular, // color: Color(0xFFADADAD), // ), // ), // TextSpan( // text:"¥${controller.text}", // style: TextStyle( // fontSize: 12.sp, // fontWeight: MyFontWeight.regular, // color:Color(0xff3541C9), // ), // ), // TextSpan( // text: "赠送", // style: TextStyle( // fontSize:12.sp, // fontWeight: MyFontWeight.regular, // color: Color(0xFFADADAD), // ), // ), // TextSpan( // text:"¥${((double.tryParse(controller.text)??0) - ((double.tryParse(controller.text)??0) * (discount/100))).toStringAsFixed(2)}", // style: TextStyle( // fontSize: 12.sp, // fontWeight: MyFontWeight.regular, // color: Color(0xff3541C9), // ), // ),TextSpan( // text: "元", // style: TextStyle( // fontSize:12.sp, // fontWeight: MyFontWeight.regular, // color: Color(0xFFADADAD), // ), // ), // ], // ), // ), // ], // )) // ), // GestureDetector( // onTap: () { // recharge(); // }, // child: RoundButton( // width: 103.w, // height: 54.h, // text: S.of(context).chongzhi, // textColor: Colors.white, // fontWeight: MyFontWeight.regular, // backgroup: Color(0xFF32A060), // radius: 0, // fontSize: 16.sp, // padding: EdgeInsets.symmetric(vertical: 5.h), // ), // ), // ], // ), // ) ) ], ), ), ); } var checkIndex = 1; Widget rechargeList() { return GridView.builder( itemCount: rechargeA == null ? 0 : rechargeA.length, shrinkWrap: true, physics: BouncingScrollPhysics(), gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( //一行的Widget数量 crossAxisCount: 3, //水平子Widget之间间距 crossAxisSpacing:11, //垂直子Widget之间间距 mainAxisSpacing: 0, childAspectRatio: 1.5, ), itemBuilder: (context, index) { return GestureDetector( onTap: () { setState(() { selectIndex = index; }); }, child: rechargeItem(rechargeA[index],index), ); }, ); } Widget rechargeItem(RechargeList rechargeA,index) { return Container( child: Stack( alignment: Alignment.bottomRight, children: [ Container( alignment: Alignment.center, height: 69.h, decoration: BoxDecoration( color: selectIndex == index ?Color(0x2432A060) : Color(0xFFFAFAFA), borderRadius: BorderRadius.circular(4), ), // margin: EdgeInsets.only(right: 11,bottom: 16), child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( "${AppUtils.calculateDouble(double.tryParse(rechargeA.rechargeMoney)??0)}元", textAlign: TextAlign.center, style: TextStyle( color: Color(0xFF868686), fontWeight: MyFontWeight.medium, fontSize:18.sp, ), ), SizedBox(height:2,), Text( "实际到账:${AppUtils.calculateDouble((double.tryParse(rechargeA.rechargeMoney)??0) + (double.tryParse(rechargeA.giftdMoney)??0) +((double.tryParse(rechargeA.rechargeMoney)??0) - ((double.tryParse(rechargeA.rechargeMoney)??0) * (discount/100))))}元", textAlign: TextAlign.center, style: TextStyle( color: Color(0xFF868686), fontWeight: MyFontWeight.regular, fontSize:10.sp, ), ), ], ), ), if(selectIndex == index) Image.asset( "assets/image/recharge.png", width: 20, height:20, ), ], )); } Widget checkView(var index) { return Container( padding: EdgeInsets.only(right: 16.w), alignment: Alignment.center, child: Image.asset( checkIndex != index ? "assets/image/icon_radio_unselected.webp" : "assets/image/icon_radio_selected.webp", width: 15.w, height: 15.h, ), ); } recharge() async { // String money = controller.text; // if (money == null || money == "") { // SmartDialog.showToast(S.of(context).qingshuruchongzhijine, // alignment: Alignment.center); // return; // } // int amount = int.tryParse(money); // if (checkIndex == 1) { // if (amount < 100) { // SmartDialog.showToast(S.of(context).chongzhizuixiaojine(100), // alignment: Alignment.center); // return; // } if (Platform.isAndroid) { if (!(await Min.isInitialize())) { // 小程序的微信支付和app的充值支付使用同一个WXPayEntryActivity回调, // 然而充值时小程序未初始化会导致回调内部代码调用getPackage空指针, // 故而在此初始化一下 await Min.initialize(); } } BaseData baseData = await apiService.recharge( {"amount": 0,"rechargeActId":rechargeA[selectIndex].id, "rechargeType": 2}).catchError((error) {}); if (baseData != null && baseData.isSuccess) { 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 { SmartDialog.showToast(baseData.msg, alignment: Alignment.center); } } // } }