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/utils/min.dart'; import 'package:huixiang/view_widget/my_appbar.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; String money = "0"; String balance = "0"; var checkIndex = 1; @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, }); } 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: SingleChildScrollView( physics: BouncingScrollPhysics(), child: Column( children: [ Column( children: [ 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.png", 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), ), ), ], ), 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: 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.png", 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: [ if (widget.arguments["image"] != null) Image.network( widget.arguments["image"], fit: BoxFit.cover, width: 80, height: 80, ) else Image.asset( "assets/image/default_1.png", fit: BoxFit.cover, width: 80, height: 80, ), 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"], 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)), // ), // SizedBox( // width: 12, // ), // Text( // S.of(context).jifen_(widget.arguments["price"]), // 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)), ), SizedBox( width: 12.w, ), Text( S.of(context).jifen_(widget.arguments["price"]), 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: () { }, child: Image.asset( "assets/image/reduce.png", width: 22, height: 22, ), ), Container( width: 30, alignment: Alignment.center, child: Text( "1", style: TextStyle( color: Colors.black, fontSize: 14.sp, fontWeight: MyFontWeight.medium, ), ), ), InkWell( onTap: () { }, child: Image.asset( "assets/image/add.png", width: 22, height: 22, ), ), ], ), ], ), ), Container( width: double.infinity, margin: EdgeInsets.only( left: 16.w, right: 16.w, top: 12.h, bottom:5.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( "¥$money", 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.png"), 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, ), ), ), ], ), ), ], ), ), GestureDetector( onTap: () { if (!storeIsSelected) return; creditOrder(); }, child: Container( padding: EdgeInsets.only(top: 16, bottom: 16), decoration: BoxDecoration( color: MaterialStateColor.resolveWith((states) => storeIsSelected ? Color(0xFF32A060) : Color(0xFFD8D8D8)), borderRadius: BorderRadius.only( topLeft: Radius.circular(4), topRight: Radius.circular(4))), alignment: Alignment.center, child: Text( S.of(context).querenduihuan, style: TextStyle( fontSize: 16.sp, color: MaterialStateColor.resolveWith((states) => storeIsSelected ? Colors.white : Color(0xFFA0A0A0)), fontWeight: FontWeight.bold), ), ), ), ], ), // Expanded( // child: // ), ], ) ,), ); } 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.png" : "assets/image/icon_radio_selected.png", 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"], "number": 1, "useTyped": widget.arguments["useTyped"], "payChannel":checkIndex == 3?"1":"4", if (widget.arguments["useTyped"] == 1) "storeId": storeId, if (widget.arguments["useTyped"] == 2) "userAddressId": userAddressId, }); if (baseDate.isSuccess) { if(checkIndex == 3){ 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}"); Navigator.of(context).popAndPushNamed( '/router/order_details', arguments: { "id": widget.arguments["goodsId"], }, ); }); return; } await Navigator.of(context) .pushNamed('/router/exchange_order_success_page', arguments: { "price": widget.arguments["price"], "points": points, "id": baseDate.data }); points = "${int.tryParse(points) - int.tryParse(widget.arguments["price"])}"; Navigator.of(context).pop(); } else { SmartDialog.showToast(baseDate.msg, alignment: Alignment.center); } } }