You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
app/lib/pages/user/user_benefit_page.dart

398 lines
12 KiB

import 'package:flutter/material.dart';
import 'package:velocity_x/velocity_x.dart';
import 'package:recook/constants/constants.dart';
import 'package:recook/constants/header.dart';
import 'package:recook/pages/user/benefit_view_gen.dart';
import 'package:recook/pages/user/functions/user_benefit_func.dart';
import 'package:recook/pages/user/model/user_benefit_common_model.dart';
import 'package:recook/pages/user/user_benefit_sub_page.dart';
import 'package:recook/utils/custom_route.dart';
import 'package:recook/utils/user_level_tool.dart';
import 'package:recook/widgets/custom_image_button.dart';
import 'package:recook/widgets/custom_painters/round_background_painter.dart';
import 'package:recook/widgets/recook_back_button.dart';
import 'package:recook/widgets/recook_indicator.dart';
class UserBenefitPage extends StatefulWidget {
UserBenefitPage({Key key}) : super(key: key);
@override
_UserBenefitPageState createState() => _UserBenefitPageState();
}
class _UserBenefitPageState extends State<UserBenefitPage>
with TickerProviderStateMixin {
List<String> tabs = ['今日', '昨日', '本月', '上月'];
TabController _tabController;
UserBenefitCommonModel _displayModel = UserBenefitCommonModel.zero();
UserBenefitCommonModel _todayModel = UserBenefitCommonModel.zero();
UserBenefitCommonModel _yestodayModel = UserBenefitCommonModel.zero();
UserBenefitCommonModel _thisMonthModel = UserBenefitCommonModel.zero();
UserBenefitCommonModel _lastMonthModel = UserBenefitCommonModel.zero();
UserRoleLevel get _role => UserLevelTool.currentRoleLevelEnum();
bool get _purchaseShow => true;
bool get _guideShow =>
_role != UserRoleLevel.None && _role != UserRoleLevel.Vip;
bool get _teamShow =>
_role != UserRoleLevel.None && _role != UserRoleLevel.Vip;
bool get _recommendShow =>
_role == UserRoleLevel.Diamond_1 || _role == UserRoleLevel.Diamond_2;
bool get _rewardShow => _role == UserRoleLevel.Diamond_1;
Future getData() async {
await Future.delayed(Duration(milliseconds: 300));
GSDialog.of(context).showLoadingDialog(context, '加载中');
_todayModel = await UserBenefitFunc.getCommonModel(
BenefitDateType.DAY,
DateTime.now(),
);
_yestodayModel = await UserBenefitFunc.getCommonModel(
BenefitDateType.DAY,
DateTime.now().subtract(Duration(days: 1)),
);
_thisMonthModel = await UserBenefitFunc.getCommonModel(
BenefitDateType.MONTH,
DateTime.now(),
);
_lastMonthModel = await UserBenefitFunc.getCommonModel(
BenefitDateType.MONTH,
DateTime(DateTime.now().year, DateTime.now().month - 1),
);
_displayModel = _todayModel;
GSDialog.of(context).dismiss(context);
setState(() {});
}
Widget _buildTabView(int index) {
double allCount = 0;
switch (index) {
case 0:
allCount = _todayModel.allAmount;
break;
case 1:
allCount = _yestodayModel.allAmount;
break;
case 2:
allCount = _thisMonthModel.allAmount;
break;
case 3:
allCount = _lastMonthModel.allAmount;
break;
}
return <Widget>[
'预估收益'.text.color(Colors.black54).size(18.rsp).make(),
allCount
.toStringAsFixed(2)
.text
.color(Color(0xFF333333))
.size(28.rsp)
.make(),
].column(
alignment: MainAxisAlignment.center,
);
}
_buildCard() {
return [
VxBox(
child: <Widget>[
SizedBox(
height: 40.rw,
child: TabBar(
tabs: tabs.map((e) => e.text.make()).toList(),
labelColor: Colors.black87,
controller: _tabController,
indicator: RecookIndicator(
borderSide: BorderSide(
width: 4.rw,
color: Color(0xFFFF7473),
),
),
indicatorSize: TabBarIndicatorSize.label,
),
),
TabBarView(
children:
List.generate(tabs.length, (index) => _buildTabView(index)),
controller: _tabController,
).expand(),
].column(),
)
.withDecoration(
BoxDecoration(
image: DecorationImage(
image: AssetImage(R.ASSETS_SHOP_PAGE_INCOME_CARD_PNG),
fit: BoxFit.cover,
),
borderRadius: BorderRadius.circular(10.rw),
),
)
.height(134.rw)
.margin(EdgeInsets.all(10.rw))
.make(),
].stack();
}
_buildItem({
@required String path,
@required String title,
@required _ItemClass firstItem,
@required _ItemClass secondItem,
@required _ItemClass thirdItem,
@required VoidCallback onTap,
bool show = false,
}) {
if (!show) return null;
Widget getColumnItem(_ItemClass item) {
Widget helper = CustomImageButton(
onPressed: item.onHelper,
padding: EdgeInsets.all(5.rw),
child: Image.asset(
R.ASSETS_SHOP_HELPER_PNG,
height: 9.rw,
width: 9.rw,
),
);
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
[
item.title.text.color(Colors.black45).size(12.rsp).make(),
item.onHelper == null ? SizedBox() : helper,
].row(),
10.hb,
item.value.text.black.size(16.rsp).make(),
],
).expand();
}
return VxBox(
child: <Widget>[
CustomImageButton(
onPressed: onTap,
child: <Widget>[
46.hb,
16.wb,
Image.asset(path, height: 20.rw, width: 20.rw),
6.wb,
title.text.size(16.rsp).color(Colors.black).bold.make(),
Spacer(),
'查看明细'.text.color(Colors.black54).size(12).make(),
Icon(Icons.arrow_forward_ios, size: 16.rw, color: Colors.black38),
16.wb,
].row(),
),
Divider(
height: 1.rw,
thickness: 1.rw,
indent: 16.rw,
endIndent: 16.rw,
color: Color(0xFFEEEEEE),
),
Row(
children: [
16.wb,
66.hb,
getColumnItem(firstItem),
getColumnItem(secondItem),
getColumnItem(thirdItem),
16.wb,
],
),
].column(
crossAlignment: CrossAxisAlignment.start,
),
).margin(EdgeInsets.only(bottom: 10.rw)).color(Colors.white).make();
}
List<Widget> _buildBottomItems() {
return [
_buildItem(
onTap: () => CRoute.push(
context,
BenefitViewGen(type: UserBenefitPageType.SELF),
),
path: R.ASSETS_USER_PINK_BUYER_PNG,
title: '自购收益',
firstItem: _ItemClass(
title: '订单(笔)',
value: _displayModel.purchase.count.toString(),
),
secondItem: _ItemClass(
title: '销售额(元)',
value: _displayModel.purchase.salesVolume.toStringAsFixed(2),
),
thirdItem: _ItemClass(
title: '预估收益(瑞币)',
value: _displayModel.purchase.amount.toStringAsFixed(2),
onHelper: () {},
),
show: _purchaseShow,
),
_buildItem(
onTap: () => CRoute.push(
context,
BenefitViewGen(type: UserBenefitPageType.GUIDE),
),
path: R.ASSETS_USER_PINK_SHARE_PNG,
title: '导购收益',
firstItem: _ItemClass(
title: '订单(笔)',
value: _displayModel.guide.count.toString(),
),
secondItem: _ItemClass(
title: '销售额(元)',
value: _displayModel.guide.salesVolume.toStringAsFixed(2),
),
thirdItem: _ItemClass(
title: '预估收益(瑞币)',
value: _displayModel.guide.amount.toStringAsFixed(2),
onHelper: () {},
),
show: _guideShow,
),
_buildItem(
onTap: () => CRoute.push(
context,
BenefitViewGen(type: UserBenefitPageType.TEAM),
),
path: R.ASSETS_USER_PINK_GROUP_PNG,
title: '团队收益',
firstItem: _ItemClass(
title: '团队销售额(元)',
value: _displayModel.team.salesVolume.toStringAsFixed(2),
onHelper: () {},
),
secondItem: _ItemClass(
title: '提成比例(%)',
value: _displayModel.team.ratio.toString(),
),
thirdItem: _ItemClass(
title: '预估收益(瑞币)',
value: _displayModel.team.amount.toStringAsFixed(2),
onHelper: () {},
),
show: _teamShow,
),
_buildItem(
onTap: () => CRoute.push(
context,
BenefitViewGen(type: UserBenefitPageType.RECOMMEND),
),
path: R.ASSETS_USER_PINK_GREAT_PNG,
title: '推荐收益',
firstItem: _ItemClass(
title: '团队销售额(元)',
value: _displayModel.recommend.salesVolume.toStringAsFixed(2),
onHelper: () {},
),
secondItem: _ItemClass(
title: '提成比例(%)',
value: _displayModel.recommend.ratio.toString(),
),
thirdItem: _ItemClass(
title: '预估收益(瑞币)',
value: _displayModel.recommend.amount.toStringAsFixed(2),
onHelper: () {},
),
show: _recommendShow,
),
_buildItem(
onTap: () => CRoute.push(
context,
BenefitViewGen(type: UserBenefitPageType.PLATFORM),
),
path: R.ASSETS_USER_PINK_PLATFORM_PNG,
title: '平台奖励',
firstItem: _ItemClass(
title: '团队销售额(元)',
value: _displayModel.reward.salesVolume.toStringAsFixed(2),
onHelper: () {},
),
secondItem: _ItemClass(
title: '提成比例(%)',
value: _displayModel.reward.ratio.toString(),
),
thirdItem: _ItemClass(
title: '预估收益(瑞币)',
value: _displayModel.reward.amount.toStringAsFixed(2),
onHelper: () {},
),
show: _rewardShow,
),
]..removeWhere((element) => element == null);
}
@override
void initState() {
super.initState();
_tabController = TabController(length: 4, vsync: this)
..addListener(() {
switch (_tabController.index) {
case 0:
_displayModel = _todayModel;
break;
case 1:
_displayModel = _yestodayModel;
break;
case 2:
_displayModel = _thisMonthModel;
break;
case 3:
_displayModel = _lastMonthModel;
break;
}
setState(() {});
});
getData();
}
@override
void dispose() {
_tabController?.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Color(0xFFF5F5F5),
appBar: AppBar(
leading: RecookBackButton(white: true),
backgroundColor: Color(0xFF16182B),
title: '我的收益'.text.make(),
centerTitle: true,
),
body: Stack(
children: [
CustomPaint(
painter: RoundBackgroundPainter(),
size: Size.fromHeight(197.rw),
),
ListView(
children: [
_buildCard(),
..._buildBottomItems(),
],
),
],
),
);
}
}
class _ItemClass {
String title;
String value;
VoidCallback onHelper;
_ItemClass({
@required this.title,
@required this.value,
this.onHelper,
});
}