Przeglądaj źródła

1.添加钱包明细页面

tags/0.0.2^2
杨华轩 4 lat temu
rodzic
commit
1d53b9ebad
10 zmienionych plików z 2020 dodań i 196 usunięć
  1. +26
    -186
      lib/pages/bil_detail_page/bil_detail_page.dart
  2. +3
    -2
      lib/pages/bil_detail_page/bil_detail_page_bloc.dart
  3. +1
    -0
      lib/pages/home_page/home_page.dart
  4. +13
    -1
      lib/register.dart
  5. +0
    -1
      lib/widgets/home/home_slide_banner/home_slide_banner.dart
  6. +3
    -6
      lib/widgets/wallet/wallet_bil/wallet_bil.dart
  7. +287
    -0
      lib/widgets/wallet_bil_detail/model/wallet_style_model.dart
  8. +918
    -0
      lib/widgets/wallet_bil_detail/wallet_bil_detail.dart
  9. +163
    -0
      lib/widgets/wallet_bil_detail/wallet_bil_detail_widget_bloc.dart
  10. +606
    -0
      lib/widgets/wallet_bil_detail/wallet_list_widget.dart

+ 26
- 186
lib/pages/bil_detail_page/bil_detail_page.dart Wyświetl plik

@@ -16,6 +16,7 @@ import 'package:zhiying_comm/util/custom_sliver_persistent_header_delegate.dart'
import 'package:zhiying_comm/zhiying_comm.dart';
import 'package:flutter_alibc/flutter_alibc.dart';

///钱包明细
class BilDetailPage extends StatefulWidget {
final Map<String, dynamic> data;

@@ -61,206 +62,45 @@ class _BilDetailPageContainerState extends State<BilDetailPageContainer> {
@override
void initState() {
_bloc = BlocProvider.of<BilDetailPageBloc>(context);
_bloc.loadData(widget.data[Constants.SkipIdentifierName]);
showDate = DateFormat('yyyy-MM').format(DateTime.now());
super.initState();
}

@override
Widget build(BuildContext context) {

return StreamBuilder(
stream: _bloc.outData,
builder: (context, sny) {
if (sny.data == null) {
return Container();
}
var model = sny.data;
return Scaffold(
appBar: AppBar(
centerTitle: true,
title: Text("明细"),
),
body: Container(
child: ListView(
shrinkWrap: true,
children: <Widget>[_buildType(), _buildBottomItem()],
),
),
child: Column(
children: _buildItem(model),
)),
);
},
);
}

_buildType() {
return Row(
children: <Widget>[
SizedBox(width: 12.5),
InkWell(
onTap: () {
///显示日期选择弹窗
_selectDate();
},
child: Padding(
padding: const EdgeInsets.only(top: 8, bottom: 8),
child: Text(showDate ?? ""),
),
),
Icon(Icons.arrow_drop_down),
Expanded(
child: Container(
height: 50,
child: ListView.builder(
scrollDirection: Axis.horizontal,
shrinkWrap: true,
itemCount: 3,
itemBuilder: (context, index) {
return InkWell(child: Container(
margin:
EdgeInsets.only(top: 10, left: 8, right: 8, bottom: 10),
decoration: BoxDecoration(
color: Colors.grey[200],
borderRadius: BorderRadius.circular(50)),
child: Padding(
padding: const EdgeInsets.only(left: 16, right: 16),
child: Center(
child: Text(
"推广",
style: TextStyle(color: Colors.grey),
)),
),
),onTap: () async {
print("ok");
await FlutterAlibc.loginTaoBao();
},);
}),
))
],
);
}

void _selectDate() async {
showDialog(context: context, builder: (context) => SelectDateYMDialog());
}

_buildBottomItem() {
return ListView.builder(
shrinkWrap: true, itemCount: 10, itemBuilder: _buildItem);
}

Widget _buildItem(BuildContext context, int index) {
return Container(
margin: EdgeInsets.only(left: 12.5, right: 12.5, bottom: 4, top: 4),
padding:
EdgeInsets.only(left: 25.w, right: 25.w, top: 20.h, bottom: 20.h),
child: Column(
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Row(
children: <Widget>[
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
color: Colors.red[100],
border: Border.all(color: Colors.red)),
child: Padding(
padding: const EdgeInsets.only(
left: 4, right: 4, top: 2, bottom: 2),
child: Center(
child: Text(
"自购",
style: TextStyle(color: Colors.red, fontSize: 20.sp),
),
),
),
),
Container(
width: 443.w,
margin: EdgeInsets.only(left: 15.w),
child: Text(
"Segway Ninebot mini Pro智能代的卅饭店发生的范德萨地方撒发生",
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(fontSize: 28.sp),
))
],
),
Row(
children: <Widget>[
Text(
"+",
style: TextStyle(color: Colors.red),
),
Text(
"¥8.00",
style: TextStyle(color: Colors.red, fontSize: 30.sp),
)
],
)
],
),
SizedBox(
height: 4,
),
Row(
children: <Widget>[
Text(
"订单编号:",
style: TextStyle(
color: HexColor.fromHex("#FF999999"), fontSize: 22.sp),
),
Text(
"1233333333",
style: TextStyle(
color: HexColor.fromHex("#FF999999"), fontSize: 22.sp),
),
SizedBox(
width: 28.w,
),
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
color: HexColor.fromHex("#FFF5F5F5"),
border: Border.all(color: HexColor.fromHex("#FFD6D6D6"))),
child: Padding(
padding:
EdgeInsets.only(left: 16, right: 16, top: 1, bottom: 1),
child: Text(
"复制",
style: TextStyle(
color: HexColor.fromHex("#FF999999"), fontSize: 22.sp),
),
),
)
],
),
Row(
children: <Widget>[
Text(
"订单编号:",
style: TextStyle(
color: HexColor.fromHex("#FF999999"), fontSize: 22.sp),
),
Text(
"1233333333",
style: TextStyle(
color: HexColor.fromHex("#FF999999"), fontSize: 22.sp),
),
],
),
Row(
children: <Widget>[
Text(
"订单编号:",
style: TextStyle(
color: HexColor.fromHex("#FF999999"), fontSize: 22.sp),
),
Text(
"1233333333",
style: TextStyle(
color: HexColor.fromHex("#FF999999"), fontSize: 22.sp),
),

],
)
],
),
);
///构建子模块
_buildItem(List<Map<String, dynamic>> model) {
List<Widget> list = List();
for (var item in model) {
WidgetModel widgetModel =
WidgetModel.fromJson(Map<String, dynamic>.from(item));
if (widgetModel.modName == 'my_wallet_detail') {
list.add(Expanded(
child: WidgetFactory.create(widgetModel.modName,
isSliver: false, model: item)[0]));
continue;
}
list.addAll(WidgetFactory.create(widgetModel.modName,
isSliver: false, model: item));
}
return list;
}
}

+ 3
- 2
lib/pages/bil_detail_page/bil_detail_page_bloc.dart Wyświetl plik

@@ -1,5 +1,6 @@
import 'dart:async';

import 'package:zhiying_base_widget/widgets/wallet_bil_detail/model/wallet_style_model.dart';
import 'package:zhiying_comm/util/base_bloc.dart';
import 'package:zhiying_comm/zhiying_comm.dart';

@@ -11,7 +12,7 @@ class BilDetailPageBloc extends BlocBase {

Stream<List<Map<String, dynamic>>> get outData => _tabController.stream;

BilDetailStyleModel bilDetailStyleModel;

@override
void dispose() {
@@ -21,7 +22,7 @@ class BilDetailPageBloc extends BlocBase {

loadData(String skipIdentifier) {

NetUtil.request('/api/v1/mod/${skipIdentifier}', method: NetMethod.GET,
NetUtil.request('/api/v1/mod/pub.flutter.my_wallet_detail', method: NetMethod.GET,
onCache: (data) {
_loadData(data);
}, onSuccess: (data) {


+ 1
- 0
lib/pages/home_page/home_page.dart Wyświetl plik

@@ -72,6 +72,7 @@ class _HomePageState extends State<HomePage> {
String selectedIcon = ImageUtil.getUrl(model.chooseIcon ?? model.icon);
String textColor = model.fontColor;
String chooseColor = model.chooseColor ?? textColor;

items.add(BottomNavigationBarItem(
icon: Container(
width: 24,


+ 13
- 1
lib/register.dart Wyświetl plik

@@ -1,6 +1,6 @@
import 'package:sharesdk_plugin/sharesdk_interface.dart';
import 'package:sharesdk_plugin/sharesdk_register.dart';
import 'package:zhiying_base_widget/pages/bil_detail_page/bil_detail_page.dart';
import 'package:zhiying_base_widget/pages/feedback_page/feedback_page.dart';
import 'package:zhiying_base_widget/pages/goods_details_page/goods_details_page.dart';
import 'package:zhiying_base_widget/pages/home_page/home_page.dart';
@@ -49,6 +49,7 @@ import 'package:zhiying_base_widget/widgets/wallet/wallet_bil/wallet_bil.dart';
import 'package:zhiying_base_widget/widgets/wallet/wallet_data/wallet_data.dart';
import 'package:zhiying_base_widget/widgets/wallet/wallet_detail/wallet_detail.dart';
import 'package:zhiying_base_widget/widgets/wallet/wallet_income/wallet_income.dart';
import 'package:zhiying_base_widget/widgets/wallet_bil_detail/wallet_bil_detail.dart';
import 'package:zhiying_comm/util/defalut_widget_creater.dart';
import 'package:zhiying_comm/zhiying_comm.dart';

@@ -155,12 +156,18 @@ class BaseWidgetRegister {
/// 消息中心
PageFactory.regist(
'pub.flutter.message_center', (model) => MessageNoticePage(model));
PageFactory.regist(
'pub.flutter.message_notice', (model) => MessageNoticePage(model));

/// TODO 首页的消息中心标识和我的页面不一致,需要改
PageFactory.regist(
'pub.flutter.message', (model) => MessageNoticePage(model));
/// 我的收藏
PageFactory.regist('pub.flutter.my_fav', (model) => FavoritesPage());


///钱包明细
PageFactory.regist('pub.flutter.my_bil', (model) => BilDetailPage(model));
}

// 注册控件
@@ -327,6 +334,11 @@ class BaseWidgetRegister {
'wallet_income', DefaultWidgetCreater((model) => WalletIncome()));

//======================= 账单明细
WidgetFactory.regist(
'my_wallet_detail',
DefaultWidgetCreater((model) => WalletBilDetail(
data: model,
)));

//======================== 热榜
WidgetFactory.regist('hot_rank_appbar',


+ 0
- 1
lib/widgets/home/home_slide_banner/home_slide_banner.dart Wyświetl plik

@@ -7,7 +7,6 @@ import 'package:provider/provider.dart';
import 'package:zhiying_base_widget/pages/main_page/notifier/main_page_bg_notifier.dart';
import 'package:zhiying_base_widget/pages/message_notice_page/message_notice_page.dart';
import 'package:zhiying_base_widget/pages/team_details_page/team_details_page.dart';
import 'package:zhiying_base_widget/pages/vip_center_page/vip_center_page.dart';
import 'package:zhiying_comm/zhiying_comm.dart';

import 'bloc/bloc.dart';


+ 3
- 6
lib/widgets/wallet/wallet_bil/wallet_bil.dart Wyświetl plik

@@ -3,6 +3,7 @@ import 'dart:convert';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:zhiying_base_widget/pages/bil_detail_page/bil_detail_page.dart';
import 'package:zhiying_base_widget/pages/wallet_page/wallet_detail_page.dart';
import 'package:zhiying_base_widget/widgets/wallet/wallet_bil/model/wallet_bli_model.dart';
import 'package:zhiying_base_widget/widgets/wallet/wallet_income/wallet_income_sk.dart';
@@ -24,12 +25,8 @@ class WalletBil extends StatelessWidget {
? WalletIncomeSkeleton()
: GestureDetector(
onTap: () {
Navigator.push(
context,
CupertinoPageRoute(
builder: (context) => WalletDetailPage(),
),
);
RouterUtil.route(
SkipModel.fromJson(json.decode(data['data'])), data, context);
},
child: Container(
decoration: BoxDecoration(


+ 287
- 0
lib/widgets/wallet_bil_detail/model/wallet_style_model.dart Wyświetl plik

@@ -0,0 +1,287 @@
class BilDetailStyleModel {
String appBarName;
String appBarNameColor;
String appBarBgImg;
String appBarBgColor;
String tabLineColor;
String tabNoSeletedColor;
String tabSeletedColor;
List<TabList> tabList;
String timeSelectColor;
String btnNoSelectedColor;
String btnSelectedColor;
List<InputTabViewBtns> inputTabViewBtns;
List<InputTabViewBtns> outTabViewBtns;
InputItemStyle inputItemStyle;
OutputItemStyle outputItemStyle;

BilDetailStyleModel(
{this.appBarName,
this.appBarNameColor,
this.appBarBgImg,
this.appBarBgColor,
this.tabLineColor,
this.tabNoSeletedColor,
this.tabSeletedColor,
this.tabList,
this.timeSelectColor,
this.btnNoSelectedColor,
this.btnSelectedColor,
this.inputTabViewBtns,
this.outTabViewBtns,
this.inputItemStyle,
this.outputItemStyle});

BilDetailStyleModel.fromJson(Map<String, dynamic> json) {
appBarName = json['app_bar_name'];
appBarNameColor = json['app_bar_name_color'];
appBarBgImg = json['app_bar_bg_img'];
appBarBgColor = json['app_bar_bg_color'];
tabLineColor = json['tab_line_color'];
tabNoSeletedColor = json['tab_no_seleted_color'];
tabSeletedColor = json['tab_seleted_color'];
if (json['tab_list'] != null) {
tabList = new List<TabList>();
json['tab_list'].forEach((v) {
tabList.add(new TabList.fromJson(v));
});
}
timeSelectColor = json['time_select_color'];
btnNoSelectedColor = json['btn_no_selected_color'];
btnSelectedColor = json['btn_selected_color'];
if (json['input_tab_view_btns'] != null) {
inputTabViewBtns = new List<InputTabViewBtns>();
json['input_tab_view_btns'].forEach((v) {
inputTabViewBtns.add(new InputTabViewBtns.fromJson(v));
});
}
if (json['out_tab_view_btns'] != null) {
outTabViewBtns = new List<InputTabViewBtns>();
json['out_tab_view_btns'].forEach((v) {
outTabViewBtns.add(new InputTabViewBtns.fromJson(v));
});
}
inputItemStyle = json['input_item_style'] != null
? new InputItemStyle.fromJson(json['input_item_style'])
: null;
outputItemStyle = json['output_item_style'] != null
? new OutputItemStyle.fromJson(json['output_item_style'])
: null;
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['app_bar_name'] = this.appBarName;
data['app_bar_name_color'] = this.appBarNameColor;
data['app_bar_bg_img'] = this.appBarBgImg;
data['app_bar_bg_color'] = this.appBarBgColor;
data['tab_line_color'] = this.tabLineColor;
data['tab_no_seleted_color'] = this.tabNoSeletedColor;
data['tab_seleted_color'] = this.tabSeletedColor;
if (this.tabList != null) {
data['tab_list'] = this.tabList.map((v) => v.toJson()).toList();
}
data['time_select_color'] = this.timeSelectColor;
data['btn_no_selected_color'] = this.btnNoSelectedColor;
data['btn_selected_color'] = this.btnSelectedColor;
if (this.inputTabViewBtns != null) {
data['input_tab_view_btns'] =
this.inputTabViewBtns.map((v) => v.toJson()).toList();
}
if (this.outTabViewBtns != null) {
data['out_tab_view_btns'] =
this.outTabViewBtns.map((v) => v.toJson()).toList();
}
if (this.inputItemStyle != null) {
data['input_item_style'] = this.inputItemStyle.toJson();
}
if (this.outputItemStyle != null) {
data['output_item_style'] = this.outputItemStyle.toJson();
}
return data;
}
}

class TabList {
String type;
String name;

TabList({this.type, this.name});

TabList.fromJson(Map<String, dynamic> json) {
type = json['type'];
name = json['name'];
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['type'] = this.type;
data['name'] = this.name;
return data;
}
}

class InputItemStyle {
String typeNameColor;
String titleColor;
String amountColor;
String contentColor;
String copyBtnText;
String copyBtnTextColor;
String copyBtnBgColor;
String orderIdText;
String orderTypeText;
String amountText;
String timeText;
String settleTimeText;
List<String> keys;

InputItemStyle(
{this.typeNameColor,
this.titleColor,
this.amountColor,
this.contentColor,
this.copyBtnText,
this.copyBtnTextColor,
this.copyBtnBgColor,
this.orderIdText,
this.orderTypeText,
this.amountText,
this.timeText,
this.settleTimeText,
this.keys});

InputItemStyle.fromJson(Map<String, dynamic> json) {
typeNameColor = json['type_name_color'];
titleColor = json['title_color'];
amountColor = json['amount_color'];
contentColor = json['content_color'];
copyBtnText = json['copy_btn_text'];
copyBtnTextColor = json['copy_btn_text_color'];
copyBtnBgColor = json['copy_btn_bg_color'];
orderIdText = json['order_id_text'];
orderTypeText = json['order_type_text'];
amountText = json['amount_text'];
timeText = json['time_text'];
settleTimeText = json['settle_time_text'];
keys = json['keys'].cast<String>();
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['type_name_color'] = this.typeNameColor;
data['title_color'] = this.titleColor;
data['amount_color'] = this.amountColor;
data['content_color'] = this.contentColor;
data['copy_btn_text'] = this.copyBtnText;
data['copy_btn_text_color'] = this.copyBtnTextColor;
data['copy_btn_bg_color'] = this.copyBtnBgColor;
data['order_id_text'] = this.orderIdText;
data['order_type_text'] = this.orderTypeText;
data['amount_text'] = this.amountText;
data['time_text'] = this.timeText;
data['settle_time_text'] = this.settleTimeText;
data['keys'] = this.keys;
return data;
}
}

class OutputItemStyle {
String typeNameColor;
String titleColor;
String amountColor;
String contentColor;
String copyBtnTextColor;
String copyBtnText;
String copyBtnBgColor;
String orderIdText;
String withdrawAccountText;
String withdrawAmountText;
String withdrawTimeText;
String withdrawOrderStatusText;
String consumeOrderTypeText;
String consumeAmountText;
String consumeTimeText;
List<String> withdrawKeys;
List<String> consumeKeys;

OutputItemStyle(
{this.typeNameColor,
this.titleColor,
this.amountColor,
this.contentColor,
this.copyBtnTextColor,
this.copyBtnBgColor,
this.orderIdText,
this.withdrawAccountText,
this.withdrawAmountText,
this.withdrawTimeText,
this.withdrawOrderStatusText,
this.consumeOrderTypeText,
this.consumeAmountText,
this.consumeTimeText,
this.withdrawKeys,
this.consumeKeys});

OutputItemStyle.fromJson(Map<String, dynamic> json) {
typeNameColor = json['type_name_color'];
titleColor = json['title_color'];
amountColor = json['amount_color'];
contentColor = json['content_color'];
copyBtnTextColor = json['copy_btn_text_color'];
copyBtnText=json['copy_btn_text'];
copyBtnBgColor = json['copy_btn_bg_color'];
orderIdText = json['order_id_text'];
withdrawAccountText = json['withdraw_account_text'];
withdrawAmountText = json['withdraw_amount_text'];
withdrawTimeText = json['withdraw_time_text'];
withdrawOrderStatusText = json['withdraw_order_status_text'];
consumeOrderTypeText = json['consume_order_type_text'];
consumeAmountText = json['consume_amount_text'];
consumeTimeText = json['consume_time_text'];
withdrawKeys = json['withdraw_keys'].cast<String>();
consumeKeys = json['consume_keys'].cast<String>();
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['type_name_color'] = this.typeNameColor;
data['title_color'] = this.titleColor;
data['amount_color'] = this.amountColor;
data['content_color'] = this.contentColor;
data['copy_btn_text_color'] = this.copyBtnTextColor;
data['copy_btn_bg_color'] = this.copyBtnBgColor;
data['order_id_text'] = this.orderIdText;
data['withdraw_account_text'] = this.withdrawAccountText;
data['withdraw_amount_text'] = this.withdrawAmountText;
data['withdraw_time_text'] = this.withdrawTimeText;
data['withdraw_order_status_text'] = this.withdrawOrderStatusText;
data['consume_order_type_text'] = this.consumeOrderTypeText;
data['consume_amount_text'] = this.consumeAmountText;
data['consume_time_text'] = this.consumeTimeText;
data['withdraw_keys'] = this.withdrawKeys;
data['consume_keys'] = this.consumeKeys;
return data;
}
}

class InputTabViewBtns {
String type;
String name;


InputTabViewBtns(
{this.type,this.name});

InputTabViewBtns.fromJson(Map<String, dynamic> json) {
type=json['type'];
name=json['name'];
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['name']=name;
data['type']=type;
return data;
}
}

+ 918
- 0
lib/widgets/wallet_bil_detail/wallet_bil_detail.dart Wyświetl plik

@@ -0,0 +1,918 @@
import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:intl/intl.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'package:zhiying_base_widget/dialog/select_date_ym_dialog/select_date_ym_dialog.dart';
import 'package:zhiying_base_widget/widgets/wallet/wallet_detail/wallet_detail_bloc.dart';
import 'package:zhiying_base_widget/widgets/wallet_bil_detail/wallet_bil_detail_widget_bloc.dart';
import 'package:zhiying_comm/util/base_bloc.dart';
import 'package:zhiying_comm/util/extension/color.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';

import 'model/wallet_style_model.dart';
import 'package:fluttertoast/fluttertoast.dart';

////钱包明细页面
class WalletBilDetail extends StatefulWidget {
final Map<String, dynamic> data;

const WalletBilDetail({Key key, this.data}) : super(key: key);

@override
_WalletBilDetailState createState() => _WalletBilDetailState();
}

class _WalletBilDetailState extends State<WalletBilDetail>
with TickerProviderStateMixin, AutomaticKeepAliveClientMixin {
WalletBilDetailWidgetBloc _bloc;

TabController _tabController;

@override
void initState() {
_bloc = WalletBilDetailWidgetBloc();
_bloc.initStyleData(json.decode(widget.data['data']));
_tabController =
TabController(length: _bloc.styleData.tabList.length, vsync: this);
_bloc.loadInputData(_bloc.inPutCurrentPage, _bloc.inputShowDate);
_bloc.loadOutputData(_bloc.outPutCurrentPage, _bloc.outputShowDate);

super.initState();
}

@override
Widget build(BuildContext context) {
return BlocProvider(
bloc: _bloc,
child: Container(
child: Column(
children: <Widget>[
AppBar(
brightness: Brightness.light,
backgroundColor:
HexColor.fromHex(_bloc.styleData.appBarBgColor),
centerTitle: true,
leading: IconButton(
icon: Icon(
Icons.arrow_back_ios,
size: 18,
color: HexColor.fromHex(_bloc.styleData.appBarNameColor),
),
onPressed: () {
Navigator.pop(context);
}),
title: Text(
_bloc.styleData.appBarName ?? "",
style: TextStyle(
color: HexColor.fromHex(_bloc.styleData.appBarNameColor)),
),
),
Container(
color: Colors.white,
child: TabBar(
controller: _tabController,
tabs: _buildTabBarItem(),
indicatorWeight: 3,
labelStyle: TextStyle(fontSize: 30.sp),
labelColor: HexColor.fromHex(_bloc.styleData.tabSeletedColor),
unselectedLabelColor:
HexColor.fromHex(_bloc.styleData.tabNoSeletedColor),
indicatorColor:
HexColor.fromHex(_bloc.styleData.tabLineColor),
indicatorSize: TabBarIndicatorSize.label,
),
),
Expanded(
child: TabBarView(
controller: _tabController,
children: _buildTabViewPage()))
],
),
));
}

///创建tabbar按键
_buildTabBarItem() {
List<Widget> listWidget = List();
for (var item in _bloc.styleData.tabList) {
listWidget.add(Tab(
text: item.name ?? "",
));
}
return listWidget;
}

_buildType(List<InputTabViewBtns> tabViewBtns, TabList tabList) {
var selectType;
if (tabList.type == 'input') {
selectType = _bloc.inputSelectType;
} else {
selectType = _bloc.outputSelectType;
;
}
return Row(
children: <Widget>[
SizedBox(width: 12.5),
InkWell(
onTap: () {
///显示日期选择弹窗
_selectDate(tabList);
},
child: Padding(
padding: const EdgeInsets.only(top: 8, bottom: 8),
child: Text(
tabList.type == "input"
? _bloc.inputShowDate
: _bloc.outputShowDate,
style: TextStyle(
fontSize: 28.sp,
color:
HexColor.fromHex(_bloc.styleData.timeSelectColor)))),
),
Icon(
Icons.arrow_drop_down,
color: HexColor.fromHex(_bloc.styleData.timeSelectColor),
),
Expanded(
child: Container(
height: 50,
child: ListView.builder(
scrollDirection: Axis.horizontal,
shrinkWrap: true,
itemCount: tabViewBtns.length,
itemBuilder: (context, index) {
return InkWell(
onTap: () async {
if (tabList.type == 'input') {
_bloc.inputSelectType = tabViewBtns[index].type;
_bloc.inPutCurrentPage=1;
_bloc.loadInputData(
_bloc.inPutCurrentPage, _bloc.inputShowDate,
type: _bloc.inputSelectType);
} else {
_bloc.outputSelectType = tabViewBtns[index].type;
_bloc.outPutCurrentPage=1;
_bloc.loadOutputData(
_bloc.outPutCurrentPage, _bloc.outputShowDate,
type: _bloc.outputSelectType);
}
_bloc.refresh();
},
child: Container(
margin: EdgeInsets.only(
top: 10, left: 8, right: 8, bottom: 10),
decoration: BoxDecoration(
border: Border.all(
color: HexColor.fromHex(
selectType == tabViewBtns[index].type
? _bloc.styleData.btnSelectedColor
: _bloc.styleData.btnNoSelectedColor),
),
borderRadius: BorderRadius.circular(50)),
child: Padding(
padding: EdgeInsets.only(left: 16, right: 16),
child: Center(
child: Text(
tabViewBtns[index].name ?? "",
style: TextStyle(
color: HexColor.fromHex(
selectType == tabViewBtns[index].type
? _bloc.styleData.btnSelectedColor
: _bloc.styleData.btnNoSelectedColor)),
)),
),
));
}),
))
],
);
}

_selectDate(TabList tabList) async {
var result = await showDialog(
context: context, builder: (context) => SelectDateYMDialog());
if (result != null) {
var dataTime = DateFormat('yyyy-MM').format(
DateTime(int.parse(result['year']), int.parse(result['month'])));
if (tabList.type == "input") {
_bloc.inputShowDate = dataTime;
_bloc.loadInputData(_bloc.inPutCurrentPage, _bloc.inputShowDate);
} else {
_bloc.outputShowDate = dataTime;
_bloc.loadOutputData(_bloc.outPutCurrentPage, _bloc.outputShowDate);
}
_bloc.refresh();
}
}

_buildBottomItem(TabList tabList) {
return ListView.builder(
shrinkWrap: true,
itemCount: tabList.type == 'input'
? _bloc.inputDataVM.length
: _bloc.outputDataVM.length,
itemBuilder: (context, index) {
return _buildItem(context, index, tabList);
});
}

Widget _buildItem(BuildContext context, int index, TabList tabList) {
if (tabList.type == 'input') {
InputItemStyle inputItemStyle = _bloc.styleData.inputItemStyle;
var modelItem = _bloc.inputDataVM[index];
return Container(
margin: EdgeInsets.only(left: 12.5, right: 12.5, bottom: 4, top: 4),
padding:
EdgeInsets.only(left: 25.w, right: 25.w, top: 20.h, bottom: 20.h),
decoration: BoxDecoration(
color: HexColor.fromHex("#FFFFFF"),
borderRadius: BorderRadius.circular(8)),
child: Column(
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Row(
children: <Widget>[
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
color: HexColor.fromHex("#FFFFF3F3"),
border: Border.all(
color: HexColor.fromHex(
inputItemStyle.typeNameColor))),
child: Padding(
padding: const EdgeInsets.only(
left: 4, right: 4, top: 2, bottom: 2),
child: Center(
child: Text(
modelItem['type'] ?? "",
style: TextStyle(
color: HexColor.fromHex(
inputItemStyle.typeNameColor),
fontSize: 20.sp),
),
),
),
),
Container(
width: 353.w,
margin: EdgeInsets.only(left: 15.w),
child: Text(
modelItem['title'] ?? "",
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(fontSize: 28.sp),
))
],
),
Row(
children: <Widget>[
Text(
"+ ",
style: TextStyle(
color: HexColor.fromHex(inputItemStyle.amountColor)),
),
Text(
"¥ " + modelItem['amount'],
style: TextStyle(
color: HexColor.fromHex(inputItemStyle.amountColor),
fontSize: 30.sp),
)
],
)
],
),
SizedBox(
height: 4,
),

///订单编号
Row(
children: <Widget>[
Text(
inputItemStyle.orderIdText,
style: TextStyle(
color: HexColor.fromHex(inputItemStyle.contentColor),
fontSize: 22.sp),
),
SizedBox(
width: 4,
),
Text(
modelItem['order_id'],
style: TextStyle(
color: HexColor.fromHex(inputItemStyle.contentColor),
fontSize: 22.sp),
),
SizedBox(
width: 28.w,
),
GestureDetector(
onTap: () {
Clipboard.setData(
ClipboardData(text: modelItem['order_id']));
Fluttertoast.showToast(msg: "已复制");
},
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
color: HexColor.fromHex(inputItemStyle.copyBtnBgColor),
border: Border.all(
color:
HexColor.fromHex(inputItemStyle.contentColor))),
child: Padding(
padding: EdgeInsets.only(
left: 16, right: 16, top: 1, bottom: 1),
child: Text(
inputItemStyle.copyBtnText,
style: TextStyle(
color:
HexColor.fromHex(inputItemStyle.contentColor),
fontSize: 22.sp),
),
),
),
)
],
),
SizedBox(
height: 4,
),
Row(
children: <Widget>[
Expanded(
child: Row(
children: <Widget>[
Text(
inputItemStyle.orderTypeText,
style: TextStyle(
color: HexColor.fromHex(inputItemStyle.contentColor),
fontSize: 22.sp),
),
SizedBox(
width: 4,
),
Text(
modelItem['order_type'] ?? "",
style: TextStyle(
color: HexColor.fromHex("#FF999999"),
fontSize: 22.sp),
),
],
)),
Expanded(
child: Row(
children: <Widget>[
Text(
inputItemStyle.amountText + " ¥" + modelItem['amount'],
style: TextStyle(
color: HexColor.fromHex(inputItemStyle.contentColor),
fontSize: 22.sp),
),
],
))
],
),
SizedBox(
height: 4,
),
Row(
children: <Widget>[
Expanded(
child: Row(
children: <Widget>[
Text(
inputItemStyle.timeText,
style: TextStyle(
color: HexColor.fromHex(inputItemStyle.contentColor),
fontSize: 22.sp),
),
SizedBox(
width: 4,
),
Text(
modelItem['time'] ?? "",
style: TextStyle(
color: HexColor.fromHex("#FF999999"),
fontSize: 22.sp),
),
],
)),
Expanded(
child: Row(
children: <Widget>[
Text(
inputItemStyle.settleTimeText +
" " +
modelItem['settle_time'] ??
"",
style: TextStyle(
color: HexColor.fromHex(inputItemStyle.contentColor),
fontSize: 22.sp),
),
],
))
],
),
],
),
);
} else if (tabList.type == 'output') {
OutputItemStyle outputItemStyle = _bloc.styleData.outputItemStyle;
var modelItem = _bloc.outputDataVM[index];
if (modelItem['type'] == '消费') {
///消费返回的Item
return Container(
margin: EdgeInsets.only(left: 12.5, right: 12.5, bottom: 4, top: 4),
padding:
EdgeInsets.only(left: 25.w, right: 25.w, top: 20.h, bottom: 20.h),
decoration: BoxDecoration(
color: HexColor.fromHex("#FFFFFF"),
borderRadius: BorderRadius.circular(8)),
child: Column(
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Row(
children: <Widget>[
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
color: HexColor.fromHex("#FFFFF3F3"),
border: Border.all(
color: HexColor.fromHex(
outputItemStyle.typeNameColor))),
child: Padding(
padding: const EdgeInsets.only(
left: 4, right: 4, top: 2, bottom: 2),
child: Center(
child: Text(
modelItem['type'] ?? "",
style: TextStyle(
color: HexColor.fromHex(
outputItemStyle.typeNameColor),
fontSize: 20.sp),
),
),
),
),
Container(
width: 353.w,
margin: EdgeInsets.only(left: 15.w),
child: Text(
modelItem['title'] ?? "",
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(fontSize: 28.sp),
))
],
),
Row(
children: <Widget>[
Text(
"- ",
style: TextStyle(
color:
HexColor.fromHex(outputItemStyle.amountColor)),
),
Text(
"¥ " + modelItem['amount'],
style: TextStyle(
color:
HexColor.fromHex(outputItemStyle.amountColor),
fontSize: 30.sp),
)
],
)
],
),
SizedBox(
height: 4,
),

///订单编号
Row(
children: <Widget>[
Text(
outputItemStyle.orderIdText,
style: TextStyle(
color: HexColor.fromHex(outputItemStyle.contentColor),
fontSize: 22.sp),
),
SizedBox(
width: 4,
),
Text(
modelItem['order_id'],
style: TextStyle(
color: HexColor.fromHex(outputItemStyle.contentColor),
fontSize: 22.sp),
),
SizedBox(
width: 28.w,
),
GestureDetector(
onTap: () {
Clipboard.setData(
ClipboardData(text: modelItem['order_id']));
Fluttertoast.showToast(msg: "已复制");
},
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
color: HexColor.fromHex(outputItemStyle.copyBtnBgColor),
border: Border.all(
color: HexColor.fromHex(
outputItemStyle.contentColor))),
child: Padding(
padding: EdgeInsets.only(
left: 16, right: 16, top: 1, bottom: 1),
child: Text(
outputItemStyle.copyBtnText ?? "",
style: TextStyle(
color:
HexColor.fromHex(outputItemStyle.contentColor),
fontSize: 22.sp),
),
),
),
)
],
),
SizedBox(
height: 4,
),
Row(
children: <Widget>[
Expanded(
child: Row(
children: <Widget>[
Text(
outputItemStyle.consumeOrderTypeText,
style: TextStyle(
color:
HexColor.fromHex(outputItemStyle.contentColor),
fontSize: 22.sp),
),
SizedBox(
width: 4,
),
Text(
modelItem['order_type'] ?? "",
style: TextStyle(
color: HexColor.fromHex("#FF999999"),
fontSize: 22.sp),
),
],
)),
Expanded(
child: Row(
children: <Widget>[
Text(
outputItemStyle.consumeAmountText +
" ¥" +
modelItem['amount'],
style: TextStyle(
color:
HexColor.fromHex(outputItemStyle.contentColor),
fontSize: 22.sp),
),
],
))
],
),
SizedBox(
height: 4,
),
Row(
children: <Widget>[
Expanded(
child: Row(
children: <Widget>[
Text(
outputItemStyle.consumeTimeText,
style: TextStyle(
color:
HexColor.fromHex(outputItemStyle.contentColor),
fontSize: 22.sp),
),
SizedBox(
width: 4,
),
Text(
modelItem['time'] ?? "",
style: TextStyle(
color: HexColor.fromHex("#FF999999"),
fontSize: 22.sp),
),
],
)),
// Expanded(
// child: Row(
// children: <Widget>[
// Text(
// inputItemStyle.consumeTimeText +
// " " +
// modelItem['settle_time'] ??
// "",
// style: TextStyle(
// color: HexColor.fromHex(inputItemStyle.contentColor),
// fontSize: 22.sp),
// ),
// ],
// ))
],
),
],
),
);
} else if (modelItem['type'] == '提现') {
return Container(
margin: EdgeInsets.only(left: 12.5, right: 12.5, bottom: 4, top: 4),
padding:
EdgeInsets.only(left: 25.w, right: 25.w, top: 20.h, bottom: 20.h),
decoration: BoxDecoration(
color: HexColor.fromHex("#FFFFFF"),
borderRadius: BorderRadius.circular(8)),
child: Column(
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Row(
children: <Widget>[
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
color: HexColor.fromHex("#FFFFF3F3"),
border: Border.all(
color: HexColor.fromHex(
outputItemStyle.typeNameColor))),
child: Padding(
padding: const EdgeInsets.only(
left: 4, right: 4, top: 2, bottom: 2),
child: Center(
child: Text(
modelItem['type'] ?? "",
style: TextStyle(
color: HexColor.fromHex(
outputItemStyle.typeNameColor),
fontSize: 20.sp),
),
),
),
),
Container(
width: 353.w,
margin: EdgeInsets.only(left: 15.w),
child: Text(
modelItem['title'] ?? "",
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(fontSize: 28.sp),
))
],
),
Row(
children: <Widget>[
Text(
"- ",
style: TextStyle(
color:
HexColor.fromHex(outputItemStyle.amountColor)),
),
Text(
"¥ " + modelItem['amount'],
style: TextStyle(
color:
HexColor.fromHex(outputItemStyle.amountColor),
fontSize: 30.sp),
)
],
)
],
),
SizedBox(
height: 4,
),

///订单编号
Row(
children: <Widget>[
Text(
outputItemStyle.orderIdText,
style: TextStyle(
color: HexColor.fromHex(outputItemStyle.contentColor),
fontSize: 22.sp),
),
SizedBox(
width: 4,
),
Text(
modelItem['order_id'],
style: TextStyle(
color: HexColor.fromHex(outputItemStyle.contentColor),
fontSize: 22.sp),
),
SizedBox(
width: 28.w,
),
GestureDetector(
onTap: () {
Clipboard.setData(
ClipboardData(text: modelItem['order_id']));
Fluttertoast.showToast(msg: "已复制");
},
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
color: HexColor.fromHex(outputItemStyle.copyBtnBgColor),
border: Border.all(
color: HexColor.fromHex(
outputItemStyle.contentColor))),
child: Padding(
padding: EdgeInsets.only(
left: 16, right: 16, top: 1, bottom: 1),
child: Text(
outputItemStyle.copyBtnText ?? "",
style: TextStyle(
color:
HexColor.fromHex(outputItemStyle.contentColor),
fontSize: 22.sp),
),
),
),
)
],
),
SizedBox(
height: 4,
),
Row(
children: <Widget>[
Expanded(
child: Row(
children: <Widget>[
Text(
outputItemStyle.withdrawAccountText,
style: TextStyle(
color:
HexColor.fromHex(outputItemStyle.contentColor),
fontSize: 22.sp),
),
SizedBox(
width: 4,
),
Text(
modelItem['account'] ?? "",
style: TextStyle(
color:
HexColor.fromHex(outputItemStyle.contentColor),
fontSize: 22.sp),
),
],
)),
Expanded(
child: Row(
children: <Widget>[
Text(
outputItemStyle.withdrawAmountText +
" ¥" +
modelItem['amount'],
style: TextStyle(
color:
HexColor.fromHex(outputItemStyle.contentColor),
fontSize: 22.sp),
),
],
))
],
),
SizedBox(
height: 4,
),
Row(
children: <Widget>[
Expanded(
child: Row(
children: <Widget>[
Text(
outputItemStyle.withdrawTimeText,
style: TextStyle(
color:
HexColor.fromHex(outputItemStyle.contentColor),
fontSize: 22.sp),
),
SizedBox(
width: 4,
),
Text(
modelItem['time'] ?? "",
style: TextStyle(
color: HexColor.fromHex("#FF999999"),
fontSize: 22.sp),
),
],
)),
Expanded(
child: Row(
children: <Widget>[
Text(
outputItemStyle.withdrawOrderStatusText +
" " +
modelItem['order_status'] ??
"",
style: TextStyle(
color:
HexColor.fromHex(outputItemStyle.contentColor),
fontSize: 22.sp),
),
],
))
],
),
],
),
);
}
}
}

_buildTabViewPage() {
List<Widget> listWidget = List();
for (var item in _bloc.styleData.tabList) {
List<InputTabViewBtns> tabViewBtns;

if (item.type == 'input') {
tabViewBtns = _bloc.styleData.inputTabViewBtns;
listWidget.add(StreamBuilder(
stream: _bloc.inputOutData,
builder: (context, asny) {
// dataVM = asny.data;

return Container(
child: Column(
children: <Widget>[
_buildType(tabViewBtns, item),
Expanded(
child: SmartRefresher(
controller: _bloc.inputRefreshController,
enablePullDown: true,
enablePullUp: true,
onLoading: () {
_bloc.inputLoad();
},
onRefresh: () {
_bloc.inputRefresh();
},
child: _bloc.inputDataVM == null
? Container()
: _buildBottomItem(item)),
)
],
),
);
}));
} else {
tabViewBtns = _bloc.styleData.outTabViewBtns;
listWidget.add(StreamBuilder(
stream: _bloc.outputOutData,
builder: (context, asny) {
// dataVM = asny.data;

return Container(
child: Column(
children: <Widget>[
_buildType(tabViewBtns, item),
Expanded(
child: SmartRefresher(
controller: _bloc.outputRefreshController,
enablePullDown: true,
enablePullUp: true,
onLoading: () {
_bloc.outputLoad();
},
onRefresh: () {
_bloc.outputRefresh();
},
child: _bloc.outputDataVM == null
? Container()
: _buildBottomItem(item)),
)
],
),
);
}));
}
}
return listWidget;
}

@override
// TODO: implement wantKeepAlive
bool get wantKeepAlive => true;
}

+ 163
- 0
lib/widgets/wallet_bil_detail/wallet_bil_detail_widget_bloc.dart Wyświetl plik

@@ -0,0 +1,163 @@
import 'dart:async';

import 'package:intl/intl.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'package:zhiying_comm/util/base_bloc.dart';
import 'package:zhiying_comm/zhiying_comm.dart';

import 'model/wallet_style_model.dart';

class WalletBilDetailWidgetBloc extends BlocBase {
StreamController<List<Map<String, dynamic>>> inputDataController =
StreamController.broadcast();

Stream get inputOutData => inputDataController.stream;

StreamController<List<Map<String, dynamic>>> outputDataController =
StreamController.broadcast();

Stream get outputOutData => outputDataController.stream;

List<Map<String, dynamic>> inputDataVM;
List<Map<String, dynamic>> outputDataVM;

///样式model
BilDetailStyleModel styleData;

///支出当前页数
int outPutCurrentPage = 1;

///收入当前页数
int inPutCurrentPage = 1;

///收入显示时间
String inputShowDate;

///支出显示时间
String outputShowDate;

//收入显示类型
String inputSelectType = 'all';

///支出显示类型
String outputSelectType = 'all';

///收入下啦刷新
RefreshController inputRefreshController = RefreshController();

///支出页面下拉刷新
RefreshController outputRefreshController = RefreshController();

@override
void dispose() {
inputDataController.close();
outputDataController.close();
inputRefreshController.dispose();
outputRefreshController.dispose();
}

initStyleData(Map<String, dynamic> data) {
try {
inputShowDate = DateFormat("yyyy-MM").format(DateTime.now());
outputShowDate = DateFormat("yyyy-MM").format(DateTime.now());
styleData = BilDetailStyleModel.fromJson(data);
} catch (e, s) {
print(e);
print(s);
}
}

///加载收入数据
loadInputData(int page, String date, {String type}) async {
type = inputSelectType;
String paramsStr = "?page=" + page.toString() + "&time=" + date;
if (type != null && type != "all") {
paramsStr += "&type=" + type;
}
NetUtil.request("/api/v1/user/wallet_detail/input" + paramsStr,
method: NetMethod.GET, onSuccess: (data) {
inputRefreshController.refreshCompleted();
inputRefreshController.loadComplete();
var listmap = List.from(data).map((e) {
return e as Map<String, dynamic>;
}).toList();
if (inputDataVM == null) {
inputDataVM = List<Map<String, dynamic>>();
}

if (listmap == null || listmap.length == 0) {
inputRefreshController.loadNoData();
}

if (inPutCurrentPage == 1) {
inputDataVM.clear();
inputDataVM.addAll(listmap);
} else {
inputDataVM.addAll(listmap);
}

refresh();
});
}

///加载支出数据
loadOutputData(int page, String date, {String type}) async {
type = outputSelectType;
String paramsStr = "?page=" + page.toString() + "&time=" + date;
if (type != null && type != "all") {
paramsStr += "&type=" + type;
}
NetUtil.request("/api/v1/user/wallet_detail/output" + paramsStr,
method: NetMethod.GET, onSuccess: (data) {
outputRefreshController.refreshCompleted();
outputRefreshController.loadComplete();

var listMap = List.from(data).map((e) {
return e as Map<String, dynamic>;
}).toList();

if (listMap == null || listMap.length == 0) {
outputRefreshController.loadNoData();
}
if (outputDataVM == null) {
outputDataVM = List();
}
if (outPutCurrentPage == 1) {
outputDataVM.clear();
outputDataVM.addAll(listMap);
} else {
outputDataVM.addAll(listMap);
}
refresh();
}, onError: (e) {
outputRefreshController.refreshCompleted();
outputRefreshController.loadComplete();
});
}

inputRefresh() {
inPutCurrentPage = 1;
loadInputData(inPutCurrentPage, inputShowDate);
}

inputLoad() {
inPutCurrentPage++;
loadInputData(inPutCurrentPage, inputShowDate);
}

outputRefresh() {
outPutCurrentPage = 1;
loadOutputData(outPutCurrentPage, outputShowDate);
}

outputLoad() {
outPutCurrentPage++;
loadOutputData(outPutCurrentPage, outputShowDate);
}

///全刷新
refresh() {
inputDataController.add(inputDataVM);
outputDataController.add(outputDataVM);
}
}

+ 606
- 0
lib/widgets/wallet_bil_detail/wallet_list_widget.dart Wyświetl plik

@@ -0,0 +1,606 @@
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'package:zhiying_base_widget/dialog/select_date_ym_dialog/select_date_ym_dialog.dart';
import 'package:zhiying_base_widget/widgets/wallet/wallet_detail/wallet_detail_bloc.dart';
import 'package:zhiying_base_widget/widgets/wallet_bil_detail/wallet_bil_detail_widget_bloc.dart';
import 'package:zhiying_comm/util/base_bloc.dart';
import 'package:zhiying_comm/zhiying_comm.dart';

import 'model/wallet_style_model.dart';

class WalletListWidget extends StatefulWidget {
final TabList tabList;
final List<InputTabViewBtns> tabViewBtns;
const WalletListWidget({Key key,this.tabViewBtns, this.tabList}) : super(key: key);
@override
_WalletListWidgetState createState() => _WalletListWidgetState();
}

class _WalletListWidgetState extends State<WalletListWidget> with AutomaticKeepAliveClientMixin {
WalletBilDetailWidgetBloc _bloc;
List<InputTabViewBtns> tabViewBtns;
TabList item;

@override
void initState() {
item=widget.tabList;
tabViewBtns=widget.tabViewBtns;
super.initState();
}

@override
Widget build(BuildContext context) {
_bloc = BlocProvider.of(context);
if(item.type=='input'){
return StreamBuilder(
stream: _bloc.inputOutData,
builder: (context, asny) {
// dataVM = asny.data;

return Container(
child: Column(
children: <Widget>[
_buildType(tabViewBtns, item),
Expanded(
child: SmartRefresher(
controller: _bloc.inputRefreshController,
enablePullDown: true,
enablePullUp: true,
onLoading: _bloc.outputLoad(),
onRefresh: _bloc.outputRefresh(),
child: _bloc.inputDataVM == null
? Container()
: _buildBottomItem(item)),
)
],
),
);
});
}else{
return StreamBuilder(
stream: _bloc.outputOutData,
builder: (context, asny) {
// dataVM = asny.data;

return Container(
child: Column(
children: <Widget>[
_buildType(tabViewBtns, item),
Expanded(
child: SmartRefresher(
controller: _bloc.outputRefreshController,
enablePullDown: true,
enablePullUp: true,
onLoading: _bloc.outputLoad(),
onRefresh: _bloc.outputRefresh(),
child: _bloc.outputDataVM == null
? Container()
: _buildBottomItem(item)),
)
],
),
);
});
}


}



_buildType(List<InputTabViewBtns> tabViewBtns, TabList tabList) {
var selectType;
if (tabList.type == 'input') {
selectType = _bloc.inputSelectType;
} else {
selectType = _bloc.outputSelectType;
;
}
return Row(
children: <Widget>[
SizedBox(width: 12.5),
InkWell(
onTap: () {
///显示日期选择弹窗
_selectDate(tabList);
},
child: Padding(
padding: const EdgeInsets.only(top: 8, bottom: 8),
child: Text(
tabList.type == "input"
? _bloc.inputShowDate
: _bloc.outputShowDate,
style: TextStyle(
fontSize: 28.sp,
color:
HexColor.fromHex(_bloc.styleData.timeSelectColor)))),
),
Icon(
Icons.arrow_drop_down,
color: HexColor.fromHex(_bloc.styleData.timeSelectColor),
),
Expanded(
child: Container(
height: 50,
child: ListView.builder(
scrollDirection: Axis.horizontal,
shrinkWrap: true,
itemCount: tabViewBtns.length,
itemBuilder: (context, index) {
return InkWell(
onTap: () async {
if (tabList.type == 'input') {
_bloc.inputSelectType = tabViewBtns[index].type;
_bloc.loadInputData(
_bloc.inPutCurrentPage, _bloc.inputShowDate,
type: _bloc.inputSelectType);
} else {
_bloc.outputSelectType = tabViewBtns[index].type;
_bloc.loadOutputData(
_bloc.outPutCurrentPage, _bloc.outputShowDate,
type: _bloc.outputSelectType);
}
_bloc.refresh();
},
child: Container(
margin: EdgeInsets.only(
top: 10, left: 8, right: 8, bottom: 10),
decoration: BoxDecoration(
border: Border.all(
color: HexColor.fromHex(
selectType == tabViewBtns[index].type
? _bloc.styleData.btnSelectedColor
: _bloc.styleData.btnNoSelectedColor),
),
borderRadius: BorderRadius.circular(50)),
child: Padding(
padding: EdgeInsets.only(left: 16, right: 16),
child: Center(
child: Text(
tabViewBtns[index].name ?? "",
style: TextStyle(
color: HexColor.fromHex(
selectType == tabViewBtns[index].type
? _bloc.styleData.btnSelectedColor
: _bloc.styleData.btnNoSelectedColor)),
)),
),
));
}),
))
],
);
}

_selectDate(TabList tabList) async {
var result = await showDialog(
context: context, builder: (context) => SelectDateYMDialog());
if (result != null) {
var dataTime = DateFormat('yyyy-MM').format(
DateTime(int.parse(result['year']), int.parse(result['month'])));
if (tabList.type == "input") {
_bloc.inputShowDate = dataTime;
_bloc.loadInputData(_bloc.inPutCurrentPage, _bloc.inputShowDate);
} else {
_bloc.outputShowDate = dataTime;
_bloc.loadInputData(_bloc.outPutCurrentPage, _bloc.outputShowDate);
}
_bloc.refresh();
}
}




_buildBottomItem(TabList tabList) {
return ListView.builder(
shrinkWrap: true,
itemCount: tabList.type == 'input'
? _bloc.inputDataVM?.length??0
: _bloc.outputDataVM?.length??0,
itemBuilder: (context, index) {
return _buildItem(context, index, tabList);
});
}

Widget _buildItem(BuildContext context, int index, TabList tabList) {
if (tabList.type == 'input') {
InputItemStyle inputItemStyle = _bloc.styleData.inputItemStyle;
var modelItem = _bloc.inputDataVM[index];
return Container(
margin: EdgeInsets.only(left: 12.5, right: 12.5, bottom: 4, top: 4),
padding:
EdgeInsets.only(left: 25.w, right: 25.w, top: 20.h, bottom: 20.h),
decoration: BoxDecoration(
color: HexColor.fromHex("#FFFFFF"),
borderRadius: BorderRadius.circular(8)),
child: Column(
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Row(
children: <Widget>[
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
color: HexColor.fromHex("#FFFFF3F3"),
border: Border.all(
color: HexColor.fromHex(
inputItemStyle.typeNameColor))),
child: Padding(
padding: const EdgeInsets.only(
left: 4, right: 4, top: 2, bottom: 2),
child: Center(
child: Text(
modelItem['type'] ?? "",
style: TextStyle(
color: HexColor.fromHex(
inputItemStyle.typeNameColor),
fontSize: 20.sp),
),
),
),
),
Container(
width: 353.w,
margin: EdgeInsets.only(left: 15.w),
child: Text(
modelItem['title'] ?? "",
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(fontSize: 28.sp),
))
],
),
Row(
children: <Widget>[
Text(
"+ ",
style: TextStyle(
color: HexColor.fromHex(inputItemStyle.amountColor)),
),
Text(
"¥ " + modelItem['amount'],
style: TextStyle(
color: HexColor.fromHex(inputItemStyle.amountColor),
fontSize: 30.sp),
)
],
)
],
),
SizedBox(
height: 4,
),

///订单编号
Row(
children: <Widget>[
Text(
inputItemStyle.orderIdText,
style: TextStyle(
color: HexColor.fromHex(inputItemStyle.contentColor),
fontSize: 22.sp),
),
SizedBox(
width: 4,
),
Text(
modelItem['order_id'],
style: TextStyle(
color: HexColor.fromHex(inputItemStyle.contentColor),
fontSize: 22.sp),
),
SizedBox(
width: 28.w,
),
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
color: HexColor.fromHex(inputItemStyle.copyBtnBgColor),
border: Border.all(
color:
HexColor.fromHex(inputItemStyle.contentColor))),
child: Padding(
padding:
EdgeInsets.only(left: 16, right: 16, top: 1, bottom: 1),
child: Text(
inputItemStyle.copyBtnText,
style: TextStyle(
color: HexColor.fromHex(inputItemStyle.contentColor),
fontSize: 22.sp),
),
),
)
],
),
SizedBox(
height: 4,
),
Row(
children: <Widget>[
Expanded(
child: Row(
children: <Widget>[
Text(
inputItemStyle.orderTypeText,
style: TextStyle(
color: HexColor.fromHex(inputItemStyle.contentColor),
fontSize: 22.sp),
),
SizedBox(
width: 4,
),
Text(
modelItem['order_type'] ?? "",
style: TextStyle(
color: HexColor.fromHex("#FF999999"),
fontSize: 22.sp),
),
],
)),
Expanded(
child: Row(
children: <Widget>[
Text(
inputItemStyle.amountText + " ¥" + modelItem['amount'],
style: TextStyle(
color: HexColor.fromHex(inputItemStyle.contentColor),
fontSize: 22.sp),
),
],
))
],
),
SizedBox(
height: 4,
),
Row(
children: <Widget>[
Expanded(
child: Row(
children: <Widget>[
Text(
inputItemStyle.timeText,
style: TextStyle(
color: HexColor.fromHex(inputItemStyle.contentColor),
fontSize: 22.sp),
),
SizedBox(
width: 4,
),
Text(
modelItem['time'] ?? "",
style: TextStyle(
color: HexColor.fromHex("#FF999999"),
fontSize: 22.sp),
),
],
)),
Expanded(
child: Row(
children: <Widget>[
Text(
inputItemStyle.settleTimeText +
" " +
modelItem['settle_time'] ??
"",
style: TextStyle(
color: HexColor.fromHex(inputItemStyle.contentColor),
fontSize: 22.sp),
),
],
))
],
),
],
),
);
} else if (tabList.type == 'output') {
OutputItemStyle inputItemStyle = _bloc.styleData.outputItemStyle;
var modelItem = _bloc.outputDataVM[index];
if (modelItem['type'] == '消费') {
///消费返回的Item
return Container(
margin: EdgeInsets.only(left: 12.5, right: 12.5, bottom: 4, top: 4),
padding:
EdgeInsets.only(left: 25.w, right: 25.w, top: 20.h, bottom: 20.h),
decoration: BoxDecoration(
color: HexColor.fromHex("#FFFFFF"),
borderRadius: BorderRadius.circular(8)),
child: Column(
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Row(
children: <Widget>[
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
color: HexColor.fromHex("#FFFFF3F3"),
border: Border.all(
color: HexColor.fromHex(
inputItemStyle.typeNameColor))),
child: Padding(
padding: const EdgeInsets.only(
left: 4, right: 4, top: 2, bottom: 2),
child: Center(
child: Text(
modelItem['type'] ?? "",
style: TextStyle(
color: HexColor.fromHex(
inputItemStyle.typeNameColor),
fontSize: 20.sp),
),
),
),
),
Container(
width: 353.w,
margin: EdgeInsets.only(left: 15.w),
child: Text(
modelItem['title'] ?? "",
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(fontSize: 28.sp),
))
],
),
Row(
children: <Widget>[
Text(
"- ",
style: TextStyle(color: Colors.red),
),
Text(
"¥ " + modelItem['amount'],
style: TextStyle(color: Colors.red, fontSize: 30.sp),
)
],
)
],
),
SizedBox(
height: 4,
),

///订单编号
Row(
children: <Widget>[
Text(
inputItemStyle.orderIdText,
style: TextStyle(
color: HexColor.fromHex(inputItemStyle.contentColor),
fontSize: 22.sp),
),
SizedBox(
width: 4,
),
Text(
modelItem['order_id'],
style: TextStyle(
color: HexColor.fromHex(inputItemStyle.contentColor),
fontSize: 22.sp),
),
SizedBox(
width: 28.w,
),
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
color: HexColor.fromHex(inputItemStyle.copyBtnBgColor),
border: Border.all(
color:
HexColor.fromHex(inputItemStyle.contentColor))),
child: Padding(
padding: EdgeInsets.only(
left: 16, right: 16, top: 1, bottom: 1),
child: Text(
inputItemStyle.copyBtnText ?? "",
style: TextStyle(
color:
HexColor.fromHex(inputItemStyle.contentColor),
fontSize: 22.sp),
),
),
)
],
),
SizedBox(
height: 4,
),
Row(
children: <Widget>[
Expanded(
child: Row(
children: <Widget>[
Text(
inputItemStyle.consumeOrderTypeText,
style: TextStyle(
color:
HexColor.fromHex(inputItemStyle.contentColor),
fontSize: 22.sp),
),
SizedBox(
width: 4,
),
Text(
modelItem['order_type'] ?? "",
style: TextStyle(
color: HexColor.fromHex("#FF999999"),
fontSize: 22.sp),
),
],
)),
Expanded(
child: Row(
children: <Widget>[
Text(
inputItemStyle.consumeAmountText +
" ¥" +
modelItem['amount'],
style: TextStyle(
color:
HexColor.fromHex(inputItemStyle.contentColor),
fontSize: 22.sp),
),
],
))
],
),
SizedBox(
height: 4,
),
Row(
children: <Widget>[
Expanded(
child: Row(
children: <Widget>[
Text(
inputItemStyle.consumeTimeText,
style: TextStyle(
color:
HexColor.fromHex(inputItemStyle.contentColor),
fontSize: 22.sp),
),
SizedBox(
width: 4,
),
Text(
modelItem['time'] ?? "",
style: TextStyle(
color: HexColor.fromHex("#FF999999"),
fontSize: 22.sp),
),
],
)),
// Expanded(
// child: Row(
// children: <Widget>[
// Text(
// inputItemStyle.consumeTimeText +
// " " +
// modelItem['settle_time'] ??
// "",
// style: TextStyle(
// color: HexColor.fromHex(inputItemStyle.contentColor),
// fontSize: 22.sp),
// ),
// ],
// ))
],
),
],
),
);
} else {}
}
}

@override
// TODO: implement wantKeepAlive
bool get wantKeepAlive => true;
}

Ładowanie…
Anuluj
Zapisz