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(); |
||||
}, |
||||
), |
||||
}, |
||||
), |
||||
), |
||||
], |
||||
), |
||||
), |
||||
); |
||||
}, |
||||
); |
||||
} |
||||
} |