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.

623 lines
20 KiB

import 'package:flutter/material.dart';
import 'package:recook/base/base_store_state.dart';
import 'package:recook/constants/api.dart';
import 'package:recook/constants/header.dart';
import 'package:recook/manager/http_manager.dart';
import 'package:recook/manager/user_manager.dart';
import 'package:recook/models/rui_coin_list_model.dart';
import 'package:recook/pages/user/rui_transfer_to_balance_page.dart';
import 'package:recook/widgets/bottom_time_picker.dart';
import 'package:recook/widgets/custom_app_bar.dart';
import 'package:recook/widgets/custom_image_button.dart';
import 'package:recook/widgets/refresh_widget.dart';
class RuiCoinPage extends StatefulWidget {
@override
_RuiCoinPageState createState() => _RuiCoinPageState();
}
class ClassifyType {
final String name;
final String sortType;
final int index;
bool isSelect;
ClassifyType(
{this.isSelect = false,
this.name = "",
this.sortType = "",
this.index = 0});
}
class _RuiCoinPageState extends BaseStoreState<RuiCoinPage> {
RuiCoinListModel _listModel;
List<CoinList> _cellModelList;
GSRefreshController _refreshController;
bool _openFilter = false;
DateTime _selectDateTime;
String _selectDateString;
List<ClassifyType> _typeList = [
ClassifyType(name: '全部', sortType: "", isSelect: true),
ClassifyType(name: '消费', sortType: "purchase"),
ClassifyType(name: '转出', sortType: "transfer"),
ClassifyType(name: '导购收益', sortType: "share"),
ClassifyType(name: '自购收益', sortType: "shopping"),
ClassifyType(name: '自营补贴', sortType: "team"),
ClassifyType(name: '分销补贴', sortType: "recommend"),
ClassifyType(name: '代理补贴', sortType: "reward"),
ClassifyType(name: '瑞币退回', sortType: "coin_refund"),
];
ClassifyType _selectType;
@override
void initState() {
super.initState();
_selectType = _typeList[0];
_selectDateTime = DateTime.now();
_selectDateString = _getDateString(_selectDateTime);
_refreshController = GSRefreshController(initialRefresh: false);
_getCoinList();
_cellModelList = [];
}
@override
Widget buildContext(BuildContext context, {store}) {
return Scaffold(
appBar: CustomAppBar(
actions: AppConfig.getShowCommission()
? <Widget>[_listModel == null ? Container() : _goToBalance()]
: [],
appBackground: Colors.white,
elevation: 0,
title: "我的瑞币",
themeData: AppThemes.themeDataGrey.appBarTheme,
background: Colors.white,
),
body: _listModel == null
? loadingView()
: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
_headInfoWidget(),
Expanded(
child: Stack(
children: <Widget>[
RefreshWidget(
headerTriggerDistance: rSize(80),
color: Colors.black,
controller: _refreshController,
releaseText: "松开更新数据",
idleText: "下拉更新数据",
refreshingText: "正在更新数据...",
onRefresh: () {
_getCoinList();
},
body: _cellModelList != null &&
_cellModelList.length > 0
? ListView.builder(
itemCount: _cellModelList.length,
itemBuilder: (BuildContext context, int index) {
return _itemWidget(_cellModelList[index]);
},
)
: noDataView("没有数据..."),
),
_openFilter
? _filterWidget()
: Container(
width: 0,
height: 0,
),
],
),
),
],
),
);
}
_itemWidget(CoinList coinList) {
return Container(
padding: EdgeInsets.only(left: 15),
width: double.infinity,
height: 60,
color: Colors.white,
child: Column(
children: <Widget>[
Expanded(
child: Container(
width: double.infinity,
margin: EdgeInsets.only(right: 30),
child: Flex(
direction: Axis.horizontal,
children: <Widget>[
Flex(
direction: Axis.vertical,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
coinList.typeName,
style: TextStyle(
color: Colors.black,
fontWeight: FontWeight.w300,
fontSize: 13),
),
Container(
height: 3,
),
Text(
coinList.userCoin.createdAt,
style: TextStyle(
color: Colors.black,
fontWeight: FontWeight.w300,
fontSize: 12),
),
],
),
Spacer(),
Text(
coinList.userCoin.coinNum > 0
? "+${coinList.userCoin.coinNum}"
: coinList.userCoin.coinNum.toString(),
style: TextStyle(color: Colors.black, fontSize: 14),
),
],
),
)),
Container(
height: 1,
color: AppColor.frenchColor,
)
],
),
);
}
_goToBalance() {
return Container(
margin: EdgeInsets.only(right: 10),
child: CustomImageButton(
icon: Image.asset(
"assets/rui_page_balance.png",
width: 13,
height: 13,
),
title: " 转到余额",
style: TextStyle(color: Colors.black, fontSize: 13),
direction: Direction.horizontal,
onPressed: () {
AppRouter.push(context, RouteName.RUI_TRANSFER_BALANCE_PAGE,
arguments: RuiCoinTransferToBalancePage.setArguments(
_listModel.data.total));
},
),
);
}
_headInfoWidget() {
return Container(
height: 110 + 50.0,
width: double.infinity,
child: Column(
children: <Widget>[
Container(
height: 110,
width: double.infinity,
padding: EdgeInsets.symmetric(horizontal: 15),
child: Flex(
direction: Axis.horizontal,
children: <Widget>[
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
"总瑞币",
style: TextStyle(
color: Colors.black,
fontSize: 14,
fontWeight: FontWeight.w300),
),
Container(
height: 5,
),
Text(
'¥${_listModel.data.total.toStringAsFixed(2)}',
style: TextStyle(
color: Color(0xffd40000),
fontSize: 29,
fontWeight: FontWeight.w500),
),
],
),
),
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
"累计收益",
style: TextStyle(
color: Colors.black,
fontSize: 14,
fontWeight: FontWeight.w300),
),
Container(
height: 5,
),
Text(
'¥${_listModel.data.history.toStringAsFixed(2)}',
style: TextStyle(
color: Colors.black,
fontWeight: FontWeight.w500,
fontSize: 29),
),
],
),
),
],
),
),
Container(
height: 50,
width: double.infinity,
color: Color(0xfff5f5f5),
padding: EdgeInsets.symmetric(horizontal: 15),
child: Row(
children: <Widget>[
GestureDetector(
onTap: () {
_openFilter = !_openFilter;
setState(() {});
},
child: _selectWidget(
_selectType.name,
),
),
Spacer(),
GestureDetector(
onTap: () {
_showTimePickerBottomSheet();
},
child: _selectWidget(
_selectDateString,
),
),
],
),
),
],
),
);
}
_selectWidget(
String title,
) {
return Container(
height: 32.0,
padding: EdgeInsets.symmetric(horizontal: 15),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(16),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
title,
style: TextStyle(color: Colors.black, fontSize: 13),
),
Container(
width: 0,
),
Icon(
Icons.arrow_drop_down,
size: 20,
color: Color(0xff8f8f8f),
),
],
),
);
}
_filterWidget() {
List<Widget> choiceChipList = [];
for (ClassifyType type in _typeList) {
choiceChipList.add(GestureDetector(
child: Container(
height: 37,
width: (MediaQuery.of(context).size.width - 30 - 20) / 3,
color: type.isSelect ? Color(0xffFFDDDD) : Color(0xfff5f5f5),
alignment: Alignment.center,
child: Text(
type.name,
style: TextStyle(
color: type.isSelect ? Color(0xffFF5B5B) : Colors.black,
fontSize: 14),
)),
onTap: () {
for (ClassifyType subType in _typeList) {
subType.isSelect = false;
}
type.isSelect = true;
_selectType = type;
_openFilter = false;
setState(() {});
_refreshController.requestRefresh();
},
));
}
Container con = Container(
width: double.infinity,
height: double.infinity,
color: Colors.black.withAlpha(100),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
Container(
color: Colors.white,
padding: EdgeInsets.symmetric(horizontal: 15, vertical: 10),
child: Wrap(
spacing: 10,
runSpacing: 10,
children: choiceChipList,
),
),
],
),
);
return GestureDetector(
child: con,
onTap: () {
_openFilter = !_openFilter;
setState(() {});
},
);
}
_showTimePickerBottomSheet() {
showModalBottomSheet(
isScrollControlled: false,
context: context,
builder: (BuildContext context) {
return SizedBox(
height: 350 + MediaQuery.of(context).padding.bottom,
child: BottomTimePicker(
timePickerTypes: [BottomTimePickerType.BottomTimePickerMonth],
cancle: () {
Navigator.maybePop(context);
},
submit: (time, type) {
Navigator.maybePop(context);
_selectDateTime = time;
_selectDateString = _getDateString(_selectDateTime);
setState(() {});
_refreshController.requestRefresh();
},
));
},
).then((val) {
if (mounted) {}
});
}
_getDateString(DateTime dateTime) {
return '${dateTime.year}-${dateTime.month.toString().padLeft(2, '0')}';
}
_getCoinList() async {
ResultData resultData = await HttpManager.post(UserApi.rui_coin_list, {
"userId": UserManager.instance.user.info.id,
"date": _getDateString(_selectDateTime),
"coinType": _selectType != null ? _selectType.sortType : ""
});
if (!resultData.result) {
showError(resultData.msg);
_refreshController.refreshCompleted();
return;
}
RuiCoinListModel model = RuiCoinListModel.fromJson(resultData.data);
if (model.code != HttpStatus.SUCCESS) {
showError(model.msg);
_refreshController.refreshCompleted();
return;
}
_listModel = model;
_cellModelList = model.data.list;
setState(() {});
_refreshController.refreshCompleted();
}
// // 无用
// List<Widget> _headerSliverBuilder(context, isScrolled) {
// return <Widget>[
// SliverAppBar(
// title: Text(
// "我的瑞币",
// style: TextStyle(fontSize: rSize(18)),
// ),
// centerTitle: true,
// leading: IconButton(
// icon: Icon(
// AppIcons.icon_back,
// size: 17,
// color: Colors.white,
// ),
// onPressed: () {
// Navigator.maybePop(context);
// }),
// pinned: true,
// forceElevated: false,
// backgroundColor: AppColor.rgbColor(246, 113, 120),
// actions: <Widget>[IconButton(icon: Icon(Icons.history), onPressed: () {})],
// expandedHeight: rSize(260),
// flexibleSpace: _flexibleSpaceBar(),
// bottom: PreferredSize(
// child: Container(
// height: rSize(48),
// width: double.infinity,
// color: Colors.white,
// child: Center(
// child: Text(
// "瑞币收支明细",
// style: AppTextStyle.generate(ScreenAdapterUtils.setSp(16), color: Colors.black),
// ),
// ),
// ),
// preferredSize: Size.fromHeight(48),
// ),
// ),
// ];
// }
// FlexibleSpaceBar _flexibleSpaceBar() {
// return FlexibleSpaceBar(
// background: Stack(
// alignment: AlignmentDirectional.center,
// children: <Widget>[
// Container(
// height: double.infinity,
// decoration: BoxDecoration(
// gradient: LinearGradient(colors: [
// AppColor.rgbColor(246, 106, 136),
// AppColor.rgbColor(246, 118, 108),
// ])),
// ),
// Container(
// alignment: Alignment.center,
// // width: rSize(100),
// height: rSize(100),
// // padding: EdgeInsets.all(rSize(20)),
// // decoration: BoxDecoration(
// // color: AppColor.rgbColor(255, 255, 255, a: 70),
// // borderRadius: BorderRadius.all(Radius.circular(100))),
// child: RichText(
// textAlign: TextAlign.center,
// text: TextSpan(
// text: _coinModel == null ? "- -" : _coinModel.data.amount.toInt().toString(),
// style: AppTextStyle.generate(ScreenAdapterUtils.setSp(25), color: Colors.white),
// children: [
// TextSpan(
// text: "\n瑞币",
// style: AppTextStyle.generate(ScreenAdapterUtils.setSp(13),
// color: Colors.white))
// ]),
// ),
// )
// ],
// ),
// );
// }
// _list() {
// return RefreshWidget(
// controller: _controller,
// onRefresh: () {
// _page = 0;
// _getData(_page);
// },
// onLoadMore: () {
// _page++;
// _getData(_page, lastId: _data.last.id);
// },
// body: _data == null
// ? noDataView("您还没有产生收益")
// : ListView.builder(
// itemCount: _data.length,
// itemBuilder: (_, index) {
// Detail detail = _data[index];
// bool isAdd = detail.type == 0;
// return Container(
// padding: EdgeInsets.all(rSize(10)),
// decoration: BoxDecoration(
// color: Colors.white,
// border: Border(
// bottom: BorderSide(
// color: Colors.grey[300], width: ScreenAdapterUtils.setWidth(0.6)))),
// child: Row(
// children: <Widget>[
// Expanded(
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: <Widget>[
// Text(
// detail.title,
// style: AppTextStyle.generate(ScreenAdapterUtils.setSp(15)),
// ),
// SizedBox(height: rSize(2),),
// Text(
// detail.channel,
// style: AppTextStyle.generate(ScreenAdapterUtils.setSp(13),color: Colors.grey[600]),
// ),
// SizedBox(height: rSize(2),),
// Text(
// detail.createdAt,
// style: AppTextStyle.generate(ScreenAdapterUtils.setSp(12),color: Colors.grey),
// ),
// ],
// ),
// ),
// Text(
// "${isAdd ? "+" : "-"}${detail.number}",
// style: AppTextStyle.generate(ScreenAdapterUtils.setSp(20),
// color: isAdd ? Colors.red : Colors.green),
// ),
// ],
// ),
// );
// }),
// );
// }
// _getData(int page, {int lastId}) async {
// ResultData resultData = await HttpManager.post(
// UserApi.rui_coin_list, {"userId": UserManager.instance.user.info.id, "lastId": lastId ?? 0});
// if (!resultData.result) {
// showError(resultData.msg);
// _endRefresh(false, null);
// return;
// }
// RuiCoinListModel model = RuiCoinListModel.fromJson(resultData.data);
// if (model.code != HttpStatus.SUCCESS) {
// showError(model.msg);
// _endRefresh(false, null);
// return;
// }
// _endRefresh(true, model);
// }
// _endRefresh(bool success, RuiCoinListModel model) {
// if (!success) {
// if (_page == 0) {
// _controller.refreshCompleted();
// } else {
// _controller.loadComplete();
// _page--;
// }
// return;
// }
// _coinModel = model;
// if (_page == 0) {
// _controller.refreshCompleted();
// _data = _coinModel.data.detail;
// setState(() {});
// } else {
// if (_coinModel.data.detail.length == 0) {
// _controller.loadNoData();
// return;
// }
// _controller.loadComplete();
// _data.addAll(_coinModel.data.detail);
// _page++;
// setState(() {});
// }
// }
}