Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 972 B |
After Width: | Height: | Size: 7.8 KiB |
After Width: | Height: | Size: 914 B |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 954 B |
After Width: | Height: | Size: 6.8 KiB |
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 816 B After Width: | Height: | Size: 732 B |
After Width: | Height: | Size: 3.5 KiB |
After Width: | Height: | Size: 732 B |
Before Width: | Height: | Size: 908 B After Width: | Height: | Size: 551 B |
After Width: | Height: | Size: 2.8 KiB |
@ -0,0 +1,353 @@ |
|||||||
|
import 'dart:convert'; |
||||||
|
|
||||||
|
import 'package:dio/dio.dart'; |
||||||
|
import 'package:flutter/cupertino.dart'; |
||||||
|
import 'package:flutter/material.dart'; |
||||||
|
import 'package:flutter_html/flutter_html.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/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'; |
||||||
|
|
||||||
|
class CouponPage extends StatefulWidget { |
||||||
|
@override |
||||||
|
State<StatefulWidget> createState() { |
||||||
|
return _CouponPage(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
class _CouponPage extends State<CouponPage> { |
||||||
|
ApiService apiService; |
||||||
|
RefreshController _refreshController; |
||||||
|
|
||||||
|
@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<Coupon> coupons = []; |
||||||
|
int pageNum = 1; |
||||||
|
int state = 1; |
||||||
|
|
||||||
|
_onRefresh() async { |
||||||
|
pageNum = 1; |
||||||
|
queryCard(); |
||||||
|
} |
||||||
|
|
||||||
|
queryCard() async { |
||||||
|
BaseData<PageInfo<Coupon>> baseData = await apiService.queryCard({ |
||||||
|
"centre": true, |
||||||
|
"pageNum": pageNum, |
||||||
|
"pageSize": 10, |
||||||
|
"searchKey": "", |
||||||
|
"state": state |
||||||
|
}).catchError((error) { |
||||||
|
_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; |
||||||
|
} |
||||||
|
}); |
||||||
|
} 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 = 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: (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": jsonEncode(coupons[position]), |
||||||
|
}).then((value) { |
||||||
|
_onRefresh(); |
||||||
|
}); |
||||||
|
} else { |
||||||
|
showStoreSelector( |
||||||
|
coupons[position].storeList); |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
// (){ |
||||||
|
// setState(() { |
||||||
|
// couponDialog(); |
||||||
|
// }); |
||||||
|
// }, |
||||||
|
() { |
||||||
|
setState(() { |
||||||
|
coupons[position].isEx = |
||||||
|
!coupons[position].isEx; |
||||||
|
}); |
||||||
|
}, |
||||||
|
type: 0, |
||||||
|
), |
||||||
|
); |
||||||
|
}, |
||||||
|
itemCount: coupons != null ? coupons.length : 0, |
||||||
|
) |
||||||
|
: NoDataView( |
||||||
|
src: "assets/image/ka.webp", |
||||||
|
isShowBtn: false, |
||||||
|
text: "目前暂无优惠券,请到领劵中心领取哦~", |
||||||
|
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); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
couponDialog(){ |
||||||
|
showCouponDialog(); |
||||||
|
} |
||||||
|
|
||||||
|
showAlertDialog() { |
||||||
|
//显示对话框 |
||||||
|
showDialog( |
||||||
|
context: context, |
||||||
|
builder: (BuildContext context) { |
||||||
|
return ReceiveSuccess(); |
||||||
|
}, |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
///优惠券详情弹窗 |
||||||
|
showCouponDialog() { |
||||||
|
showDialog( |
||||||
|
context: context, |
||||||
|
builder: (context) { |
||||||
|
return AlertDialog( |
||||||
|
content: Container( |
||||||
|
width: MediaQuery.of(context).size.width - 14, |
||||||
|
height: 330.h, |
||||||
|
child: Column( |
||||||
|
mainAxisAlignment: MainAxisAlignment.start, |
||||||
|
crossAxisAlignment: CrossAxisAlignment.start, |
||||||
|
children: [ |
||||||
|
Row( |
||||||
|
mainAxisAlignment: MainAxisAlignment.start, |
||||||
|
crossAxisAlignment: CrossAxisAlignment.center, |
||||||
|
children: [ |
||||||
|
Expanded(child: |
||||||
|
Container( |
||||||
|
alignment: Alignment.center, |
||||||
|
child: Text( |
||||||
|
"使用详情", |
||||||
|
style: TextStyle( |
||||||
|
fontWeight: MyFontWeight.bold, |
||||||
|
fontSize: 15.sp, |
||||||
|
color: Color(0xFF353535), |
||||||
|
), |
||||||
|
), |
||||||
|
)), |
||||||
|
GestureDetector( |
||||||
|
onTap: (){ |
||||||
|
setState(() { |
||||||
|
Navigator.of(context).pop(); |
||||||
|
}); |
||||||
|
}, |
||||||
|
child: Icon( |
||||||
|
Icons.clear, |
||||||
|
color: Colors.black, |
||||||
|
size: 18, |
||||||
|
), |
||||||
|
), |
||||||
|
SizedBox(width: 14), |
||||||
|
], |
||||||
|
), |
||||||
|
SizedBox(height: 12.h,), |
||||||
|
Container( |
||||||
|
width: double.infinity, |
||||||
|
height: 1.h, |
||||||
|
color: Color(0xFFF2F2F2), |
||||||
|
margin: EdgeInsets.only(bottom:11.h), |
||||||
|
), |
||||||
|
Container( |
||||||
|
color: Colors.white, |
||||||
|
child: Html( |
||||||
|
data: "注意", |
||||||
|
customImageRenders: { |
||||||
|
networkSourceMatcher(): networkImageRender( |
||||||
|
loadingWidget: () { |
||||||
|
return Container(); |
||||||
|
}, |
||||||
|
), |
||||||
|
}, |
||||||
|
), |
||||||
|
), |
||||||
|
], |
||||||
|
), |
||||||
|
), |
||||||
|
); |
||||||
|
}, |
||||||
|
); |
||||||
|
} |
||||||
|
} |