import 'dart:convert'; import 'package:dio/dio.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:huixiang/generated/l10n.dart'; import 'package:huixiang/retrofit/data/base_data.dart'; import 'package:huixiang/retrofit/data/coupon.dart'; import 'package:huixiang/retrofit/data/page.dart'; import 'package:huixiang/retrofit/retrofit_api.dart'; import 'package:huixiang/utils/font_weight.dart'; import 'package:huixiang/view_widget/classic_header.dart'; import 'package:huixiang/view_widget/coupon_details_dialog.dart'; import 'package:huixiang/view_widget/my_appbar.dart'; import 'package:huixiang/view_widget/my_footer.dart'; import 'package:huixiang/view_widget/new_coupon_widget.dart'; import 'package:huixiang/view_widget/no_data_view.dart'; import 'package:huixiang/view_widget/receive_success.dart'; import 'package:huixiang/view_widget/selector_store_dialog.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:shimmer/shimmer.dart'; class CouponPage extends StatefulWidget { @override State createState() { return _CouponPage(); } } class _CouponPage extends State { ApiService apiService; RefreshController _refreshController; int networkStatus = 0; @override void dispose() { super.dispose(); _refreshController.dispose(); } @override void initState() { super.initState(); SharedPreferences.getInstance().then((value) { apiService = ApiService(Dio(), context: context, token: value.getString('token')); queryCard(); }); _refreshController = RefreshController(initialRefresh: false); } List coupons = []; int pageNum = 1; int state = 1; _onRefresh() async { pageNum = 1; queryCard(); } queryCard() async { BaseData> baseData = await apiService.queryCard({ "centre": true, "pageNum": pageNum, "pageSize": 10, "searchKey": "", "state": state }).catchError((error) { networkStatus = -1; _refreshController.loadFailed(); _refreshController.refreshFailed(); }); if (baseData != null && baseData.isSuccess) { if (pageNum == 1) { coupons.clear(); } coupons.addAll(baseData.data.list); setState(() { _refreshController.refreshCompleted(); _refreshController.loadComplete(); if (baseData.data.pageNum == baseData.data.pages) { _refreshController.loadNoData(); } else { pageNum += 1; } }); networkStatus = 1; } else { _refreshController.loadFailed(); _refreshController.refreshFailed(); } } @override Widget build(BuildContext context) { return Scaffold( appBar: MyAppBar( title: S .of(context) .youhuiquan, titleColor: Colors.black, background: Color(0xFFFFFFFF), leadingColor: Colors.black, ), body: Column( children: [ Container( height: 54.h, padding: EdgeInsets.only(left: 14.w, right: 14.w, bottom: 12.h), margin: EdgeInsets.only(bottom: 10), color: Color(0xFFFFFFFF), child: Row( children: [ Expanded( child: GestureDetector( onTap: () { setState(() { state = 1; _onRefresh(); }); }, child: Container( width: double.infinity, alignment: Alignment.center, decoration: BoxDecoration( borderRadius: new BorderRadius.only( topLeft: Radius.circular(6), bottomLeft: Radius.circular(6), ), border: Border.all( color: Color(0xFF32A060), width: 1, ), color: state == 1 ? Color(0xFF32A060) : Color( 0xFFFFFFFF), ), child: Text( S .of(context) .keyongquan, style: TextStyle( fontWeight: MyFontWeight.medium, fontSize: 15.sp, color: state == 1 ? Color(0xFFFFFFFF) : Color( 0xFF32A060), ), ), ), )), Expanded( child: GestureDetector( onTap: () { setState(() { state = 2; _onRefresh(); }); }, child: Container( width: double.infinity, alignment: Alignment.center, decoration: BoxDecoration( border: Border( top: BorderSide(width: 1, color: Color(0xFF32A060)), bottom: BorderSide(width:1, color: Color(0xFF32A060)), ), color: state == 2 ? Color(0xFF32A060) : Color( 0xFFFFFFFF), ), child: Text( S.of(context).yishiyong, style: TextStyle( fontWeight: MyFontWeight.medium, fontSize: 15.sp, color: state ==2 ? Color(0xFFFFFFFF) : Color( 0xFF32A060), ), ), ), )), Expanded( child: GestureDetector( onTap: () { setState(() { state = 3; _onRefresh(); }); }, child: Container( width: double.infinity, alignment: Alignment.center, decoration: BoxDecoration( borderRadius: new BorderRadius.only( topRight: Radius.circular(6), bottomRight: Radius.circular(6), ), border: Border.all( color: Color(0xFF32A060), width: 1, ), color: state == 3 ? Color(0xFF32A060) : Color( 0xFFFFFFFF), ), child: Text( S.of(context).shixiaoquan, style: TextStyle( fontWeight: MyFontWeight.medium, fontSize: 15.sp, color: state == 3 ? Color(0xFFFFFFFF) : Color( 0xFF32A060), ), ), ), )) ], ), ), Expanded( child: SmartRefresher( controller: _refreshController, enablePullDown: true, enablePullUp: true, physics: BouncingScrollPhysics(), header: MyHeader(), footer: CustomFooter( builder: (context, mode) { return MyFooter(mode); }, ), onRefresh: _onRefresh, onLoading: queryCard, child: networkStatus == 0 ? ListView.builder( itemCount: 10, physics: BouncingScrollPhysics(), shrinkWrap: true, itemBuilder: (context, position) { return GestureDetector( onTap: () {}, child: couponItemSm(), ); }, ):((coupons != null && coupons.length > 0) ? ListView.builder( itemBuilder: (context, position) { return GestureDetector( child: NewCouponWidget( coupons[position], (type) { if (type == 1) { receiveCoupon(coupons[position].id); } else { if (coupons[position].bizType == 5 || coupons[position].bizType == 3) { Navigator.of(context).pushNamed( '/router/write_off_page', arguments: { "couponId": coupons[position].id, "coupon": coupons[position], }).then((value) { _onRefresh(); }); } else { showStoreSelector( coupons[position].storeList); } } }, () { setState(() { coupons[position].isEx = !coupons[position].isEx; }); }, (){ setState(() { showCouponDetails(position); }); }, type: 0, ), ); }, itemCount: coupons != null ? coupons.length : 0, ) : NoDataView( src: "assets/image/ka.webp", isShowBtn: false, text: state == 1 ? "目前暂无优惠券,请到领劵中心领取哦~" :(state == 2 ? "目前暂无已使用的优惠券哦~" :"目前暂无失效的优惠券哦~"), fontSize: 16.sp, margin: EdgeInsets.only(top: 120.h, left: 60, right: 60), )), ), ), ], ), ); } receiveCoupon(couponId) async { BaseData baseData = await apiService.receiveCoupon(couponId).catchError((onError) {}); if (baseData != null && baseData.isSuccess) { _onRefresh(); showAlertDialog(); } } ///选择店铺使用 showStoreSelector(storeList) { showModalBottomSheet( context: context, backgroundColor: Colors.transparent, builder: (context) { return SelectorStoreWidget(storeList); }); } showAlertDialog() { //显示对话框 showDialog( context: context, builder: (BuildContext context) { return ReceiveSuccess(); }, ); } ///使用详情 showCouponDetails(index) { showModalBottomSheet( context: context, backgroundColor: Colors.transparent, builder: (context) { return CouponDetailsWidget(coupons[index]); }); } Widget couponItemSm(){ return Container( height:143.h, width: double.infinity, margin: EdgeInsets.fromLTRB(14.w, 6.h, 14.w, 6.h), padding: EdgeInsets.only(right:13.w,top: 12.h,bottom: 13.h,left: 18.w), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(6), boxShadow: [ BoxShadow( color: Colors.black.withAlpha(12), offset: Offset(0, 3), blurRadius: 14, spreadRadius: 0, ) ], ), child:Row( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ Expanded(child:Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ Shimmer.fromColors( baseColor: Color(0XFFD8D8D8), highlightColor: Color(0XFFD8D8D8), child: Container( color: Color(0XFFD8D8D8), width:143.w, height: 21.h, ), ), SizedBox(height: 6.h,), Shimmer.fromColors( baseColor: Color(0XFFD8D8D8), highlightColor: Color(0XFFD8D8D8), child: Container( color: Color(0XFFD8D8D8), width:150.w, height:17.h, ), ), Spacer(), Shimmer.fromColors( baseColor: Color(0XFFD8D8D8), highlightColor: Color(0XFFD8D8D8), child: Container( color: Color(0XFFD8D8D8), width:48.w, height: 17.h, ), ), ], )), Column( children: [ Shimmer.fromColors( baseColor: Color(0XFFD8D8D8), highlightColor: Color(0XFFD8D8D8), child: Container( color: Color(0XFFD8D8D8), width:50.w, height: 50.h, ), ), SizedBox(height: 10.h,), Shimmer.fromColors( baseColor: Color(0XFFD8D8D8), highlightColor: Color(0XFFD8D8D8), child: Container( color: Color(0XFFD8D8D8), width:59.w, height:17.h, ), ), SizedBox(height:15.h,), Shimmer.fromColors( baseColor: Color(0XFFD8D8D8), highlightColor: Color(0XFFD8D8D8), child: Container( decoration: BoxDecoration( color: Color(0XFFD8D8D8), borderRadius: BorderRadius.circular(10), ), width:64.w, height: 19.h, ), ) ], ) ], ), ); } }