소스 검색

更新订单样式

tags/0.0.1
Weller 4 년 전
부모
커밋
7811254370
13개의 변경된 파일874개의 추가작업 그리고 197개의 파일을 삭제
  1. +1
    -1
      .dart_tool/package_config.json
  2. +11
    -10
      lib/pages/orders_page/bloc/order_content_bloc.dart
  3. +50
    -0
      lib/pages/orders_page/bloc/order_page_bloc.dart
  4. +1
    -5
      lib/pages/orders_page/models/order_filter_model.dart
  5. +86
    -22
      lib/pages/orders_page/models/order_model.dart
  6. +157
    -0
      lib/pages/orders_page/models/order_page_item_style_model.dart
  7. +176
    -0
      lib/pages/orders_page/models/order_page_style_model.dart
  8. +15
    -5
      lib/pages/orders_page/order_content_page.dart
  9. +81
    -69
      lib/pages/orders_page/orders_page.dart
  10. +135
    -24
      lib/pages/orders_page/views/order_filter.dart
  11. +121
    -29
      lib/pages/orders_page/views/order_item_widget.dart
  12. +26
    -7
      lib/pages/orders_page/views/order_serch_widget.dart
  13. +14
    -25
      lib/pages/orders_page/views/order_tabbar_widget.dart

+ 1
- 1
.dart_tool/package_config.json 파일 보기

@@ -620,7 +620,7 @@
"languageVersion": "2.8"
}
],
"generated": "2020-10-22T02:18:13.447793Z",
"generated": "2020-10-23T06:24:35.938865Z",
"generator": "pub",
"generatorVersion": "2.8.2"
}

+ 11
- 10
lib/pages/orders_page/bloc/order_content_bloc.dart 파일 보기

@@ -19,9 +19,10 @@ class OrderContentBloc extends BlocBase {
_ordersController = null;
}

void loadData(OrderFilterModel filter) {
void loadData(String state, OrderFilterModel filter) {
Map<String, dynamic> params = filter.toJson();
params.removeWhere((key, value) => value == null || value == '');
params['state'] = state;
NetUtil.request('/api/v1/order', method: NetMethod.POST, params: params,
onCache: (data) {
_loadData(data);
@@ -33,15 +34,15 @@ class OrderContentBloc extends BlocBase {
void _loadData(dynamic data) {
List list = data ?? [];

OrderModel model = OrderModel();
model.itemId = '6918577752399759376';
model.imgUrl =
'https://t7.baidu.com/it/u=3616242789,1098670747&fm=79&app=86&size=h300&n=0&g=4n&f=jpeg?sec=1603444938&t=04aeb23595ac79d419be19ab92bea668';
model.title = '乐町百褶半身裙秋冬女2019新款复古麻花半身裙甜美百褶半身裙';
model.price = '108';
model.commission = '0';
model.commissionRate = '9.2';
_orders.add(model);
// OrderModel model = OrderModel();
// model.itemId = '6918577752399759376';
// model.imgUrl =
// 'https://t7.baidu.com/it/u=3616242789,1098670747&fm=79&app=86&size=h300&n=0&g=4n&f=jpeg?sec=1603444938&t=04aeb23595ac79d419be19ab92bea668';
// model.title = '乐町百褶半身裙秋冬女2019新款复古麻花半身裙甜美百褶半身裙';
// model.price = '108';
// model.commission = '0';
// model.commissionRate = '9.2';
// _orders.add(model);

_orders.addAll(list.map((item) {
return OrderModel.fromJson(Map<String, dynamic>.from(item));


+ 50
- 0
lib/pages/orders_page/bloc/order_page_bloc.dart 파일 보기

@@ -0,0 +1,50 @@
import 'dart:async';
import 'dart:convert' as convert;

import 'package:zhiying_base_widget/pages/orders_page/models/order_page_style_model.dart';
import 'package:zhiying_comm/util/base_bloc.dart';
import 'package:zhiying_comm/zhiying_comm.dart';

class OrderPageBloc extends BlocBase {
OrderPageStyleModel _style;

StreamController<OrderPageStyleModel> _styleController =
StreamController<OrderPageStyleModel>();

Stream<OrderPageStyleModel> get outData => _styleController.stream;

@override
void dispose() {
_styleController.close();
_styleController = null;
}

void loadData(String skipIdentifier) async {
NetUtil.request('/api/v1/mod/${skipIdentifier.toString()}',
method: NetMethod.GET, onCache: (data) {
_loadData(data);
}, onSuccess: (data) {
_loadData(data);
});
}

void _loadData(dynamic data) {
try {
Map<String, dynamic> json = Map<String, dynamic>.from(data);
if (json == null || json.length == 0) {
return;
}
List mods = json['mod_list'];
if (mods.first != null) {
json = Map<String, dynamic>.from(mods.first);
String d = json['data'];
Map<String, dynamic> da =
Map<String, dynamic>.from(convert.jsonDecode(d));
_style = OrderPageStyleModel.fromJson(da);
_styleController.add(_style);
}
} catch (err) {
Logger.error(err);
}
}
}

+ 1
- 5
lib/pages/orders_page/models/order_filter_model.dart 파일 보기

@@ -1,6 +1,5 @@
// 订单筛选条件
class OrderFilterModel {
String state;
String keyword;
String startTime;
String endTime;
@@ -10,8 +9,7 @@ class OrderFilterModel {
String pageSize;

OrderFilterModel(
{this.state,
this.keyword,
{this.keyword,
this.startTime,
this.endTime,
this.type,
@@ -20,7 +18,6 @@ class OrderFilterModel {
this.pageSize});

OrderFilterModel.fromJson(Map<String, dynamic> json) {
state = json['state'];
keyword = json['keyword'];
startTime = json['start_time'];
endTime = json['end_time'];
@@ -32,7 +29,6 @@ class OrderFilterModel {

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['state'] = this.state;
data['keyword'] = this.keyword;
data['start_time'] = this.startTime;
data['end_time'] = this.endTime;


+ 86
- 22
lib/pages/orders_page/models/order_model.dart 파일 보기

@@ -1,36 +1,100 @@
class OrderModel {
int uid;
String nickname;
bool hidOrder;
String ordId;
String providerOid;
String itemId;
String title;
String price;
String commission;
String commissionRate;
String imgUrl;
int itemNum;
String itemTitle;
String itemPrice;
String provider;
String paidPrice;
int orderType;
String userCommission;
String userCommissionRate;
String reason;
int state;
String createAt;
String updateAt;
String confirmAt;
String settleAt;
String thumbnail;
Map<String, dynamic> data; // 保存原始数据

OrderModel(
{this.itemId,
this.title,
this.price,
this.commission,
this.commissionRate,
this.imgUrl});
OrderModel({
this.uid,
this.nickname,
this.hidOrder,
this.ordId,
this.providerOid,
this.itemId,
this.itemNum,
this.itemTitle,
this.itemPrice,
this.provider,
this.paidPrice,
this.orderType,
this.userCommission,
this.userCommissionRate,
this.reason,
this.state,
this.createAt,
this.updateAt,
this.confirmAt,
this.settleAt,
this.thumbnail,
this.data,
});

OrderModel.fromJson(Map<String, dynamic> json) {
uid = json['uid'];
nickname = json['nickname'];
hidOrder = json['hid_order'];
ordId = json['ord_id'];
providerOid = json['provider_oid'];
itemId = json['item_id'];
title = json['title'];
price = json['price'];
commission = json['commission'];
commissionRate = json['commission_rate'];
imgUrl = json['img_url'];
itemNum = json['item_num'];
itemTitle = json['item_title'];
itemPrice = json['item_price'];
provider = json['provider'];
paidPrice = json['paid_price'];
orderType = json['order_type'];
userCommission = json['user_commission'];
userCommissionRate = json['user_commission_rate'];
reason = json['reason'];
state = json['state'];
createAt = json['create_at'];
updateAt = json['update_at'];
confirmAt = json['confirm_at'];
settleAt = json['settle_at'];
thumbnail = json['thumbnail'];
data = json;
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['uid'] = this.uid;
data['nickname'] = this.nickname;
data['hid_order'] = this.hidOrder;
data['ord_id'] = this.ordId;
data['provider_oid'] = this.providerOid;
data['item_id'] = this.itemId;
data['title'] = this.title;
data['price'] = this.price;
data['commission'] = this.commission;
data['commission_rate'] = this.commissionRate;
data['img_url'] = this.imgUrl;
data['item_num'] = this.itemNum;
data['item_title'] = this.itemTitle;
data['item_price'] = this.itemPrice;
data['provider'] = this.provider;
data['paid_price'] = this.paidPrice;
data['order_type'] = this.orderType;
data['user_commission'] = this.userCommission;
data['user_commission_rate'] = this.userCommissionRate;
data['reason'] = this.reason;
data['state'] = this.state;
data['create_at'] = this.createAt;
data['update_at'] = this.updateAt;
data['confirm_at'] = this.confirmAt;
data['settle_at'] = this.settleAt;
data['thumbnail'] = this.thumbnail;
return data;
}
}

+ 157
- 0
lib/pages/orders_page/models/order_page_item_style_model.dart 파일 보기

@@ -0,0 +1,157 @@
class OrderPageItemStyleModel {
String textCopy;
String textOrderNo;
String textOrderTime;
String textFinishTime;
String colorProviderFont;
String colorProviderBg;
String colorOrderTypeFont;
String colorOrderStateFont;
String colorTitle;
String colorFont;
String colorCopyBg;
String colorTipsBg;
String colorAmountFont;
String colorIncomeFont;
String skipIdentifier;
List<OrderStateModel> orderState;
List<OrderTypeModel> orderType;

OrderPageItemStyleModel(
{this.textCopy,
this.textOrderNo,
this.textOrderTime,
this.textFinishTime,
this.colorProviderFont,
this.colorProviderBg,
this.colorOrderTypeFont,
this.colorOrderStateFont,
this.colorTitle,
this.colorFont,
this.colorCopyBg,
this.colorTipsBg,
this.colorAmountFont,
this.colorIncomeFont,
this.skipIdentifier,
this.orderState,
this.orderType});

OrderPageItemStyleModel.fromJson(Map<String, dynamic> json) {
textCopy = json['text_copy'];
textOrderNo = json['text_order_no'];
textOrderTime = json['text_order_time'];
textFinishTime = json['text_finish_time'];
colorProviderFont = json['color_provider_font'];
colorProviderBg = json['color_provider_bg'];
colorOrderTypeFont = json['color_order_type_font'];
colorOrderStateFont = json['color_order_state_font'];
colorTitle = json['color_title'];
colorFont = json['color_font'];
colorCopyBg = json['color_copy_bg'];
colorTipsBg = json['color_tips_bg'];
colorAmountFont = json['color_amount_font'];
colorIncomeFont = json['color_income_font'];
skipIdentifier = json['skip_identifier'];
if (json['order_state'] != null) {
orderState = new List<OrderStateModel>();
json['order_state'].forEach((v) {
orderState.add(new OrderStateModel.fromJson(v));
});
}
if (json['order_type'] != null) {
orderType = new List<OrderTypeModel>();
json['order_type'].forEach((v) {
orderType.add(new OrderTypeModel.fromJson(v));
});
}
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['text_copy'] = this.textCopy;
data['text_order_no'] = this.textOrderNo;
data['text_order_time'] = this.textOrderTime;
data['text_finish_time'] = this.textFinishTime;
data['color_provider_font'] = this.colorProviderFont;
data['color_provider_bg'] = this.colorProviderBg;
data['color_order_type_font'] = this.colorOrderTypeFont;
data['color_order_state_font'] = this.colorOrderStateFont;
data['color_title'] = this.colorTitle;
data['color_font'] = this.colorFont;
data['color_copy_bg'] = this.colorCopyBg;
data['color_tips_bg'] = this.colorTipsBg;
data['color_amount_font'] = this.colorAmountFont;
data['color_income_font'] = this.colorIncomeFont;
data['skip_identifier'] = this.skipIdentifier;
if (this.orderState != null) {
data['order_state'] = this.orderState.map((v) => v.toJson()).toList();
}
if (this.orderType != null) {
data['order_type'] = this.orderType.map((v) => v.toJson()).toList();
}
return data;
}
}

class OrderStateModel {
String name;
String type;
String tips;
String tipsReplaceKey;
String tipsReplaceColor;
String amountText;
String incomeText;

OrderStateModel(
{this.name,
this.type,
this.tips,
this.tipsReplaceKey,
this.tipsReplaceColor,
this.amountText,
this.incomeText});

OrderStateModel.fromJson(Map<String, dynamic> json) {
name = json['name'];
type = json['type'];
tips = json['tips'];
tipsReplaceKey = json['tips_replace_key'];
tipsReplaceColor = json['tips_replace_color'];
amountText = json['amount_text'];
incomeText = json['income_text'];
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['name'] = this.name;
data['type'] = this.type;
data['tips'] = this.tips;
data['tips_replace_key'] = this.tipsReplaceKey;
data['tips_replace_color'] = this.tipsReplaceColor;
data['amount_text'] = this.amountText;
data['income_text'] = this.incomeText;
return data;
}
}

class OrderTypeModel {
String name;
String type;
String replaceKey;

OrderTypeModel({this.name, this.type, this.replaceKey});

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

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

+ 176
- 0
lib/pages/orders_page/models/order_page_style_model.dart 파일 보기

@@ -0,0 +1,176 @@
import 'package:zhiying_base_widget/pages/orders_page/models/order_page_item_style_model.dart';

class OrderPageStyleModel {
String appBarName;
String appBarNameColor;
String appBarBgImg;
String appBarBgColor;
String appBgColor;
String appActivateColor;
String searchBarLeftIcon;
String searchBarRightIcon;
String searchBarPlaceholder;
String searchBarHideTextColor;
String searchBarBgColor;
String searchBarBtnText;
String searchBarBtnTextColor;
String searchBarBtnBgColor;
String searchBtnReset;
String searchBtnOk;
String noticeSecurityIcon;
String noticeSecurityTitle;
String noticeSecuritySkipTitle;
String noticeSecuritySkipColor;
String noticeSecuritySkipIdentifier;
OrderPageFilterStyleModel filter;
OrderPageItemStyleModel list;

OrderPageStyleModel(
{this.appBarName,
this.appBarNameColor,
this.appBarBgImg,
this.appBarBgColor,
this.appBgColor,
this.appActivateColor,
this.searchBarLeftIcon,
this.searchBarRightIcon,
this.searchBarPlaceholder,
this.searchBarHideTextColor,
this.searchBarBgColor,
this.searchBarBtnText,
this.searchBarBtnTextColor,
this.searchBarBtnBgColor,
this.searchBtnReset,
this.searchBtnOk,
this.noticeSecurityIcon,
this.noticeSecurityTitle,
this.noticeSecuritySkipTitle,
this.noticeSecuritySkipColor,
this.noticeSecuritySkipIdentifier,
this.filter,
this.list});

OrderPageStyleModel.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'];
appBgColor = json['app_bg_color'];
appActivateColor = json['app_activate_color'];
searchBarLeftIcon = json['search_bar_left_icon'];
searchBarRightIcon = json['search_bar_right_icon'];
searchBarPlaceholder = json['search_bar_placeholder'];
searchBarHideTextColor = json['search_bar_hide_text_color'];
searchBarBgColor = json['search_bar_bg_color'];
searchBarBtnText = json['search_bar_btn_text'];
searchBarBtnTextColor = json['search_bar_btn_text_color'];
searchBarBtnBgColor = json['search_bar_btn_bg_color'];
searchBtnReset = json['search_btn_reset'];
searchBtnOk = json['search_btn_ok'];
noticeSecurityIcon = json['notice_security_icon'];
noticeSecurityTitle = json['notice_security_title'];
noticeSecuritySkipTitle = json['notice_security_skip_title'];
noticeSecuritySkipColor = json['notice_security_skip_color'];
noticeSecuritySkipIdentifier = json['notice_security_skip_identifier'];
filter = json['filter'] != null
? new OrderPageFilterStyleModel.fromJson(json['filter'])
: null;
list = json['list'] != null
? OrderPageItemStyleModel.fromJson(json['list'])
: 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['app_bg_color'] = this.appBgColor;
data['app_activate_color'] = this.appActivateColor;
data['search_bar_left_icon'] = this.searchBarLeftIcon;
data['search_bar_right_icon'] = this.searchBarRightIcon;
data['search_bar_placeholder'] = this.searchBarPlaceholder;
data['search_bar_hide_text_color'] = this.searchBarHideTextColor;
data['search_bar_bg_color'] = this.searchBarBgColor;
data['search_bar_btn_text'] = this.searchBarBtnText;
data['search_bar_btn_text_color'] = this.searchBarBtnTextColor;
data['search_bar_btn_bg_color'] = this.searchBarBtnBgColor;
data['search_btn_reset'] = this.searchBtnReset;
data['search_btn_ok'] = this.searchBtnOk;
data['notice_security_icon'] = this.noticeSecurityIcon;
data['notice_security_title'] = this.noticeSecurityTitle;
data['notice_security_skip_title'] = this.noticeSecuritySkipTitle;
data['notice_security_skip_color'] = this.noticeSecuritySkipColor;
data['notice_security_skip_identifier'] = this.noticeSecuritySkipIdentifier;
if (this.filter != null) {
data['filter'] = this.filter.toJson();
}
if (this.list != null) {
data['list'] = this.list.toJson();
}
return data;
}
}

class OrderPageFilterStyleModel {
String icon;
List<OrderTypeModel> orderState;
String providerTitle;
List<OrderTypeModel> providerType;
String orderTitle;
List<OrderTypeModel> orderType;
String orderTimeTitle;

OrderPageFilterStyleModel(
{this.icon,
this.orderState,
this.providerTitle,
this.providerType,
this.orderTitle,
this.orderType,
this.orderTimeTitle});

OrderPageFilterStyleModel.fromJson(Map<String, dynamic> json) {
icon = json['icon'];
if (json['order_state'] != null) {
orderState = new List<OrderTypeModel>();
json['order_state'].forEach((v) {
orderState.add(new OrderTypeModel.fromJson(v));
});
}
providerTitle = json['provider_title'];
if (json['provider_type'] != null) {
providerType = new List<OrderTypeModel>();
json['provider_type'].forEach((v) {
providerType.add(new OrderTypeModel.fromJson(v));
});
}
orderTitle = json['order_title'];
if (json['order_type'] != null) {
orderType = new List<OrderTypeModel>();
json['order_type'].forEach((v) {
orderType.add(new OrderTypeModel.fromJson(v));
});
}
orderTimeTitle = json['order_time_title'];
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['icon'] = this.icon;
if (this.orderState != null) {
data['order_state'] = this.orderState.map((v) => v.toJson()).toList();
}
data['provider_title'] = this.providerTitle;
if (this.providerType != null) {
data['provider_type'] = this.providerType.map((v) => v.toJson()).toList();
}
data['order_title'] = this.orderTitle;
if (this.orderType != null) {
data['order_type'] = this.orderType.map((v) => v.toJson()).toList();
}
data['order_time_title'] = this.orderTimeTitle;
return data;
}
}

+ 15
- 5
lib/pages/orders_page/order_content_page.dart 파일 보기

@@ -2,14 +2,18 @@ import 'package:flutter/material.dart';
import 'package:zhiying_base_widget/pages/orders_page/bloc/order_content_bloc.dart';
import 'package:zhiying_base_widget/pages/orders_page/models/order_filter_model.dart';
import 'package:zhiying_base_widget/pages/orders_page/models/order_model.dart';
import 'package:zhiying_base_widget/pages/orders_page/models/order_page_style_model.dart';
import 'package:zhiying_base_widget/pages/orders_page/views/order_item_widget.dart';
import 'package:zhiying_base_widget/widgets/empty/empty_widget.dart';
import 'package:zhiying_comm/util/base_bloc.dart';

class OrderContentPage extends StatefulWidget {
final String state; // 订单状态
final OrderPageStyleModel style;
final OrderFilterModel filter;

const OrderContentPage({Key key, this.filter}) : super(key: key);
const OrderContentPage(this.state, {Key key, this.filter, this.style})
: super(key: key);

@override
_OrderContentPageState createState() => _OrderContentPageState();
@@ -20,15 +24,18 @@ class _OrderContentPageState extends State<OrderContentPage> {
Widget build(BuildContext context) {
return BlocProvider<OrderContentBloc>(
bloc: OrderContentBloc(),
child: OrderContentContainer(widget.filter),
child: OrderContentContainer(widget.state, widget.filter, widget.style),
);
}
}

class OrderContentContainer extends StatefulWidget {
final String state; // 订单状态
final OrderFilterModel filter;
final OrderPageStyleModel style;

const OrderContentContainer(this.filter, {Key key}) : super(key: key);
const OrderContentContainer(this.state, this.filter, this.style, {Key key})
: super(key: key);

@override
_OrderContentContainerState createState() => _OrderContentContainerState();
@@ -40,7 +47,7 @@ class _OrderContentContainerState extends State<OrderContentContainer> {
@override
void initState() {
_bloc = BlocProvider.of(context);
_bloc.loadData(widget.filter);
_bloc.loadData(widget.state, widget.filter);

super.initState();
}
@@ -65,7 +72,10 @@ class _OrderContentContainerState extends State<OrderContentContainer> {
return ListView.builder(
itemCount: orders.length,
itemBuilder: (context, index) {
return OrderItemWidget(orders[index]);
return OrderItemWidget(
orders[index],
widget.style,
);
});
});
}


+ 81
- 69
lib/pages/orders_page/orders_page.dart 파일 보기

@@ -1,11 +1,15 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:zhiying_base_widget/pages/orders_page/bloc/order_page_bloc.dart';
import 'package:zhiying_base_widget/pages/orders_page/models/order_filter_model.dart';
import 'package:zhiying_base_widget/pages/orders_page/models/order_page_item_style_model.dart';
import 'package:zhiying_base_widget/pages/orders_page/models/order_page_style_model.dart';
import 'package:zhiying_base_widget/pages/orders_page/order_content_page.dart';
import 'package:zhiying_base_widget/pages/orders_page/order_search_page.dart';
import 'package:zhiying_base_widget/pages/orders_page/views/order_filter.dart';
import 'package:zhiying_base_widget/pages/orders_page/views/order_serch_widget.dart';
import 'package:zhiying_base_widget/pages/orders_page/views/order_tabbar_widget.dart';
import 'package:zhiying_comm/util/base_bloc.dart';

// 订单页面
class OrdersPage extends StatefulWidget {
@@ -27,8 +31,10 @@ class _OrdersPageState extends State<OrdersPage> {
backgroundColor: Color(0xfff9f9f9),
appBar: _createNav(),
body: SafeArea(
child: _OrdersContainer(),
),
child: BlocProvider<OrderPageBloc>(
bloc: OrderPageBloc(),
child: _OrdersContainer(widget.data),
)),
);
}

@@ -70,6 +76,10 @@ class _OrdersPageState extends State<OrdersPage> {
}

class _OrdersContainer extends StatefulWidget {
final Map<String, dynamic> data;

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

@override
_OrdersContainerState createState() => _OrdersContainerState();
}
@@ -78,90 +88,92 @@ class _OrdersContainerState extends State<_OrdersContainer>
with TickerProviderStateMixin {
TabController _tabController;
GlobalKey _tabKey = GlobalKey();
OrderPageBloc _bloc;

final OrderFilterModel _filter = OrderFilterModel();

bool _isFilterShow = false;
List<String> _titles = [
'全部',
'已付款',
'已结算',
'已失效',
'全部',
'已付款',
];
List<String> _titles = [];
List<Widget> _contents = [];

@override
void initState() {
_tabController = TabController(length: 6, vsync: this);
_contents = [
OrderContentPage(
filter: _filter,
),
OrderContentPage(
filter: _filter,
),
OrderContentPage(
filter: _filter,
),
OrderContentPage(
filter: _filter,
),
OrderContentPage(
filter: _filter,
),
OrderContentPage(
filter: _filter,
),
];
_bloc = BlocProvider.of<OrderPageBloc>(context);
if (widget.data.containsKey('skip_identifier')) {
_bloc.loadData(widget.data['skip_identifier']);
}

super.initState();
}

@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
GestureDetector(
child: OrderSearchWidget(),
onTap: () {
Navigator.of(context)
.push(CupertinoPageRoute(builder: (BuildContext context) {
return OrderSearchPage();
}));
},
),
OrderTabbarWidget(
_tabController,
_titles,
key: _tabKey,
onMoreClick: () {
setState(() {
_isFilterShow = !_isFilterShow;
});
},
),
Expanded(
child: Stack(
return StreamBuilder<OrderPageStyleModel>(
stream: _bloc.outData,
builder: (BuildContext context, AsyncSnapshot snapshot) {
OrderPageStyleModel model = snapshot.data;
if (model == null) {
return Container();
}
List<OrderTypeModel> type = model.filter.orderState;
_tabController =
TabController(length: type?.length ?? 0, vsync: this);
_titles = List.generate(type?.length, (index) => type[index].name);
_contents = List.generate(
type?.length ?? 0,
(index) => OrderContentPage(
type[index].type,
style: model,
filter: _filter,
),
);

return Column(
children: <Widget>[
TabBarView(
children: _contents,
controller: _tabController,
GestureDetector(
child: OrderSearchWidget(model),
onTap: () {
Navigator.of(context)
.push(CupertinoPageRoute(builder: (BuildContext context) {
return OrderSearchPage();
}));
},
),
Visibility(
visible: _isFilterShow,
child: OrderFilterWidget(
onDismiss: () {
setState(() {
_isFilterShow = false;
});
},
OrderTabbarWidget(
model,
_tabController,
_titles,
key: _tabKey,
onMoreClick: () {
setState(() {
_isFilterShow = !_isFilterShow;
});
},
),
Expanded(
child: Stack(
children: <Widget>[
TabBarView(
children: _contents,
controller: _tabController,
),
Visibility(
visible: _isFilterShow,
child: OrderFilterWidget(
model,
_filter,
onDismiss: () {
setState(() {
_isFilterShow = false;
});
},
),
)
],
),
)
],
),
)
],
);
);
});
}
}

+ 135
- 24
lib/pages/orders_page/views/order_filter.dart 파일 보기

@@ -1,16 +1,56 @@
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:zhiying_base_widget/pages/orders_page/models/order_filter_model.dart';
import 'package:zhiying_base_widget/pages/orders_page/models/order_page_item_style_model.dart';
import 'package:zhiying_base_widget/pages/orders_page/models/order_page_style_model.dart';
import 'package:zhiying_base_widget/widgets/others/action_date_alert/action_date_alert.dart';
import 'package:zhiying_comm/zhiying_comm.dart';

class OrderFilterWidget extends StatefulWidget {
final OrderPageStyleModel style;
final OrderFilterModel filterModel;
final VoidCallback onDismiss;

const OrderFilterWidget({Key key, this.onDismiss}) : super(key: key);
const OrderFilterWidget(this.style, this.filterModel,
{Key key, this.onDismiss})
: super(key: key);

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

class _OrderFilterWidgetState extends State<OrderFilterWidget> {
int _currentProvider = 0; //订单来源
int _currentType = 0; // 订单类型
int _startTime = 0; // 起始时间
int _endTime = 0; // 结束时间

@override
void initState() {
if (widget?.filterModel?.provider != null &&
widget.filterModel.provider != '') {
List<OrderTypeModel> list = widget?.style?.filter?.providerType;
for (int index = 0; index < list.length; index++) {
if (list[index].type == widget.filterModel.provider) {
_currentProvider = index;
break;
}
}
}

if (widget?.filterModel?.type != null && widget.filterModel.type != '') {
List<OrderTypeModel> list = widget?.style?.filter?.orderType;
for (int index = 0; index < list.length; index++) {
if (list[index].type == widget.filterModel.type) {
_currentType = index;
break;
}
}
}

super.initState();
}

@override
Widget build(BuildContext context) {
return GestureDetector(
@@ -24,11 +64,11 @@ class _OrderFilterWidgetState extends State<OrderFilterWidget> {
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
_creteTitle('订单来源'),
_createTags(),
_creteTitle('订单类型'),
_createTags(),
_creteTitle('订单时间'),
_creteTitle(widget?.style?.filter?.providerTitle ?? ''),
_createSources(),
_creteTitle(widget?.style?.filter?.orderTitle ?? ''),
_createType(),
_creteTitle(widget?.style?.filter?.orderTimeTitle ?? ''),
_creteTime(),
Container(
width: double.infinity,
@@ -58,7 +98,7 @@ class _OrderFilterWidgetState extends State<OrderFilterWidget> {
);
}

Widget _createTags() {
Widget _createSources() {
return Container(
width: double.infinity,
padding:
@@ -68,22 +108,65 @@ class _OrderFilterWidgetState extends State<OrderFilterWidget> {
crossAxisAlignment: WrapCrossAlignment.start,
spacing: 20,
runSpacing: 10,
children: List.generate(10, (index) {
return Container(
padding: EdgeInsets.only(left: 12, right: 12, top: 6, bottom: 6),
decoration: BoxDecoration(
color: Color(0xfff1f1f1),
borderRadius: BorderRadius.circular(5)),
child: Text(
'全部',
style: TextStyle(fontSize: 12, color: Color(0xff999999)),
),
children: List.generate(
widget?.style?.filter?.providerType?.length ?? 0, (index) {
return GestureDetector(
onTap: () {
setState(() {
_currentProvider = index;
});
},
child: _createTag(
widget.style.filter.providerType[index].name ?? '',
index == _currentProvider),
);
}).toList(),
),
);
}

Widget _createType() {
return Container(
width: double.infinity,
padding:
const EdgeInsets.only(left: 12.5, right: 12.5, bottom: 5, top: 5),
color: Colors.white,
child: Wrap(
crossAxisAlignment: WrapCrossAlignment.start,
spacing: 20,
runSpacing: 10,
children: List.generate(widget?.style?.filter?.orderType?.length ?? 0,
(index) {
return GestureDetector(
onTap: () {
setState(() {
_currentType = index;
});
},
child: _createTag(widget.style.filter.orderType[index].name ?? '',
_currentType == index),
);
}).toList(),
),
);
}

Widget _createTag(String title, bool isSelected) {
return Container(
padding: EdgeInsets.only(left: 12, right: 12, top: 6, bottom: 6),
decoration: BoxDecoration(
color: isSelected
? HexColor.fromHex(widget?.style?.appActivateColor ?? '#ff4242')
: Color(0xfff1f1f1),
borderRadius: BorderRadius.circular(5)),
child: Text(
title ?? '',
style: TextStyle(
fontSize: 12, color: isSelected ? Colors.white : Color(0xff999999)),
),
);
}

Widget _createButtons() {
return Container(
height: 54,
@@ -131,6 +214,18 @@ class _OrderFilterWidgetState extends State<OrderFilterWidget> {
}

Widget _creteTime() {
var formatter = new DateFormat('yyyy-MM-dd');
String starTime =
formatter.format(DateTime.fromMillisecondsSinceEpoch(_startTime));
if (_startTime == 0) {
starTime = '不限';
}

String endTime = formatter.format(DateTime(_endTime));
if (_endTime == 0) {
endTime = '不限';
}

return Container(
color: Colors.white,
padding: EdgeInsets.only(left: 12, right: 12, top: 4, bottom: 20),
@@ -146,7 +241,7 @@ class _OrderFilterWidgetState extends State<OrderFilterWidget> {
borderRadius: BorderRadius.circular(5)),
child: Center(
child: Text(
'2020-06',
starTime,
style: TextStyle(
fontSize: 12,
color: Color(0xff999999),
@@ -155,7 +250,7 @@ class _OrderFilterWidgetState extends State<OrderFilterWidget> {
),
),
onTap: () {
_selectDate();
_selectStartDate();
},
),
Text(
@@ -175,7 +270,7 @@ class _OrderFilterWidgetState extends State<OrderFilterWidget> {
borderRadius: BorderRadius.circular(5)),
child: Center(
child: Text(
'2020-06',
endTime,
style: TextStyle(
fontSize: 12,
color: Color(0xff999999),
@@ -184,7 +279,7 @@ class _OrderFilterWidgetState extends State<OrderFilterWidget> {
),
),
onTap: () {
_selectDate();
_selectEndDate();
},
),
],
@@ -192,7 +287,7 @@ class _OrderFilterWidgetState extends State<OrderFilterWidget> {
);
}

void _selectDate() async {
void _selectStartDate() async {
DateTime dateTime = await showModalBottomSheet(
context: context,
builder: (context) {
@@ -203,8 +298,24 @@ class _OrderFilterWidgetState extends State<OrderFilterWidget> {
isScrollControlled: false,
backgroundColor: Colors.transparent);
if (dateTime != null) {
String timeStamp =
(dateTime.millisecondsSinceEpoch / 1000).ceil().toString();
_startTime = dateTime.millisecondsSinceEpoch;
}
setState(() {});
}

void _selectEndDate() async {
DateTime dateTime = await showModalBottomSheet(
context: context,
builder: (context) {
return ActionDateAlert(
title: '选择结束日期',
);
},
isScrollControlled: false,
backgroundColor: Colors.transparent);
if (dateTime != null) {
_endTime = dateTime.millisecondsSinceEpoch;
}
setState(() {});
}
}

+ 121
- 29
lib/pages/orders_page/views/order_item_widget.dart 파일 보기

@@ -1,11 +1,16 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:zhiying_base_widget/pages/orders_page/models/order_model.dart';
import 'package:zhiying_base_widget/pages/orders_page/models/order_page_item_style_model.dart';
import 'package:zhiying_base_widget/pages/orders_page/models/order_page_style_model.dart';
import 'package:zhiying_comm/zhiying_comm.dart';

class OrderItemWidget extends StatelessWidget {
final OrderModel model;
final OrderPageStyleModel style;

const OrderItemWidget(this.model, {Key key}) : super(key: key);
const OrderItemWidget(this.model, this.style, {Key key}) : super(key: key);

@override
Widget build(BuildContext context) {
@@ -19,19 +24,39 @@ class OrderItemWidget extends StatelessWidget {
children: <Widget>[
_createHeader(),
_createCenter(),
_createTips(),
],
),
);
}

Widget _createHeader() {
List<OrderTypeModel> types = style.list.orderType;
OrderTypeModel orderType = types.firstWhere((element) {
return element.type == model.orderType.toString();
});
// orderType = types.last;
String type = '';
type = orderType.name ?? '';
String replaceKey = orderType.replaceKey ?? '';
if (replaceKey.length > 4) {
String key = replaceKey.substring(2, replaceKey.length - 2);
Logger.debug(key);
if (model.data.containsKey(key)) {
type = orderType.name.replaceAll(replaceKey, model.data[key]);
}
}

List<OrderStateModel> states = style.list.orderState;
OrderStateModel state =
states.firstWhere((element) => element.type == model.state.toString());
return Padding(
padding: const EdgeInsets.only(bottom: 8),
child: Row(
children: <Widget>[
Expanded(
child: Text(
'粉丝订单:Mickey',
type ?? '',
maxLines: 1,
style: TextStyle(
fontSize: 12,
@@ -41,7 +66,7 @@ class OrderItemWidget extends StatelessWidget {
),
),
Text(
'待结算',
state.name ?? '',
maxLines: 1,
style: TextStyle(
fontSize: 12,
@@ -65,7 +90,7 @@ class OrderItemWidget extends StatelessWidget {
child: ClipRRect(
borderRadius: BorderRadius.circular(8),
child: CachedNetworkImage(
imageUrl: model.imgUrl ?? '',
imageUrl: model.thumbnail ?? '',
fit: BoxFit.cover,
),
),
@@ -75,9 +100,42 @@ class OrderItemWidget extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
_createTitle(),
_creteText('订单编号:15487945211587'),
_creteText('下单时间:2020-06-18 17:11:15'),
_creteText('完成时间:2020-06-18 17:11:15'),
Row(
children: <Widget>[
_creteText(
'${style?.list?.textOrderNo ?? ''}${model?.ordId ?? ''}'),
GestureDetector(
onTap: () {
if (model?.ordId != null && model.ordId.length > 0) {
Fluttertoast.showToast(msg: '复制成功');
Clipboard.setData(ClipboardData(text: model.ordId));
}
},
child: Container(
margin: EdgeInsets.only(left: 10),
padding: EdgeInsets.only(
left: 10,
right: 10,
),
decoration: BoxDecoration(
color: Color(0xfff5f5f5),
borderRadius: BorderRadius.circular(2.5),
border: Border.all(
color: Color(0xffd6d6d6),
width: 0.5,
)),
child: Text(
style.list.textCopy,
style: TextStyle(fontSize: 9, color: Color(0xff999999)),
),
),
)
],
),
_creteText(
'${style?.list?.textOrderTime ?? ''}${model?.createAt ?? ''}'),
_creteText(
'${style?.list?.textFinishTime ?? ''}${model?.confirmAt ?? ''}'),
],
),
)
@@ -87,25 +145,36 @@ class OrderItemWidget extends StatelessWidget {

Widget _createTitle() {
List<InlineSpan> list = List();
list.add(WidgetSpan(
child: Container(
padding: EdgeInsets.only(left: 2, right: 2, top: 3, bottom: 3),
margin: EdgeInsets.only(right: 4),
child: Text(
'淘宝',
style: TextStyle(
fontSize: 9,
height: 1,
color: Colors.white,
String shop = '';
if (model?.provider != null && model.provider != '') {
shop = style.filter.providerType
.firstWhere((element) => element.type == model.provider)
?.name ??
'';
}
if (shop != '') {
list.add(WidgetSpan(
child: Container(
padding: EdgeInsets.only(left: 2, right: 2, top: 3, bottom: 3),
margin: EdgeInsets.only(right: 4),
child: Text(
shop,
style: TextStyle(
fontSize: 9,
height: 1,
color:
HexColor.fromHex(style.list.colorProviderFont ?? '#ffffff'),
),
),
decoration: BoxDecoration(
color: HexColor.fromHex(style.list.colorProviderBg ?? '#ffffff'),
borderRadius: BorderRadius.circular(2.5)),
),
decoration: BoxDecoration(
color: Colors.redAccent, borderRadius: BorderRadius.circular(2.5)),
),
));
));
}
list.add(
TextSpan(
text: model.title,
text: model?.itemTitle ?? '',
style: TextStyle(
fontSize: 15,
color: Color(0xff333333),
@@ -120,14 +189,37 @@ class OrderItemWidget extends StatelessWidget {
}

Widget _creteText(String text) {
return Padding(
padding: EdgeInsets.only(top: 4),
return text == null || text == ''
? Container()
: Padding(
padding: EdgeInsets.only(top: 2, bottom: 2),
child: Text(
text,
style: TextStyle(
fontSize: 10,
color: Color(0xff999999),
),
),
);
}

Widget _createTips() {
List<OrderStateModel> states = style.list.orderState;
OrderStateModel state =
states.firstWhere((element) => element.type == model.state.toString());
if (state == null || state.tips == null || state.tips == '') {
return Container();
}
return Container(
margin: EdgeInsets.only(top: 8),
padding: EdgeInsets.only(left: 8, right: 8, top: 2, bottom: 2),
width: double.infinity,
decoration: BoxDecoration(
color: HexColor.fromHex(style.list.colorTipsBg ?? '#f5f5f5'),
borderRadius: BorderRadius.circular(4)),
child: Text(
text,
style: TextStyle(
fontSize: 10,
color: Color(0xff999999),
),
state?.tips ?? '',
style: TextStyle(color: Color(0xff666666), fontSize: 10),
),
);
}


+ 26
- 7
lib/pages/orders_page/views/order_serch_widget.dart 파일 보기

@@ -1,7 +1,14 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:zhiying_base_widget/pages/orders_page/models/order_page_style_model.dart';
import 'package:zhiying_comm/util/extension/color.dart';
import 'package:zhiying_comm/zhiying_comm.dart';

class OrderSearchWidget extends StatelessWidget {
final OrderPageStyleModel model;

const OrderSearchWidget(this.model, {Key key}) : super(key: key);

@override
Widget build(BuildContext context) {
return Container(
@@ -12,13 +19,25 @@ class OrderSearchWidget extends StatelessWidget {
child: Container(
padding: EdgeInsets.only(left: 12, right: 12),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(16), color: Color(0xfff9f9f9)),
child: Center(
child: Text(
'搜索商品标题/粉丝姓名/订单号',
textAlign: TextAlign.center,
style: TextStyle(color: Color(0xff999999), fontSize: 14),
),
borderRadius: BorderRadius.circular(16),
color: HexColor.fromHex(model?.searchBarBgColor ?? '#f7f7f7')),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Container(
width: 16,
height: 16,
margin: EdgeInsets.only(right: 4),
child: CachedNetworkImage(
imageUrl: model?.searchBarLeftIcon ?? '',
),
),
Text(
model?.searchBarPlaceholder ?? '',
textAlign: TextAlign.center,
style: TextStyle(color: Color(0xff999999), fontSize: 14),
),
],
),
),
);


+ 14
- 25
lib/pages/orders_page/views/order_tabbar_widget.dart 파일 보기

@@ -1,12 +1,17 @@
import 'package:flutter/material.dart';
import 'package:zhiying_base_widget/pages/orders_page/models/order_page_style_model.dart';
import 'package:zhiying_base_widget/widgets/search/widget/my_tab.dart';
import 'package:zhiying_comm/util/extension/color.dart';
import 'package:zhiying_comm/zhiying_comm.dart';

class OrderTabbarWidget extends StatelessWidget {
final OrderPageStyleModel model;
final TabController controller;
final List<String> titles;
final VoidCallback onMoreClick;

const OrderTabbarWidget(
this.model,
this.controller,
this.titles, {
Key key,
@@ -27,8 +32,10 @@ class OrderTabbarWidget extends StatelessWidget {
isScrollable: true,
indicatorSize: TabBarIndicatorSize.label,
// tabs: widgets,
indicatorColor: Color(0xffff4242),
labelColor: Color(0xffff4242),
indicatorColor:
HexColor.fromHex(model?.appActivateColor ?? '#ff4242'),
labelColor:
HexColor.fromHex(model?.appActivateColor ?? '#ff4242'),
unselectedLabelColor: Color(0xff999999),
tabs: titles.map((item) {
return MyTab(
@@ -39,12 +46,14 @@ class OrderTabbarWidget extends StatelessWidget {
),
),
GestureDetector(
behavior: HitTestBehavior.opaque,
child: Container(
width: 40,
height: 40,
child: Icon(
Icons.filter_4,
size: 14,
padding: EdgeInsets.all(10),
child: CachedNetworkImage(
imageUrl: model?.filter?.icon ?? '',
fit: BoxFit.contain,
),
),
onTap: () {
@@ -57,23 +66,3 @@ class OrderTabbarWidget extends StatelessWidget {
));
}
}

class OrderTabbarItemWidget extends StatelessWidget {
final String title;
final bool isSelected;

const OrderTabbarItemWidget({Key key, this.title, this.isSelected = false})
: super(key: key);

@override
Widget build(BuildContext context) {
return Container(
height: 26,
child: Text(
title,
style: TextStyle(
color: isSelected ? Color(0xFFFF4242) : Color(0xff999999)),
),
);
}
}

불러오는 중...
취소
저장