import 'package:chat/data/UserData.dart'; import 'package:chat/data/constants.dart'; import 'package:chat/generated/i18n.dart'; import 'package:chat/models/money_change.dart'; import 'package:chat/utils/ChargeMoney.dart'; import 'package:chat/utils/CustomUI.dart'; import 'package:chat/utils/HttpUtil.dart'; import 'package:chat/utils/MessageMgr.dart'; import 'package:chat/utils/ShadowButton.dart'; import 'package:chat/utils/TokenMgr.dart'; import 'package:chat/utils/screen.dart'; import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:oktoast/oktoast.dart'; import 'package:provider/provider.dart'; const double PaddingSize = 8; class VipPage extends StatefulWidget { VipPage({Key key}) : super(key: key); _VipPageState createState() => _VipPageState(); } enum PayWay { wx, zfb, } class _VipPageState extends State with SingleTickerProviderStateMixin { TabController tabCtrl; List vipData = []; int selectId = 0; int selectMoney = 0; int payWay = PayWay.wx.index; bool isLoadingFish = false; bool isNormalVip = true; int subMoney = 0; List goodsList = []; Map memberInfo = { 'CheckNum': 0, 'PhotoOrAccount': 0, 'BurnTime': 0, 'PublishAd': 0, 'HumanTranslation': 0, 'ExclusiveCustomer': 0, 'PremiumUIDisplay': 0, }; @override void initState() { super.initState(); getVipInfo(1); } void getVipInfo(type) async { Map data = { "userid": UserData().basicInfo.userId, }; data['sign'] = TokenMgr().getSign(data); data['type'] = type; Response res = await HttpUtil().post('goods/member/list', data: data, failback: () => Navigator.of(context).pop()); Map resData = res.data; if (resData['code'] == 0 && resData['data'] != null && resData['data'].length > 0) { if (type == 2) subMoney = upgradNum(vipData, resData['data']['list']); memberInfo = resData['data']['memberInfo']; vipData = resData['data']['list']; selectId = vipData[0]['Id']; selectMoney = vipData[0]['TotalPrice']; isLoadingFish = true; isNormalVip = type == 1; setState(() {}); } } @override void dispose() { super.dispose(); } @override Widget build(BuildContext context) { Widget content = Scaffold( appBar: AppBar( backgroundColor: AppColors.NewAppbarBgColor, title: Text( I18n.of(context).member_centre, textScaleFactor: 1.0, style: TextStyle(color: AppColors.NewAppbarTextColor), ), centerTitle: true, leading: CustomUI.buildCustomLeading(context), ), body: SafeArea( child: Center( child: Container( height: MediaQuery.of(context).size.height, width: MediaQuery.of(context).size.width, child: _buildBody(), ), ))); return CustomUI.buildPageLoading(context, content, !isLoadingFish); } Widget _buildBody() { return ListView( children: [ _buildTips(), _buildGoodsItemList(), _buildCommit(), ], ); } //构建注册按钮 Widget _buildCommit() { Text text = new Text( UserData().isVip ? I18n.of(context).renewal_fee : I18n.of(context).open_immediately, textScaleFactor: 1.0, style: TextStyle(fontSize: 17, color: Colors.white)); LinearGradient gradientColor = new LinearGradient(colors: [ Constants.ConfrimButtonColor, Constants.ConfrimButtonColor, ]); callback() { if (UserData().isSuperVip && isNormalVip) { showToast(I18n.of(context).cannot_vip); return; } if (UserData().isVip && !UserData().isSuperVip && !isNormalVip) { if (subMoney == 0) { return; } CustomUI.buildOneConfirm( context, I18n.of(context) .becomeSvip .replaceFirst('/s1', subMoney.toString()), I18n.of(context).determine, () { HttpUtil().buyVIP(subMoney, 0, 2, context, () { Navigator.of(context).pop(); MessageMgr().emit('refresh_money'); MessageMgr().emit('update_data'); }); }); return; } if (Provider.of(context).money < selectMoney) { CustomUI.buildOneConfirm(context, I18n.of(context).balance_insufficien, I18n.of(context).recharge, () { Navigator.of(context).pop(); ChargeMoney.showChargeSheet(context, () { setState(() {}); }); }); return; } CustomUI.buildOneConfirm( context, I18n.of(context).confirm_pay + selectMoney.toString() + I18n.of(context).mask_coin, I18n.of(context).determine, () { HttpUtil().buyVIP(selectMoney, selectId, isNormalVip ? 1 : 2, context, () { Navigator.of(context).pop(); MessageMgr().emit('refresh_money'); MessageMgr().emit('update_data'); }); }); } return Container( child: Column( children: [ Container( margin: EdgeInsets.only(left: 28), alignment: Alignment.centerLeft, child: RichText( text: TextSpan(children: [ TextSpan( text: I18n.of(context).total, style: TextStyle(fontSize: 15.49, color: Colors.black), ), TextSpan( text: ' $selectMoney', style: TextStyle( color: const Color(0xFFE30101), fontSize: 16, fontWeight: FontWeight.normal), ), TextSpan( text: I18n.of(context).mask_coin, style: TextStyle(color: const Color(0xFFE30101), fontSize: 15)) ]))), Container( margin: EdgeInsets.only(top: 21, left: 31, right: 31, bottom: 20), height: 44, child: ShadowButton().builder(gradientColor, text, callback), ) ], ), ); } // Widget _buildVerText(String str) { // List child = []; // List list = str.split(' '); // list.forEach((str) { // child.add(Text( // str, // style: TextStyle(fontSize: 14, color: Constants.BlackTextColor), // )); // }); // return Column( // mainAxisAlignment: MainAxisAlignment.center, // children: child, // ); // } Widget _buildGoodsItem(month, money, oldMoney, leftTop, value) { bool isSelect = selectId == value['Id']; return InkWell( onTap: () { setState(() { selectId = value['Id']; selectMoney = value['TotalPrice']; }); }, child: Container( alignment: Alignment.center, height: 49.25, margin: EdgeInsets.only(bottom: 15, left: 12.5, right: 12.5), decoration: BoxDecoration( color: Colors.white, border: Border.all( width: 1, color: isSelect ? const Color(0xFF2D81FF) : const Color(0xFFC9C9C9)), boxShadow: [ BoxShadow( color: isSelect ? const Color(0x7A2D81FF) : const Color(0x7ABCBCBC), offset: Offset(0, 5), blurRadius: 9, ) ], borderRadius: BorderRadius.all(Radius.circular(10))), child: Stack( children: [ leftTop ? Positioned( left: 0, top: 0, child: Container( decoration: BoxDecoration( borderRadius: BorderRadius.only( topLeft: Radius.circular(9), bottomRight: Radius.circular(5)), gradient: LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: [ const Color(0xFFCE0B0B), const Color(0xFFFF0000), ]), ), padding: EdgeInsets.only(left: 5, right: 5), child: Text(I18n.of(context).recommend, textScaleFactor: 1.0, style: TextStyle(fontSize: 13, color: Colors.white)), )) : Positioned(left: 0, top: 0, child: Container()), isSelect ? Positioned( right: -1, bottom: 0, child: Image.asset( 'assets/images/login/vip_rect2.png', ), width: 25, ) : Positioned( right: 0, bottom: 0, child: Container(), ), Container( height: double.infinity, child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ Expanded( child: Container( alignment: Alignment.center, child: Row( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: [ Text('$money', textScaleFactor: 1.0, style: TextStyle( color: const Color(0xFFE30101), fontSize: 22, fontWeight: FontWeight.normal)), Text('${I18n.of(context).mask_coin}', textScaleFactor: 1.0, style: TextStyle( color: const Color(0xFFE30101), fontSize: 20, fontWeight: FontWeight.normal)), ], )), ), Image.asset( 'assets/images/login/vip_rect3.png', height: 25, color: Colors.grey, ), Container( width: 110, alignment: Alignment.center, child: Text(month, textScaleFactor: 1.0, style: TextStyle( fontSize: 15, color: Constants.BlackTextColor)), ), ], ), ) ], ))); } Widget buildSelectContainer(str, bool isSelect, bool isNormalVip) { var color = Constants.BlackTextColor; return Container( alignment: Alignment.center, padding: EdgeInsets.only(bottom: isSelect ? 9 : 12), decoration: BoxDecoration( color: Colors.white, border: Border( bottom: BorderSide( color: isSelect ? const Color(0xFF2D81FF) : Colors.transparent, width: isSelect ? 4 : 1))), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Padding( padding: EdgeInsets.only(top: 0), child: Image.asset( isNormalVip ? 'assets/images/vip/hy_hy.png' : 'assets/images/vip/hy_cjhy.png', width: 18, ), ), SizedBox(width: 5), Text(str, textScaleFactor: 1.0, style: TextStyle(fontSize: 16, color: color)) ], ), ); } Widget _buildGoodsItemList() { Widget tip = Container( color: Colors.white, margin: EdgeInsets.only(bottom: 15), child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ InkWell( onTap: isNormalVip ? null : () { getVipInfo(1); }, child: buildSelectContainer( I18n.of(context).member, isNormalVip, true)), InkWell( onTap: !isNormalVip ? null : () { getVipInfo(2); }, child: buildSelectContainer( I18n.of(context).svip, !isNormalVip, false)), ], )); List list = [tip]; vipData.forEach((k) { var name = k['MonthValue'] == 0.5 ? I18n.of(context).half_month : I18n.of(context) .month2 .replaceFirst('/s1', k['MonthValue'].toInt().toString()); list.add(_buildGoodsItem( name, k['TotalPrice'], 72, vipData.indexOf(k) == 0, k)); }); list.add(Container( height: 1, color: const Color(0xFFDADADA), margin: EdgeInsets.only(left: 14, right: 14, bottom: 13), )); return Container( child: Wrap( alignment: WrapAlignment.spaceEvenly, children: list, ), ); } double subNum(data) { return data['MonthPrice'] / 30; } //补差价 int upgradNum(vipList, sVipList) { if (UserData().memberEndTime == '') { return 0; } int day = 0; const moneyDay = 30; try { DateTime endTime = DateTime.parse(UserData().memberEndTime); day = endTime.difference(DateTime.now()).inDays; if (day < 0) { return 0; } //小于最小天数按最小天数补 if (day < vipList[0]['MonthValue'] * moneyDay) { return (day * (subNum(sVipList[0]) - subNum(vipList[0]))).ceil(); } //大于最大天数按最大天数补 if (day > vipList[vipList.length - 1]['MonthValue'] * moneyDay) { return (day * (subNum(sVipList[vipList.length - 1]) - subNum(vipList[vipList.length - 1]))) .ceil(); } for (int i = 0; i < vipList.length; i++) { int standDay = (vipList[i]['MonthValue'] * moneyDay).ceil(); if (day < standDay) { return (day * (subNum(sVipList[i - 1]) - subNum(vipList[i - 1]))) .ceil(); } } } catch (e) {} return 0; } Widget _buildTipItem(leftStr, rightStr, {isShow = true}) { var color = isShow ? Colors.white : Colors.white.withOpacity(0); return Container( margin: EdgeInsets.only(left: 39, right: 5), child: Row( children: [ Container( margin: EdgeInsets.only(right: 20.5), child: Text( leftStr, textScaleFactor: 1.0, style: TextStyle( color: color, fontSize: 11.44, fontWeight: FontWeight.w600), ), ), Expanded( child: Container( padding: EdgeInsets.only(right: 5), child: Text( rightStr, textScaleFactor: 1.0, style: TextStyle( color: color, fontSize: 10.4, ), ), )), ], ), ); } Widget _buildTips() { Widget tip = Container( margin: EdgeInsets.only(left: PaddingSize, right: PaddingSize), padding: EdgeInsets.only(top: 9, left: 12, bottom: 10), child: Row( children: [ Image.asset( 'assets/images/vip/hy_tq.png', width: 16, ), Text( I18n.of(context).members_privilege, textScaleFactor: 1.0, style: TextStyle(color: Colors.white, fontSize: 13.54), ), ], )); return Container( color: Colors.white, width: Screen.width, child: Stack( children: [ Container( color: Colors.white, margin: EdgeInsets.only(left: PaddingSize, right: PaddingSize), alignment: Alignment.center, child: Image.asset( 'assets/images/vip/hy_bg.png', fit: BoxFit.fitWidth, ), ), // Container( // height: 150, // margin: EdgeInsets.only(top:5,left: PaddingSize, right: PaddingSize), // alignment: Alignment.center, // child: Text(''), // decoration: BoxDecoration( // borderRadius: BorderRadius.circular(12), // gradient: LinearGradient( // begin: Alignment.centerLeft, // end: Alignment.centerRight, // colors: [Color(0xffff9186), Color(0xffff5599)], // // )), // ), Positioned( child: Container( height: (Screen.width - PaddingSize * 2) / 2.18, padding: EdgeInsets.only(bottom: 15), child: Column( mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.start, children: [ tip, _buildTipItem(I18n.of(context).see_more, I18n.of(context).unlimited_see), _buildTipItem( I18n.of(context).see_cheaper, I18n.of(context).free10.replaceFirst('/s1', memberInfo['PhotoOrAccount'].toString())), _buildTipItem( I18n.of(context).see_longer, I18n.of(context).towto6.replaceFirst('/s1', (memberInfo['BurnTime'] + 2).toString())), _buildTipItem( I18n.of(context).see_better, I18n.of(context).free_program.replaceFirst( '/s1', memberInfo['PublishAd'].toString())), _buildTipItem(I18n.of(context).right5, I18n.of(context).free_translate, isShow: !isNormalVip), _buildTipItem(I18n.of(context).right6, I18n.of(context).personalTraff, isShow: !isNormalVip), ], ))), ], )); } }