import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:dio/dio.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/user_info.dart'; import 'package:huixiang/retrofit/data/wx_pay.dart'; import 'package:huixiang/retrofit/retrofit_api.dart'; import 'package:huixiang/utils/font_weight.dart'; import 'package:huixiang/view_widget/custom_image.dart'; import 'package:huixiang/view_widget/my_appbar.dart'; import 'package:huixiang/view_widget/receiving_method_dialog.dart'; import 'package:huixiang/view_widget/round_button.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; class ExchangeOrderPage extends StatefulWidget { final Map arguments; ///兑换订单 ExchangeOrderPage({this.arguments}); @override State createState() { return _ExchangeOrderPage(); } } class _ExchangeOrderPage extends State { ApiService apiService; int buyNum = 1; var checkIndex = 1; UserInfo userInfo; dynamic mBalance = 0; @override void initState() { super.initState(); SharedPreferences.getInstance().then((value) => { apiService = ApiService(Dio(), context: context, token: value.getString("token")), points = UserInfo.fromJson(jsonDecode(value.getString('user'))).points, queryUserBalance(), }); } queryUserBalance() async { BaseData baseData = await apiService.queryInfo().catchError((onError) {}); if (baseData != null && baseData.isSuccess) { userInfo = baseData.data; mBalance = double.tryParse(userInfo.money); if (mounted) setState(() {}); } } String points; @override Widget build(BuildContext context) { return Scaffold( appBar: MyAppBar( title: S.of(context).dingdanqueren, titleColor: Colors.black, titleSize: 18.sp, background: Color(0xFFFAFAFA), leadingColor: Colors.black, ), body: Stack( children: [ SingleChildScrollView( physics: BouncingScrollPhysics(), child: Column( children: [ // widget.arguments["useTyped"] == 1 ? Container( margin: EdgeInsets.only( left: 16, right: 16, top: 26, bottom: 8), padding: EdgeInsets.all(20), decoration: BoxDecoration( color: Colors.white, boxShadow: [ BoxShadow( color: Colors.black.withAlpha(12), offset: Offset(0, 3), blurRadius: 14, spreadRadius: 0, ) ], borderRadius: BorderRadius.all(Radius.circular(8)), ), child: Column( children: [ Row( children: [ Image.asset( "assets/image/icon_order_exchange_info.webp", width: 24, height: 24, ), SizedBox(width: 4), Text( S.of(context).duihuanxinxi, style: TextStyle( fontWeight: FontWeight.bold, fontSize: 16, color: Color(0xFF353535)), ), ], ), SizedBox( height: 18.h, ), GestureDetector( onTap: () { setState(() { showAlertDialog(); }); }, child: Row( children: [ Text( S.of(context).lingqufangshi, style: TextStyle( fontSize: 14.sp, color: Color(0xFF353535), ), ), SizedBox( width: 12.w, ), Expanded( child: Text( widget.arguments["useTyped"] == 1 ? S.of(context).ziti : widget.arguments["useTyped"] == 2 ? S.of(context).peisong : S.of(context).xianshangfafang, style: TextStyle( fontSize: 14.sp, color: Color(0xFF353535), ), )), // Icon( // Icons.keyboard_arrow_right, // size: 16, // color: Color(0xFF32A060), // ), ], ), ), Visibility( child: SizedBox( height: 13.h, ), visible: widget.arguments["useTyped"] != 3, ), Visibility( child: Row( children: [ Text( S.of(context).zitidizhi, style: TextStyle( fontSize: 14.sp, color: Color(0xFF353535), ), ), SizedBox( width: 12.w, ), Expanded( child: GestureDetector( onTap: () { toAddressPicker(); }, child: Row( mainAxisAlignment: MainAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end, mainAxisSize: MainAxisSize.min, children: [ Expanded( child: Text( (address != null && address != "") ? address : widget.arguments[ "useTyped"] == 1 ? S .of(context) .qingxuanzhemendian : widget.arguments[ "useTyped"] == 2 ? S .of(context) .qingxuanzeshouhuodizhi : S .of(context) .xuni, overflow: TextOverflow.ellipsis, style: TextStyle( fontSize: 14.sp, color: Color(0xFF32A060), ), ), flex: 1, ), Icon( Icons.keyboard_arrow_right, size: 16, color: Color(0xFF32A060), ), ], ), ), flex: 1, ), ], ), visible: widget.arguments["useTyped"] != 3, ), SizedBox( height: 12.h, ), Row( children: [ Visibility( visible: widget.arguments["useTyped"] != 3, child: Text( S.of(context).zitishijian, style: TextStyle( fontSize: 14.sp, color: Color(0xFF353535)), ), ), Visibility( visible: widget.arguments["useTyped"] != 3, child: SizedBox( width: 12.w, ), ), Text( widget.arguments["useTyped"] == 1 ? S .of(context) .duihuanhouwugegongzuori : widget.arguments["useTyped"] == 2 ? S.of(context).duihuanhoufahuo : S.of(context).feishiwushangpin, style: TextStyle( fontSize: 14.sp, color: widget.arguments["useTyped"] == 3 ? Color(0xFF32A060) : Color(0xFF353535)), ), ], ), ], ), ), // : // // Container( // // margin: // // EdgeInsets.only(left: 16, right: 16, top: 26, bottom: 8), // // padding: EdgeInsets.all(20), // // decoration: BoxDecoration( // // color: Colors.white, // // boxShadow: [ // // BoxShadow( // // color: Colors.black.withAlpha(12), // // offset: Offset(0, 3), // // blurRadius: 14, // // spreadRadius: 0, // // ) // // ], // // borderRadius: BorderRadius.all(Radius.circular(8)), // // ), // // child: Column( // // mainAxisAlignment: MainAxisAlignment.spaceAround, // // crossAxisAlignment: CrossAxisAlignment.start, // // children: [ // // Row( // // children: [ // // Image.asset( // // "assets/image/icon_order_exchange_info.webp", // // width: 24, // // height: 24, // // ), // // SizedBox(width: 4), // // Text( // // S.of(context).duihuanxinxi, // // style: TextStyle( // // fontWeight: FontWeight.bold, // // fontSize: 16, // // color: Color(0xFF353535)), // // ), // // ], // // ), // // SizedBox( // // height: 18.h, // // ), // // Row( // // children: [ // // Text( // // S.of(context).lingqufangshi, // // style: TextStyle( // // fontSize: 14.sp, // // color: Color(0xFF353535), // // ), // // ), // // SizedBox( // // width: 12.w, // // ), // // Text( // // widget.arguments["useTyped"] == 1 // // ? S.of(context).ziti // // : widget.arguments["useTyped"] == 2 // // ? S.of(context).peisong // // : S.of(context).xianshangfafang, // // style: TextStyle( // // fontSize: 14.sp, // // color: Color(0xFF353535), // // ), // // ), // // ], // // ), // // SizedBox( // // height: 12.h, // // ), // // Text( // // "非实物商品兑换后领取到卡包即可使用!", // // style: TextStyle( // // fontSize: 14.sp, // // color: Color(0xFF32A060), // // fontWeight: MyFontWeight.medium // // ), // // ), // // ], // // ), // // ), // Container( // margin: EdgeInsets.only( // left: 16, right: 16, top: 26, bottom: 8), // padding: EdgeInsets.all(20), // decoration: BoxDecoration( // color: Colors.white, // boxShadow: [ // BoxShadow( // color: Colors.black.withAlpha(12), // offset: Offset(0, 3), // blurRadius: 14, // spreadRadius: 0, // ) // ], // borderRadius: // BorderRadius.all(Radius.circular(8)), // ), // child: Column( // children: [ // Row( // children: [ // Image.asset( // "assets/image/icon_order_exchange_info.webp", // width: 24, // height: 24, // ), // SizedBox(width: 4), // Text( // S.of(context).duihuanxinxi, // style: TextStyle( // fontWeight: FontWeight.bold, // fontSize: 16, // color: Color(0xFF353535)), // ), // ], // ), // SizedBox( // height: 18.h, // ), // GestureDetector( // onTap: () { // setState(() { // showAlertDialog(); // }); // }, // child: Row( // children: [ // Text( // S.of(context).lingqufangshi, // style: TextStyle( // fontSize: 14.sp, // color: Color(0xFF353535), // ), // ), // SizedBox( // width: 12.w, // ), // Expanded( // child: Text( // widget.arguments["useTyped"] == 1 // ? S.of(context).ziti // : widget.arguments["useTyped"] == 2 // ? S.of(context).peisong // : S.of(context).xianshangfafang, // style: TextStyle( // fontSize: 14.sp, // color: Color(0xFF353535), // ), // )), // Icon( // Icons.keyboard_arrow_right, // size: 16, // color: Color(0xFF32A060), // ), // ], // ), // ), // Visibility( // child: SizedBox( // height: 13.h, // ), // visible: widget.arguments["useTyped"] != 3, // ), // Visibility( // child: Row( // children: [ // Text( // "收货地址", // style: TextStyle( // fontSize: 14.sp, // color: Color(0xFF353535), // ), // ), // SizedBox( // width: 12.w, // ), // Expanded( // child: GestureDetector( // onTap: () { // toAddressPicker(); // }, // child: Row( // mainAxisAlignment: // MainAxisAlignment.end, // crossAxisAlignment: // CrossAxisAlignment.end, // mainAxisSize: MainAxisSize.min, // children: [ // Expanded( // child: Text( // (address != null && // address != "") // ? address // : widget.arguments[ // "useTyped"] == // 1 // ? S // .of(context) // .qingxuanzhemendian // : widget.arguments[ // "useTyped"] == // 2 // ? S // .of(context) // .qingxuanzeshouhuodizhi // : S // .of(context) // .xuni, // overflow: // TextOverflow.ellipsis, // style: TextStyle( // fontSize: 14.sp, // color: Color(0xFF32A060), // ), // ), // flex: 1, // ), // Icon( // Icons.keyboard_arrow_right, // size: 16, // color: Color(0xFF32A060), // ), // ], // ), // ), // flex: 1, // ), // ], // ), // visible: widget.arguments["useTyped"] != 3, // ), // SizedBox( // height: 12.h, // ), // ], // ), // ), Container( margin: EdgeInsets.only( left: 16, right: 16, top: 8, bottom: 16), padding: EdgeInsets.all(20), decoration: BoxDecoration( color: Colors.white, boxShadow: [ BoxShadow( color: Colors.black.withAlpha(12), offset: Offset(0, 3), blurRadius: 14, spreadRadius: 0, ) ], borderRadius: BorderRadius.all(Radius.circular(8)), ), child: Column( children: [ Row( children: [ Image.asset( "assets/image/icon_order_commodity_info.webp", width: 24, height: 24, ), SizedBox(width: 4), Text( S.of(context).duihuanshangpinxiangqing, style: TextStyle( fontWeight: FontWeight.bold, fontSize: 16, color: Color(0xFF353535), ), ), ], ), SizedBox( height: 18, ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, mainAxisSize: MainAxisSize.max, children: [ MImage( widget?.arguments["image"] ?? "", width: 80, height: 80, fit: BoxFit.cover, errorSrc: "assets/image/default_1.webp", fadeSrc: "assets/image/default_1.webp", ), Expanded( child: Container( height: 80.h, margin: EdgeInsets.only(left: 16.w), child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.end, children: [ Text( widget.arguments["name"], maxLines: 2, overflow: TextOverflow.ellipsis, style: TextStyle( fontSize: 14.sp, fontWeight: FontWeight.bold, color: Color(0xFF353535)), ), // SizedBox( // height: 4.h, // ), // Text( // "x1", // style: TextStyle( // fontSize: 12.sp, // color: Color(0xFF727272)), // ), ], ), ), flex: 1, ) ], ), SizedBox( height: 12.h, ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( "应付数额", style: TextStyle( fontSize: 14, color: Color(0xFF353535), fontWeight: MyFontWeight.regular), ), SizedBox( width: 12, ), Text( widget.arguments["payType"] == 1 ? "${double.parse(widget.arguments["onePrice"]) * buyNum}积分" : ((widget.arguments["price"] == null || widget.arguments["price"] == "0" ? "" : "${double.parse(widget.arguments["price"]) * buyNum}积分") + (widget.arguments["money"] == null || widget.arguments["money"] == "0.00" ? "" : " + ${double.parse(widget.arguments["money"]) * buyNum}元")), style: TextStyle( fontSize: 12, decoration: (widget.arguments["payType"] == 3) ? TextDecoration.lineThrough : TextDecoration.none, color: Color(0xFF32A060), ), ), ], ), SizedBox( height: 12, ), if (widget.arguments["payType"] == 3) Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( "现金抵扣积分", style: TextStyle( fontSize: 14, color: Color(0xFF353535), fontWeight: MyFontWeight.regular), ), SizedBox( width: 12, ), Text( "${double.parse(widget.arguments["oneMoney"]) * buyNum}元", style: TextStyle( fontSize: 12, color: Colors.black, ), ), ], ), SizedBox( height: 12, ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( "合计", style: TextStyle( fontSize: 14.sp, color: Color(0xFF353535), fontWeight: MyFontWeight.regular), ), SizedBox( width: 12.w, ), Text( handleNeedPay(), style: TextStyle( fontSize: 12.sp, color: Color(0xFF32A060)), ), ], ), ], ), ), Container( margin: EdgeInsets.only(left: 16, right: 16, bottom: 8), padding: EdgeInsets.all(20), decoration: BoxDecoration( color: Colors.white, boxShadow: [ BoxShadow( color: Colors.black.withAlpha(12), offset: Offset(0, 3), blurRadius: 14, spreadRadius: 0, ) ], borderRadius: BorderRadius.all(Radius.circular(8)), ), child: Column( children: [ Row( children: [ Expanded( child: Text( "兑换数量", style: TextStyle( fontWeight: MyFontWeight.regular, fontSize: 14.sp, color: Color(0xFF353535)), )), InkWell( onTap: () { setState(() { if (buyNum > 1) buyNum -= 1; }); }, child: Image.asset( "assets/image/reduce.webp", width: 22, height: 22, ), ), Container( width: 30, alignment: Alignment.center, child: Text( buyNum.toString(), style: TextStyle( color: Colors.black, fontSize: 14.sp, fontWeight: MyFontWeight.medium, ), ), ), InkWell( onTap: () { setState(() { if (widget.arguments["payType"] == 1 ? (double.parse(widget .arguments["onePrice"]) * (buyNum + 1)) > double.parse(points) : (widget.arguments["price"] == null || widget.arguments["price"] == "0" ? false : (double.parse(widget .arguments["price"]) * (buyNum + 1)) > double.parse(points))) { SmartDialog.showToast("您的积分不足", alignment: Alignment.center); return; } buyNum += 1; }); }, child: Image.asset( "assets/image/add.webp", width: 22, height: 22, ), ), ], ), ], ), ), if (widget.arguments["payType"] == 3 || (widget.arguments["payType"] == 2 && widget.arguments["money"] != "0.00")) Container( width: double.infinity, margin: EdgeInsets.only( left: 16.w, right: 16.w, top: 12.h, bottom: 20.h, ), padding: EdgeInsets.only( left: 16.w, right: 16.w, top: 20.h, bottom: 20.h, ), decoration: BoxDecoration( boxShadow: [ BoxShadow( color: Color(0x000000).withAlpha(25), offset: Offset(0, 1), blurRadius: 12.0, ), ], color: Colors.white, borderRadius: BorderRadius.circular(8), ), 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: MyFontWeight.regular, ), ), ), GestureDetector( onTap: () { setState(() { checkIndex = 1; }); // widget.payChannelCheck(4); }, child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ checkPayView(1), Expanded( child: Container(), flex: 1, ), Text( "¥$mBalance", style: TextStyle( fontSize: 14.sp, color: Color(0xff353535), fontWeight: MyFontWeight.semi_bold, ), ), SizedBox( width: 10, ), Text( S.of(context).pingtaiyue, style: TextStyle( fontSize: 14.sp, color: Color(0xff353535), fontWeight: MyFontWeight.semi_bold, ), ), ], ), ), SizedBox( height: 10, ), // GestureDetector( // onTap: () { // setState(() { // checkIndex = 2; // }); // }, // child: Row( // mainAxisAlignment: MainAxisAlignment.center, // crossAxisAlignment: CrossAxisAlignment.center, // children: [ // checkPayView(2), // Expanded( // child: Container(), // flex: 1, // ), // Text( // "¥$balance", // style: TextStyle( // fontSize: 14.sp, // color: Color(0xff353535), // fontWeight: MyFontWeight.semi_bold, // ), // ), // SizedBox( // width: 10, // ), // Text( // S.of(context).dianpuyue, // style: TextStyle( // fontSize: 14.sp, // color: Color(0xff353535), // fontWeight: MyFontWeight.semi_bold, // ), // ), // ], // ), // ), SizedBox( height: 10, ), GestureDetector( onTap: () { setState(() { checkIndex = 3; }); }, child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.start, children: [ checkPayView(3), Spacer(), Image.asset("assets/image/icon_we_chat.webp"), Padding( padding: EdgeInsets.only(left: 8.w), child: Text( S.of(context).weixinzhifu, style: TextStyle( fontSize: 14.sp, color: Color(0xff353535), fontWeight: MyFontWeight.semi_bold, ), ), ), ], ), ), ], ), ), SizedBox(height: 40) ], )), Align( alignment: Alignment.bottomCenter, child: Container( height: 54.h, color: Colors.white, child: Row( children: [ Spacer(), Padding( padding: EdgeInsets.only(top: 7, right: 16), child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( S.of(context).heji, style: TextStyle( fontSize: 12.sp, fontWeight: MyFontWeight.regular, color: Colors.black, ), ), Text( handleNeedPay(), style: TextStyle( fontSize: 16.sp, fontWeight: MyFontWeight.medium, color: Color(0xFF32A060), ), ), ], )), GestureDetector( onTap: () { if (!storeIsSelected) return; creditOrder(); }, child: RoundButton( width: 103.w, height: 54.h, text: widget.arguments["payType"] == 3 || (widget.arguments["payType"] == 2 && widget.arguments["money"] != "0.00") ? S.current.jiesuan : S.current.duihuan, textColor: Colors.white, fontWeight: MyFontWeight.regular, backgroup: Color(0xFF32A060), radius: 0, fontSize: 16.sp, padding: EdgeInsets.symmetric(vertical: 5.h), ), ), ], ), )) ], )); } ///领取方式弹窗 showAlertDialog() { //显示对话框 showDialog( context: context, builder: (BuildContext context) { return ReceivingMethodDialog(widget.arguments["useTyped"], (value) { setState(() { widget.arguments["useTyped"] = value; }); }); }, ); } String handleNeedPay() { if(widget.arguments["payType"] == 0) return ""; if(widget.arguments["payType"] == 1){ return S.of(context).jifen_(double.parse(widget.arguments["onePrice"]) * buyNum); }else if(widget.arguments["payType"] ==2){ return (widget.arguments["price"] == null || widget.arguments["price"] == "0" ? "" : "${double.parse(widget.arguments["price"]) * buyNum}积分") + (widget.arguments["money"] == null || widget.arguments["money"] == "0.00" ? "" : " + ${double.parse(widget.arguments["money"]) * buyNum}元"); }else if(widget.arguments["payType"] == 3){ return "${double.parse(widget.arguments["oneMoney"]) * buyNum}元"; } } Widget checkPayView(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, ), ); } var storeIsSelected = true; String storeId; String address; String userAddressId; toAddressPicker() async { if (widget.arguments["useTyped"] == 1) { dynamic result = await Navigator.of(context).pushNamed('/router/store_selector_page'); if (result == null) return; storeId = result["id"]; address = result["address"]; } else if (widget.arguments["useTyped"] == 2) { dynamic result = await Navigator.of(context).pushNamed( '/router/manage_address_page', arguments: {"isSelector": true}); if (result == null) return; userAddressId = result["id"]; address = result["address"]; } setState(() {}); } ///创建积分订单 creditOrder() async { if (widget.arguments["useTyped"] == 1 && (storeId == null || storeId == "")) { SmartDialog.showToast("请选择一个门店", alignment: Alignment.center); return; } if (widget.arguments["useTyped"] == 2 && (userAddressId == null || userAddressId == "")) { SmartDialog.showToast("请选择一个收货地址", alignment: Alignment.center); return; } BaseData baseDate = await apiService.creditOrder({ "goodsId": widget.arguments["goodsId"], "isOneSell": widget.arguments["payType"] != 2, "isPoints": !handleNeedPay().contains("元"), "number": buyNum, "useTyped": widget.arguments["useTyped"], "payChannel": handleNeedPay().contains("元") ? (checkIndex == 3 ? "1" : "4") : "0", if (widget.arguments["useTyped"] == 1) "storeId": storeId, if (widget.arguments["useTyped"] == 2) "userAddressId": userAddressId, }); if (baseDate.isSuccess) { String realPay = handleNeedPay(); if ((widget.arguments["payType"] == 3 || (widget.arguments["payType"] == 2 && widget.arguments["money"] != "0.00")) && checkIndex == 3) { // if(Platform.isAndroid){ // if (!(await Min.isInitialize())) { // // 小程序的微信支付和app的充值支付使用同一个WXPayEntryActivity回调, // // 然而充值时小程序未初始化会导致回调内部代码调用getPackage空指针, // // 故而在此初始化一下 // await Min.initialize(); // } // } WxPay wxPay = WxPay.fromJson(baseDate.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, ); weChatResponseEventHandler.listen((event) async { print("payCallback: ${event.errCode}"); if (event.errCode == 0) { Navigator.of(context).popAndPushNamed( '/router/exchange_order_success_page', arguments: { "id": widget.arguments["goodsId"], "price": realPay.contains("积分") ? realPay.substring(0,realPay.indexOf("积分")) : "0", "points": points, "realPay": realPay, "payChannel": widget.arguments["payChannel"], }, ); } else { SmartDialog.showToast("支付失败", alignment: Alignment.center); return; } }); return; } await Navigator.of(context) .pushNamed('/router/exchange_order_success_page', arguments: { "price": realPay.contains("积分") ? realPay.substring(0,realPay.indexOf("积分")) : "0", "realPay": realPay, "points": points, "payChannel": widget.arguments["payChannel"], "id": baseDate.data }); points = "${int.tryParse(points) - int.tryParse(widget.arguments["price"])}"; Navigator.of(context).pop(); } else { SmartDialog.showToast(baseDate.msg, alignment: Alignment.center); } } }