Browse Source

Merge branch '1.22.0_dev' into 1.22.0_master

tags/0.0.17
“yanghuaxuan” 3 years ago
parent
commit
793c6511c4
23 changed files with 1670 additions and 28 deletions
  1. +1
    -1
      example/android/app/build.gradle
  2. +8
    -0
      example/android/app/src/main/java/cn/zhios/zhiying_base_widget_example/MainActivity.java
  3. +35
    -0
      example/lib/main.dart
  4. +37
    -5
      lib/pages/custom_page/custom_item_page.dart
  5. +1
    -1
      lib/pages/custom_page/custom_page.dart
  6. +31
    -0
      lib/pages/order_found_page/order_found_result/order_found_result_bloc.dart
  7. +104
    -0
      lib/pages/order_found_page/order_found_result/order_found_result_model.dart
  8. +460
    -0
      lib/pages/order_found_page/order_found_result/order_found_result_page.dart
  9. +184
    -0
      lib/pages/order_found_page/order_found_search_page/model/order_found_search_style.dart
  10. +69
    -0
      lib/pages/order_found_page/order_found_search_page/order_found_search_bloc.dart
  11. +221
    -0
      lib/pages/order_found_page/order_found_search_page/order_found_search_page.dart
  12. +5
    -1
      lib/pages/orders_page/bloc/order_content_bloc.dart
  13. +18
    -7
      lib/pages/orders_page/bloc/order_page_bloc.dart
  14. +1
    -0
      lib/pages/orders_page/bloc/order_search_bloc.dart
  15. +3
    -3
      lib/pages/orders_page/order_content_page.dart
  16. +19
    -8
      lib/pages/orders_page/orders_page.dart
  17. +9
    -0
      lib/register.dart
  18. +42
    -0
      lib/widgets/custom/bottom_pic/bottom_pic.dart
  19. +100
    -0
      lib/widgets/custom/bottom_pic/bottom_pic_style.dart
  20. +133
    -0
      lib/widgets/custom/ordedr_class/order_class_nav/order_class_nav.dart
  21. +186
    -0
      lib/widgets/custom/ordedr_class/order_class_nav/order_class_style.dart
  22. +1
    -0
      lib/zhiying_base_widget.dart
  23. +2
    -2
      pubspec.yaml

+ 1
- 1
example/android/app/build.gradle View File

@@ -45,7 +45,7 @@ android {
applicationId "cn.zhios.zhiying"
minSdkVersion 21
targetSdkVersion 28
versionCode 1618056480
versionCode 1718056480
versionName "10.6.0"
aaptOptions.cruncherEnabled = false
aaptOptions.useNewCruncher = false


+ 8
- 0
example/android/app/src/main/java/cn/zhios/zhiying_base_widget_example/MainActivity.java View File

@@ -161,6 +161,14 @@ public class MainActivity extends FlutterActivity implements ZhiyingFlutterCommN
map.put("domain", "http://inapi.izhyin.cn/");//"http://120.76.175.204:8989");http://47.114.51.254:80 http://inapi.izhyin.cn/
map.put("master_id", "123456");
map.put("secret_key", "123456");
// map.put("domain", "http://inapi.izhyin.cn/");//"http://120.76.175.204:8989");http://47.114.51.254:80 http://inapi.izhyin.cn/
// map.put("master_id", "22255132");
// map.put("secret_key", "123456");

///正式
// map.put("domain", "http://api.zhios.cn/");//45678910,api.zhios.cn84198689
// map.put("master_id", "99813608");
// map.put("secret_key", "123456");

///正式
// map.put("domain", "http://api.zhios.cn/");//45678910,api.zhios.cn84198689


+ 35
- 0
example/lib/main.dart View File

@@ -26,6 +26,7 @@ import 'package:zhiying_base_widget/zhiying_base_widget.dart';
import 'package:zhiying_acquisition/register.dart';
import 'package:zhiying_shopping_mall/zhiying_shopping_mall.dart';
import 'package:zhiying_credit_card/register.dart';
import 'package:zhiying_base_widget/zhiying_base_widget.dart';

void main() {
FlutterError.onError = (FlutterErrorDetails details) {
@@ -151,3 +152,37 @@ class _MyAppState extends State<MyApp> {
// if (!currentFocus.hasPrimaryFocus && currentFocus.focusedChild != null) {
// FocusManager.instance.primaryFocus.unfocus();
// }

class TestPage extends StatefulWidget {
@override
_TestPageState createState() => _TestPageState();
}

class _TestPageState extends State<TestPage> {
@override
void initState() {
NativeUtil.notifyInitSuccess();
super.initState();
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("临时测试页"),
),
body: Container(
child: ListView(
children: [
ListTile(
title: Text("查询页"),
onTap: () {
Navigator.push(context, MaterialPageRoute(builder: (context) => OrderFoundSearchPage()));
},
)
],
),
),
);
}
}

+ 37
- 5
lib/pages/custom_page/custom_item_page.dart View File

@@ -6,6 +6,7 @@ import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'package:provider/provider.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:zhiying_base_widget/pages/main_page/notifier/main_page_notifier.dart';
import 'package:zhiying_base_widget/widgets/custom/bottom_pic/bottom_pic.dart';
import 'package:zhiying_base_widget/widgets/empty/empty_widget.dart';
import 'package:zhiying_base_widget/widgets/home/home_auth/home_auth.dart';
import 'package:zhiying_base_widget/widgets/refresh/refresh_header/refresh_gif_header.dart';
@@ -26,7 +27,7 @@ class CustomItemPage extends StatelessWidget {
final String modPid;
final String modId;
final bool needBuildStatus;
Function(double) scroller;
Function(double) scroller;

CustomItemPage(this.data, this.tabIndex, this.modId, this.modPid, this.needBuildStatus, {this.scroller});

@@ -38,7 +39,14 @@ class CustomItemPage extends StatelessWidget {
],
child: BlocProvider<CustomItemPageBloc>(
create: (_) => CustomItemPageBloc(CustomItemPageRepository(this.data, this.tabIndex, this.modId, this.modPid)),
child: _CustomItemPageContainer(this.data, this.tabIndex, this.modId, this.modPid, this.needBuildStatus,scroller: this.scroller,),
child: _CustomItemPageContainer(
this.data,
this.tabIndex,
this.modId,
this.modPid,
this.needBuildStatus,
scroller: this.scroller,
),
),
);
}
@@ -94,8 +102,9 @@ class __CustomItemPageContainerState extends State<_CustomItemPageContainer> wit
_controller = ScrollController();
_eventBus = EventBus();
_refreshController = RefreshController(initialRefresh: false);
_initEvent();_controller.addListener(() {
if(widget.scroller!=null){
_initEvent();
_controller.addListener(() {
if (widget.scroller != null) {
widget?.scroller(_controller.offset);
}
});
@@ -186,6 +195,13 @@ class __CustomItemPageContainerState extends State<_CustomItemPageContainer> wit
margin: const EdgeInsets.only(bottom: 8),
child: _buildAuthWidget(model),
), //_buildAuthWidget(model),
),
Align(
alignment: Alignment.bottomCenter,
child: Container(
margin: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom),
child: _buildBottomPic(model),
), //_buildAuthWidget(model),
)
],
),
@@ -197,7 +213,7 @@ class __CustomItemPageContainerState extends State<_CustomItemPageContainer> wit
List<Widget> result = [];
for (int i = 0; i < datas.length; i++) {
WidgetModel item = WidgetModel.fromJson(Map<String, dynamic>.from(datas[i]));
if (item.modName == 'audit_tip') {
if (item.modName == 'audit_tip' || item.modName == "bottom_suspension") {
Logger.debug('授权组件,跳过');
continue;
}
@@ -261,4 +277,20 @@ class __CustomItemPageContainerState extends State<_CustomItemPageContainer> wit

return rlt ?? Container();
}

/// 特殊的底部图片跳转
Widget _buildBottomPic(final List<Map<String, dynamic>> datas) {
int length = datas?.length ?? 0;
if (length == 0) return Container();
Widget rlt;
for (int i = 0; i < datas.length; i++) {
WidgetModel item = WidgetModel.fromJson(Map<String, dynamic>.from(datas[i]));
if (item.modName == 'bottom_suspension') {
rlt = BottomPic(model: datas[i]);
break;
}
}

return rlt ?? Container();
}
}

+ 1
- 1
lib/pages/custom_page/custom_page.dart View File

@@ -354,7 +354,7 @@ class __CommonPageContainerState extends State<_CommonPageContainer> with Single
return MyTab(
icon: CachedNetworkImage(
imageUrl: item['choose_image_url'] ?? '',
width: 14,
width: 16,
),
text: item['name'],
);


+ 31
- 0
lib/pages/order_found_page/order_found_result/order_found_result_bloc.dart View File

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

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

import 'order_found_result_model.dart';

class OrderFoundResultBloc
extends BlocBase
{
StreamController<OrderFoundResultModel> streamController = StreamController();

OrderFoundResultModel orderFoundResultModel;

Stream get outData {
return streamController.stream;
}

//获取页面数据
getData() {
// NetUtil.request("", method: NetMethod.POST, onSuccess: (data) {
// });
orderFoundResultModel = OrderFoundResultModel();
streamController.add(orderFoundResultModel);
}

@override
void dispose() {
streamController.close();
// TODO: implement dispose
}
}

+ 104
- 0
lib/pages/order_found_page/order_found_result/order_found_result_model.dart View File

@@ -0,0 +1,104 @@
class OrderFoundResultModel {
int uid;
String nickname;
bool hidOrder;
String ordId;
String providerOid;
String itemId;
int itemNum;
String itemTitle;
String itemPrice;
String provider;
String paidPrice;
int orderType;
int priceType;
String priceName;
String userCommission;
String userCommissionRate;
String reason;
int state;
String createAt;
String updateAt;
String confirmAt;
String settleAt;
String thumbnail;

OrderFoundResultModel(
{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.priceType,
this.priceName,
this.userCommission,
this.userCommissionRate,
this.reason,
this.state,
this.createAt,
this.updateAt,
this.confirmAt,
this.settleAt,
this.thumbnail});

OrderFoundResultModel.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'];
itemNum = json['item_num'];
itemTitle = json['item_title'];
itemPrice = json['item_price'];
provider = json['provider'];
paidPrice = json['paid_price'];
orderType = json['order_type'];
priceType = json['price_type'];
priceName = json['price_name'];
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'];
}

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['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['price_type'] = this.priceType;
data['price_name'] = this.priceName;
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;
}
}

+ 460
- 0
lib/pages/order_found_page/order_found_result/order_found_result_page.dart View File

@@ -0,0 +1,460 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:zhiying_base_widget/pages/order_found_page/order_found_result/order_found_result_bloc.dart';
import 'package:zhiying_base_widget/pages/order_found_page/order_found_result/order_found_result_model.dart';

import 'package:zhiying_comm/zhiying_comm.dart';
import 'package:fluttertoast/fluttertoast.dart';

class OrderFoundResultPage extends StatefulWidget {
//有数据的model
final OrderFoundResultModel orderFoundResultModel;

//没有订单数据的空页面的title
final String emptyOrderTitle;

//没有订单数据的空页面的内容
final String emptyOrderContent;

//没有订单数据的空页面的图片
final String emptyOrderPic;

const OrderFoundResultPage(
{Key key,
this.orderFoundResultModel,
this.emptyOrderTitle,
this.emptyOrderContent,
this.emptyOrderPic})
: super(key: key);

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

class _OrderFoundResultPageState extends State<OrderFoundResultPage> {
// OrderFoundResultBloc _bloc;
bool hasData = true;

OrderFoundResultModel model;

String emptyOrderTitle;
String emptyOrderContent;
String emptyOrderPic;

@override
void initState() {
// TODO: implement initState
super.initState();
model = widget.orderFoundResultModel;
if (!EmptyUtil.isEmpty(model)) {
hasData = true;
} else {
hasData = false;
}
emptyOrderTitle = widget.emptyOrderTitle;
emptyOrderContent = widget.emptyOrderContent;
emptyOrderPic = widget.emptyOrderPic;
// _bloc = OrderFoundResultBloc();
// _bloc.getData();
}

//找回订单操作
retrieveOrderClick() {
print("是我的,找回该订单点击");
Map<String, dynamic> params = {};
params['oid'] = model?.ordId;
NetUtil.request('/api/v1/order/find', method: NetMethod.POST, params: params,
onSuccess: (data) {
Fluttertoast.showToast(msg: "找回成功");
Navigator.pop(context, "success");
});
}

continueToQuery() {
print("继续查询点击");
Navigator.pop(context);
}

//复制订单号
copyOrderCode() async{
ClipboardData data = new ClipboardData(text: model?.ordId);
await Clipboard.setData(data);
Fluttertoast.showToast(msg: "已复制订单号");
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
elevation: 0,
brightness: Brightness.light,
backgroundColor: Colors.white,
title: Text(
"订单查询",
style: TextStyle(
fontSize: 16,
color: HexColor.fromHex("#FF333333"),
fontWeight: FontWeight.w600),
),
centerTitle: true,
leading: Navigator.canPop(context)
? IconButton(
icon: Icon(
Icons.arrow_back_ios,
size: 18,
color: HexColor.fromHex("#FF444444"),
),
onPressed: () {
Navigator.pop(context);
})
: Container(),
),
body: Container(
child: hasData ? hasOrderView() : emptyView(),
),
);
}

//有订单数据的页面
hasOrderView() {
return Column(
children: [
Expanded(
child: Column(
children: [
orderTip(), //提示文字
orderMsg(), //订单数据
],
)),
//继续查询按钮
GestureDetector(
onTap: () {
continueToQuery();
},
behavior: HitTestBehavior.opaque,
child: Container(
padding: EdgeInsets.all(12),
child: Text(
"不是我的,继续查询",
style: TextStyle(fontSize: 14, color: HexColor.fromHex("#FF999999")),
),
),
),
//找回订单按钮
GestureDetector(
onTap: () {
retrieveOrderClick();
},
behavior: HitTestBehavior.opaque,
child: Container(
height: 50,
width: double.infinity,
margin: EdgeInsets.only(left: 24, right: 24, bottom: 24),
decoration:
BoxDecoration(borderRadius: BorderRadius.circular(12), color: Colors.red),
alignment: Alignment.center,
child: Text(
"是我的,找回该订单",
style: TextStyle(fontSize: 14, color: Colors.white),
),
),
),
],
);
}

//提示文字
orderTip() {
return Container(
margin: EdgeInsets.only(top: 15, left: 12),
child: Row(
children: [
Container(
margin: EdgeInsets.only(right: 5),
width: 4,
height: 15,
decoration:
BoxDecoration(borderRadius: BorderRadius.circular(2), color: Colors.red),
),
Text(
"是否为这笔订单?",
style: TextStyle(
fontSize: 15,
color: HexColor.fromHex("#FF333333"),
fontWeight: FontWeight.bold),
)
],
),
);
}

//订单数据
orderMsg() {
return Container(
height: 150,
margin: EdgeInsets.only(top: 10, left: 12, right: 12),
padding: EdgeInsets.only(top: 10, left: 10, right: 10),
decoration:
BoxDecoration(borderRadius: BorderRadius.circular(12), color: Colors.white),
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"自购订单",
style: TextStyle(
fontSize: 12,
color: HexColor.fromHex("#FF333333"),
fontWeight: FontWeight.w600),
),
],
),
Container(
child: Row(
children: [
Container(
margin: EdgeInsets.only(top: 10, bottom: 10),
width: 97,
height: 97,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(7.5),
image: DecorationImage(
image: NetworkImage(model?.thumbnail ?? ""), fit: BoxFit.fill)),
),
Expanded(
child: Container(
margin: EdgeInsets.only(left: 10),
height: 100,
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Container(
margin: EdgeInsets.only(right: 4),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(2.5),
color: Colors.red),
padding: EdgeInsets.only(left: 10, right: 10),
child: Text(
model?.provider,
style: TextStyle(fontSize: 10, color: Colors.white),
),
),
Expanded(
child: Text(
model?.itemTitle,
style: TextStyle(
fontSize: 13,
color: HexColor.fromHex("#FF333333"),
),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
)
],
),
Row(
children: [
Text(
"订单编号:${model?.ordId}",
style: TextStyle(
fontSize: 10,
color: HexColor.fromHex("#FF999999"),
),
),
GestureDetector(
onTap: () {
copyOrderCode();
},
behavior: HitTestBehavior.opaque,
child: Container(
width: 40,
margin: EdgeInsets.only(left: 4),
decoration: BoxDecoration(
border: new Border.all(
color: HexColor.fromHex("#FFD6D6D6"), width: 0.5),
borderRadius: BorderRadius.circular(2.5),
color: HexColor.fromHex("#FFF5F5F5")),
alignment: Alignment.center,
child: Text(
"复制",
style: TextStyle(
fontSize: 9, color: HexColor.fromHex("#FF999999")),
),
),
)
],
),
Text(
"下单时间:${model?.createAt}",
style: TextStyle(
fontSize: 10,
color: HexColor.fromHex("#FF999999"),
),
),
Text(
"完成时间:${model?.updateAt}",
style: TextStyle(
fontSize: 10,
color: HexColor.fromHex("#FF999999"),
),
),
Row(
children: [
Expanded(
child: Text(
"订单金额:¥ ${model?.paidPrice}",
style: TextStyle(
fontSize: 10,
color: HexColor.fromHex("#FF333333"),
),
),
),
// RichText(
// text: TextSpan(children: [
// TextSpan(
// text: "收益:¥ ",
// style: TextStyle(
// fontSize: 11,
// color: Colors.red,
// fontWeight: FontWeight.w600)),
// TextSpan(
// text: "10.19",
// style: TextStyle(
// fontSize: 18,
// color: Colors.red,
// fontWeight: FontWeight.w600))
// ]),
// )
],
),
],
),
),
),
],
),
),
// Container(
// padding: EdgeInsets.only(left: 6),
// height: 25,
// alignment: Alignment.centerLeft,
// decoration: BoxDecoration(
// borderRadius: BorderRadius.circular(2.5),
// color: HexColor.fromHex("#FFF9F9F9")),
// child: RichText(
// text: TextSpan(children: [
// TextSpan(
// text: "补贴于",
// style: TextStyle(
// fontSize: 10, color: HexColor.fromHex("#FF666666"))),
// TextSpan(
// text: "2020年07月23日",
// style: TextStyle(
// fontSize: 10, color: HexColor.fromHex("#FFFF4242"))),
// TextSpan(
// text: "到账,注意查收",
// style: TextStyle(
// fontSize: 10, color: HexColor.fromHex("#FF666666")))
// ]),
// ),
// )
],
),
);
}

//没有订单数据的空页面
emptyView() {
return Column(
children: [
Expanded(
child: Column(
children: [
Container(
width: double.infinity,
margin: EdgeInsets.only(top: 8, left: 12, right: 12),
padding: EdgeInsets.only(bottom: 16, left: 12, right: 12, top: 28),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12), color: Colors.white),
child: Column(
children: [
CachedNetworkImage(
imageUrl: emptyOrderPic ?? "",
width: 152,
fit: BoxFit.fitWidth,
),
Container(
margin: EdgeInsets.only(top: 16),
child: Text(
"未查询到该订单",
style:
TextStyle(fontSize: 15, color: HexColor.fromHex("#FF999999")),
),
),
Container(
margin: EdgeInsets.only(top: 24),
color: HexColor.fromHex("#FFF9F9F9"),
),
Container(
margin: EdgeInsets.only(top: 16),
child: Row(
children: [
Container(
margin: EdgeInsets.only(right: 5),
width: 4,
height: 15,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(2), color: Colors.red),
),
Text(
emptyOrderTitle ?? "",
style: TextStyle(
fontSize: 15,
color: HexColor.fromHex("#FF333333"),
fontWeight: FontWeight.bold),
)
],
),
),
Container(
alignment: Alignment.topLeft,
margin: EdgeInsets.only(top: 8),
child: Text(
emptyOrderContent ?? "",
style:
TextStyle(fontSize: 12, color: HexColor.fromHex("#FF999999")),
),
)
],
),
),
],
)),
GestureDetector(
onTap: () {
continueToQuery();
},
behavior: HitTestBehavior.opaque,
child: Container(
height: 50,
width: double.infinity,
margin: EdgeInsets.only(left: 24, right: 24, bottom: 24),
decoration:
BoxDecoration(borderRadius: BorderRadius.circular(12), color: Colors.red),
alignment: Alignment.center,
child: Text(
"重新查询",
style: TextStyle(fontSize: 14, color: Colors.white),
),
),
),
],
);
}
}

+ 184
- 0
lib/pages/order_found_page/order_found_search_page/model/order_found_search_style.dart View File

@@ -0,0 +1,184 @@
class OrderFoundSearchStyle {
Top top;
SearchCss searchCss;
RuleCss ruleCss;
FindRuleCss findRuleCss;
ResultCss resultCss;
FindRuleCss notFindRuleCss;

OrderFoundSearchStyle(
{this.top,
this.searchCss,
this.ruleCss,
this.findRuleCss,
this.resultCss,
this.notFindRuleCss});

OrderFoundSearchStyle.fromJson(Map<String, dynamic> json) {
top = json['top'] != null ? new Top.fromJson(json['top']) : null;
searchCss = json['search_css'] != null
? new SearchCss.fromJson(json['search_css'])
: null;
ruleCss = json['rule_css'] != null
? new RuleCss.fromJson(json['rule_css'])
: null;
findRuleCss = json['find_rule_css'] != null
? new FindRuleCss.fromJson(json['find_rule_css'])
: null;
resultCss = json['result_css'] != null
? new ResultCss.fromJson(json['result_css'])
: null;
notFindRuleCss = json['not_find_rule_css'] != null
? new FindRuleCss.fromJson(json['not_find_rule_css'])
: null;
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.top != null) {
data['top'] = this.top.toJson();
}
if (this.searchCss != null) {
data['search_css'] = this.searchCss.toJson();
}
if (this.ruleCss != null) {
data['rule_css'] = this.ruleCss.toJson();
}
if (this.findRuleCss != null) {
data['find_rule_css'] = this.findRuleCss.toJson();
}
if (this.resultCss != null) {
data['result_css'] = this.resultCss.toJson();
}
if (this.notFindRuleCss != null) {
data['not_find_rule_css'] = this.notFindRuleCss.toJson();
}
return data;
}
}

class Top {
String bgColor;
String bgSubColor;
String str;
String strColor;

Top({this.bgColor, this.bgSubColor, this.str, this.strColor});

Top.fromJson(Map<String, dynamic> json) {
bgColor = json['bg_color'];
bgSubColor = json['bg_sub_color'];
str = json['str'];
strColor = json['str_color'];
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['bg_color'] = this.bgColor;
data['bg_sub_color'] = this.bgSubColor;
data['str'] = this.str;
data['str_color'] = this.strColor;
return data;
}
}

class SearchCss {
String str;
String bgColor;
String strColor;
String btnStr;
String btnStrColor;
String btnBgColor;
String btnBgSubColor;

SearchCss(
{this.str,
this.bgColor,
this.strColor,
this.btnStr,
this.btnStrColor,
this.btnBgColor,
this.btnBgSubColor});

SearchCss.fromJson(Map<String, dynamic> json) {
str = json['str'];
bgColor = json['bg_color'];
strColor = json['str_color'];
btnStr = json['btn_str'];
btnStrColor = json['btn_str_color'];
btnBgColor = json['btn_bg_color'];
btnBgSubColor = json['btn_bg_sub_color'];
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['str'] = this.str;
data['bg_color'] = this.bgColor;
data['str_color'] = this.strColor;
data['btn_str'] = this.btnStr;
data['btn_str_color'] = this.btnStrColor;
data['btn_bg_color'] = this.btnBgColor;
data['btn_bg_sub_color'] = this.btnBgSubColor;
return data;
}
}

class RuleCss {
String str;
String img;
String imgUrl;

RuleCss({this.str, this.img, this.imgUrl});

RuleCss.fromJson(Map<String, dynamic> json) {
str = json['str'];
img = json['img'];
imgUrl = json['img_url'];
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['str'] = this.str;
data['img'] = this.img;
data['img_url'] = this.imgUrl;
return data;
}
}

class FindRuleCss {
String title;
String content;

FindRuleCss({this.title, this.content});

FindRuleCss.fromJson(Map<String, dynamic> json) {
title = json['title'];
content = json['content'];
}

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

class ResultCss {
String btnBgColor;
String btnBgSubColor;

ResultCss({this.btnBgColor, this.btnBgSubColor});

ResultCss.fromJson(Map<String, dynamic> json) {
btnBgColor = json['btn_bg_color'];
btnBgSubColor = json['btn_bg_sub_color'];
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['btn_bg_color'] = this.btnBgColor;
data['btn_bg_sub_color'] = this.btnBgSubColor;
return data;
}
}

+ 69
- 0
lib/pages/order_found_page/order_found_search_page/order_found_search_bloc.dart View File

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

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:zhiying_base_widget/dialog/loading/loading.dart';
import 'package:zhiying_base_widget/pages/order_found_page/order_found_result/order_found_result_model.dart';
import 'package:zhiying_base_widget/pages/order_found_page/order_found_result/order_found_result_page.dart';
import 'package:zhiying_base_widget/pages/order_found_page/order_found_search_page/model/order_found_search_style.dart';
import 'package:zhiying_comm/util/base_bloc.dart';
import 'package:zhiying_comm/util/empty_util.dart';
import 'package:zhiying_comm/util/log/let_log.dart';
import 'package:zhiying_comm/util/net_util.dart';
import 'package:zhiying_comm/zhiying_comm.dart';

class OrderFoundSearchBloc extends BlocBase {
StreamController streamController = StreamController.broadcast();

Stream get outData => streamController.stream;

OrderFoundSearchStyle style;

loadStyle() {
NetUtil.request("/api/v1/order/find/css", onSuccess: (data) {
style = OrderFoundSearchStyle.fromJson(json.decode(data['data']));
streamController.add(style);
Logger.log(json.encode(data['data']));
});
}

searchOrderById(BuildContext context, String id) {
var params = {"oid": id};
Loading.show(context);
NetUtil.request("/api/v1/order/find/search", params: params, method: NetMethod.POST, onSuccess: (data) {
Loading.dismiss();
if (EmptyUtil.isEmpty(data)) {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => OrderFoundResultPage(
emptyOrderTitle: style?.notFindRuleCss?.title ?? '',
emptyOrderContent: style?.notFindRuleCss?.content ?? "",
)));
} else {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => OrderFoundResultPage(
orderFoundResultModel: OrderFoundResultModel.fromJson(data),
emptyOrderTitle: style?.notFindRuleCss?.title ?? '',
emptyOrderContent: style?.notFindRuleCss?.content ?? "",
))).then((value) {
if (value != null && value == "success") {
Navigator.pop(context);
}
});
}
streamController.add(style);
Logger.log(json.encode(data['data']));
}, onError: (e) {
Loading.dismiss();
});
}

@override
void dispose() {
// TODO: implement dispose
}
}

+ 221
- 0
lib/pages/order_found_page/order_found_search_page/order_found_search_page.dart View File

@@ -0,0 +1,221 @@
import 'package:flutter/material.dart';
import 'package:zhiying_base_widget/pages/order_found_page/order_found_search_page/order_found_search_bloc.dart';
import 'package:zhiying_comm/zhiying_comm.dart';

import 'model/order_found_search_style.dart';

///订单搜索页
class OrderFoundSearchPage extends StatefulWidget {
@override
_OrderFoundSearchPageState createState() => _OrderFoundSearchPageState();
}

class _OrderFoundSearchPageState extends State<OrderFoundSearchPage> {
OrderFoundSearchBloc _bloc;
OrderFoundSearchStyle style;
TextEditingController textEditingController;

@override
void initState() {
textEditingController = TextEditingController();
_bloc = OrderFoundSearchBloc();
_bloc.loadStyle();
super.initState();
}

@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: _bloc.outData,
builder: (context, asyn) {
if (asyn.data == null) {
return Container(
color: Colors.white,
);
}
style = asyn.data;
return Stack(
children: [
Container(
color: HexColor.fromHex("#f9f9f9"),
),
Container(
height: 200,
width: MediaQuery.of(context).size.width,
decoration: BoxDecoration(
borderRadius: BorderRadius.only(bottomLeft: Radius.circular(6), bottomRight: Radius.circular(6)),
gradient: LinearGradient(
begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: [HexColor.fromHex(style?.top?.bgColor), HexColor.fromHex(style?.top?.bgSubColor ?? '')])),
),
Scaffold(
backgroundColor: Colors.transparent,
appBar: _buildAppBar(),
body: Container(
child: ListView(
children: [_buildSearch(), _buildCenter(), _buildBottom()],
),
),
),
],
);
});
}

_buildAppBar() {
return AppBar(
backgroundColor: Colors.transparent,
elevation: 0,
leading: Navigator.canPop(context)
? IconButton(
icon: Icon(
Icons.arrow_back_ios_rounded,
),
iconSize: 18,
onPressed: () {
Navigator.pop(context);
})
: Container(),
title: Text(
style?.top?.str ?? '',
style: TextStyle(fontSize: 17, color: HexColor.fromHex(style?.top?.strColor)),
),
centerTitle: true,
actions: [
IconButton(
icon: Icon(
Icons.refresh,
color: HexColor.fromHex(style?.top?.strColor),
),
onPressed: () {
_bloc?.loadStyle();
})
],
);
}

///构建搜索
_buildSearch() {
return Container(
height: 50,
decoration: BoxDecoration(color: HexColor.fromHex(style?.searchCss?.bgColor ?? ''), borderRadius: BorderRadius.circular(10), border: Border.all(color: Colors.white)),
margin: EdgeInsets.only(left: 10, right: 10, top: 10, bottom: 10),
padding: EdgeInsets.only(left: 10, right: 4),
child: Row(
children: [
Expanded(
child: TextField(
controller: textEditingController,
decoration: InputDecoration(
border: InputBorder.none,
hintText: style?.searchCss?.str ?? '',
hintStyle: TextStyle(color: HexColor.fromHex(style?.searchCss?.strColor ?? ""), fontSize: 14),
isDense: true),
)),
GestureDetector(
onTap: () {
if (textEditingController?.text.trim().length == 0) {
Fluttertoast.showToast(msg: "请输入搜索的订单编号");
return;
}
FocusScope.of(context).requestFocus(new FocusNode());
_bloc.searchOrderById(context, textEditingController.text);
},
child: Container(
height: 42,
alignment: Alignment.center,
padding: EdgeInsets.only(left: 24, right: 24),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
gradient: LinearGradient(
begin: Alignment.centerLeft,
end: Alignment.centerRight,
colors: [HexColor.fromHex(style?.searchCss?.btnBgColor), HexColor.fromHex(style?.searchCss?.btnBgSubColor ?? '')])),
child: Text(
style?.searchCss?.btnStr ?? "",
style: TextStyle(color: HexColor.fromHex(style?.searchCss?.btnStrColor ?? "")),
),
),
),
],
),
);
}

_buildCenter() {
return Container(
margin: EdgeInsets.only(left: 10, right: 10, top: 10, bottom: 10),
padding: EdgeInsets.only(left: 10, right: 10, top: 10, bottom: 10),
decoration: BoxDecoration(color: HexColor.fromHex("#FFFFFF"), borderRadius: BorderRadius.circular(10)),
child: Column(
children: [
Row(
children: [
Container(
width: 4,
height: 14,
decoration: BoxDecoration(color: HexColor.fromHex("#FF2020"), borderRadius: BorderRadius.circular(10)),
margin: EdgeInsets.only(right: 10),
),
Text(
style?.ruleCss?.str ?? "",
style: TextStyle(color: HexColor.fromHex("#333333"), fontSize: 15, fontWeight: FontWeight.w500),
)
],
),
SizedBox(
height: 16,
),
GestureDetector(
onTap: () {
PhotoPreview.showPhotoPreviewByimages(context, [style?.ruleCss?.img ?? ""]);
},
child: CachedNetworkImage(
imageUrl: style?.ruleCss?.img ?? '',
fit: BoxFit.fitWidth,
),
)
],
),
);
}

_buildBottom() {
return Container(
margin: EdgeInsets.only(left: 10, right: 10, top: 0, bottom: 10),
padding: EdgeInsets.only(left: 10, right: 10, top: 10, bottom: 10),
decoration: BoxDecoration(color: HexColor.fromHex("#FFFFFF"), borderRadius: BorderRadius.circular(10)),
child: Column(
children: [
Row(
children: [
Container(
width: 4,
height: 14,
margin: EdgeInsets.only(right: 10),
decoration: BoxDecoration(color: HexColor.fromHex("#FF2020"), borderRadius: BorderRadius.circular(10)),
),
Text(
style?.findRuleCss?.title ?? '',
style: TextStyle(color: HexColor.fromHex("#333333"), fontSize: 15, fontWeight: FontWeight.w500),
)
],
),
SizedBox(
height: 16,
),
ListView(
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
children: [
Text(
style?.findRuleCss?.content ?? "",
style: TextStyle(color: HexColor.fromHex("#999999"), fontSize: 12, fontWeight: FontWeight.w500),
)
],
)
],
),
);
}

}

+ 5
- 1
lib/pages/orders_page/bloc/order_content_bloc.dart View File

@@ -9,7 +9,7 @@ import 'package:zhiying_comm/zhiying_comm.dart';
class OrderContentBloc extends BlocBase {

final String skipIdentifier;
OrderContentBloc({this.skipIdentifier});
OrderContentBloc({this.skipIdentifier,this.source});

List<OrderModel> _orders = List();

@@ -21,6 +21,7 @@ class OrderContentBloc extends BlocBase {
OrderFilterModel _filter;
RefreshController refreshController =
RefreshController(initialRefresh: false);
String source;
@override
void dispose() {
_ordersController.close();
@@ -40,6 +41,9 @@ class OrderContentBloc extends BlocBase {
params.removeWhere((key, value) => value == null || value == '');
params['state'] = _state;
String reqUrl = skipIdentifier == 'pub.flutter.order_by_userlvup' ? '/api/v1/order_by_userlvup' : '/api/v1/order';
if(skipIdentifier=="pub.flutter.order_list"){
reqUrl="/api/v1/order_list/"+(source??"");
}
NetUtil.request(reqUrl, method: NetMethod.POST, params: params,
onCache: (data) {
//_parseData(data);


+ 18
- 7
lib/pages/orders_page/bloc/order_page_bloc.dart View File

@@ -19,13 +19,24 @@ class OrderPageBloc extends BlocBase {
_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(String skipIdentifier,{String source}) async {
if(skipIdentifier=="pub.flutter.order_list"){
skipIdentifier="pub.flutter.my_order";
NetUtil.request('/api/v1/mod/${skipIdentifier.toString()}?source_type='+source,
method: NetMethod.GET, onCache: (data) {
// _loadData(data);
}, onSuccess: (data) {
_loadData(data);
});
}else{
NetUtil.request('/api/v1/mod/${skipIdentifier.toString()}',
method: NetMethod.GET, onCache: (data) {
// _loadData(data);
}, onSuccess: (data) {
_loadData(data);
});
}

}

void _loadData(dynamic data) {


+ 1
- 0
lib/pages/orders_page/bloc/order_search_bloc.dart View File

@@ -14,6 +14,7 @@ class OrderSearchBloc extends BlocBase {
int _page = 1;
String _keyword = '';

String source;
@override
void dispose() {
_ordersController.close();


+ 3
- 3
lib/pages/orders_page/order_content_page.dart View File

@@ -18,9 +18,10 @@ class OrderContentPage extends StatefulWidget {
final int index;
final EventBus eventBus;
final String skipIdentifier;
final String source;///通过自定义页面订单分类进入的订单类型

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

@override
@@ -31,7 +32,7 @@ class _OrderContentPageState extends State<OrderContentPage> {
@override
Widget build(BuildContext context) {
return BlocProvider<OrderContentBloc>(
bloc: OrderContentBloc(skipIdentifier: widget?.skipIdentifier),
bloc: OrderContentBloc(skipIdentifier: widget?.skipIdentifier,source: widget?.source),
child: OrderContentContainer(
widget.state,
widget.filter,
@@ -49,7 +50,6 @@ class OrderContentContainer extends StatefulWidget {
final OrderPageStyleModel style;
final int index;
final EventBus eventBus;

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


+ 19
- 8
lib/pages/orders_page/orders_page.dart View File

@@ -67,7 +67,7 @@ class _OrdersPageState extends State<OrdersPage> {
)
: Container(),
middle: Text(
widget.data['skip_identifier'] == 'pub.flutter.my_order' ? '我的订单' : '会员升级订单',
widget?.data["skip_name"] ??( widget.data['skip_identifier'] == 'pub.flutter.my_order' ? '我的订单' : '会员升级订单'),
style: TextStyle(
fontSize: 15,
color: Color(0xff333333),
@@ -86,8 +86,7 @@ class _OrdersContainer extends StatefulWidget {
_OrdersContainerState createState() => _OrdersContainerState();
}

class _OrdersContainerState extends State<_OrdersContainer>
with TickerProviderStateMixin {
class _OrdersContainerState extends State<_OrdersContainer> with TickerProviderStateMixin {
TabController _tabController;
GlobalKey _tabKey = GlobalKey();
OrderPageBloc _bloc;
@@ -100,11 +99,21 @@ class _OrdersContainerState extends State<_OrdersContainer>

EventBus _eventBus = EventBus();

String source;

@override
void initState() {
_bloc = BlocProvider.of<OrderPageBloc>(context);
if (widget.data.containsKey('skip_identifier')) {
_bloc.loadData(widget.data['skip_identifier']);
String source = null;
if (widget?.data['data'] != null) {
source = widget?.data['data']['source_type'];
}
_bloc.loadData(widget.data['skip_identifier'], source: source);
}

if(widget?.data['data']!=null&&widget.data['data']['source_type']!=null){
source=widget.data['data']['source_type'];
}

super.initState();
@@ -128,8 +137,7 @@ class _OrdersContainerState extends State<_OrdersContainer>
List<OrderTypeModel> type = model.filter.orderState;

_tabController?.dispose();
_tabController =
TabController(length: type?.length ?? 0, vsync: this);
_tabController = TabController(length: type?.length ?? 0, vsync: this);
_tabController.addListener(() {
Logger.debug('????? ${_tabController.index.toString()}');
});
@@ -143,6 +151,7 @@ class _OrdersContainerState extends State<_OrdersContainer>
index: index,
eventBus: _eventBus,
skipIdentifier: widget.data['skip_identifier'],
source: source,
),
);

@@ -155,13 +164,13 @@ class _OrdersContainerState extends State<_OrdersContainer>
child: GestureDetector(
child: OrderSearchWidget(model),
onTap: () {
Navigator.of(context)
.push(CupertinoPageRoute(builder: (BuildContext context) {
Navigator.of(context).push(CupertinoPageRoute(builder: (BuildContext context) {
return OrderSearchPage(model);
}));
},
),
),

/// TabBar 分类导航
OrderTabbarWidget(
model,
@@ -174,6 +183,7 @@ class _OrdersContainerState extends State<_OrdersContainer>
});
},
),

/// TabView 子视图
Expanded(
child: Stack(
@@ -182,6 +192,7 @@ class _OrdersContainerState extends State<_OrdersContainer>
children: _contents,
controller: _tabController,
),

/// 筛选视图
Visibility(
visible: _isFilterShow,


+ 9
- 0
lib/register.dart View File

@@ -43,6 +43,7 @@ import 'package:zhiying_base_widget/widgets/custom/banner/custom_banner_widget.d
import 'package:zhiying_base_widget/widgets/custom/goods/custom_goods_creater.dart';
import 'package:zhiying_base_widget/widgets/custom/multi_nav/custom_quick_entry.dart';
import 'package:zhiying_base_widget/widgets/custom/notice/custom_notice_widget.dart';
import 'package:zhiying_base_widget/widgets/custom/ordedr_class/order_class_nav/order_class_nav.dart';
import 'package:zhiying_base_widget/widgets/custom/search/custom_search_widget.dart';
import 'package:zhiying_base_widget/widgets/custom/share_content/share_content_widget.dart';
import 'package:zhiying_base_widget/widgets/custom/slide_banner/custom_slide_banner_creater.dart';
@@ -310,6 +311,12 @@ class BaseWidgetRegister {

/// 通用模块
PageFactory.regist('pub.flutter.custom', (model) => CustomPage(model));

///订单找回
PageFactory.regist("pub.flutter.order_find", (model) => OrderFoundSearchPage());

/// 订单页面
PageFactory.regist('pub.flutter.order_list', (model) => OrdersPage(model));
}

// 注册控件
@@ -453,5 +460,7 @@ class BaseWidgetRegister {
WidgetFactory.regist('audit_tip', DefaultWidgetCreater((model) => HomeAuth(model)));
// 分享内容组件
WidgetFactory.regist('share_content', DefaultWidgetCreater((model) => CustomShareContentWidget(model)));

WidgetFactory.regist('features_cate', DefaultWidgetCreater((model) => OrderClassNav(model)));
}
}

+ 42
- 0
lib/widgets/custom/bottom_pic/bottom_pic.dart View File

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

import 'package:flutter/material.dart';
import 'package:zhiying_comm/util/log/let_log.dart';
import 'package:zhiying_comm/zhiying_comm.dart';

import 'bottom_pic_style.dart';

class BottomPic extends StatelessWidget {
final Map<String, dynamic> model;

BottomPic({Key key, this.model}) : super(key: key);
@override
BottomPicStyle style;

Widget build(BuildContext context) {
style = BottomPicStyle.fromJson(json.decode(model['data']));
Logger.log(model['data']);
if (style == null) {
return Container();
}
return GestureDetector(
onTap: () {
RouterUtil.route(SkipModel.fromJson(style.toJson()), style.toJson(), context);
},
child: Container(
margin: EdgeInsets.only(
left: double.tryParse(style?.leftRightMargin ?? "0"), right: double.tryParse(style?.leftRightMargin ?? "0"), top: double.tryParse(style?.topMargin ?? "0"), bottom: 0),
decoration: BoxDecoration(
color: HexColor.fromHex(style?.bgColor ?? ''),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(double.tryParse(style?.topLeftRadius ?? "0")),
topRight: Radius.circular(double.tryParse(style?.topRightRadius ?? "0")),
bottomLeft: Radius.circular(double.tryParse(style?.bottomLeftRadius ?? "0")),
bottomRight: Radius.circular(double.tryParse(style?.bottomRightRadius ?? "0")))),
child: CachedNetworkImage(
imageUrl: style?.bgImage ?? "",
),
),
);
}
}

+ 100
- 0
lib/widgets/custom/bottom_pic/bottom_pic_style.dart View File

@@ -0,0 +1,100 @@
class BottomPicStyle {
String name;
String desc;
String moduleType;
String moduleKey;
String isTopMargin;
String isLeftRightMargin;
String isShow;
String topMargin;
String leftRightMargin;
String topLeftRadius;
String topRightRadius;
String bottomLeftRadius;
String bottomRightRadius;
String bgColor;
String bgImage;
String bgImageUrl;
String skipIdentifier;
String skipName;
String requiredLogin;
String requiredTaobaoAuth;
String isJump;
String cateTag;

BottomPicStyle(
{this.name,
this.desc,
this.moduleType,
this.moduleKey,
this.isTopMargin,
this.isLeftRightMargin,
this.isShow,
this.topMargin,
this.leftRightMargin,
this.topLeftRadius,
this.topRightRadius,
this.bottomLeftRadius,
this.bottomRightRadius,
this.bgColor,
this.bgImage,
this.bgImageUrl,
this.skipIdentifier,
this.skipName,
this.requiredLogin,
this.requiredTaobaoAuth,
this.isJump,
this.cateTag});

BottomPicStyle.fromJson(Map<String, dynamic> json) {
name = json['name'];
desc = json['desc'];
moduleType = json['module_type'];
moduleKey = json['module_key'];
isTopMargin = json['is_top_margin'];
isLeftRightMargin = json['is_left_right_margin'];
isShow = json['is_show'];
topMargin = json['top_margin'];
leftRightMargin = json['left_right_margin'];
topLeftRadius = json['top_left_radius'];
topRightRadius = json['top_right_radius'];
bottomLeftRadius = json['bottom_left_radius'];
bottomRightRadius = json['bottom_right_radius'];
bgColor = json['bg_color'];
bgImage = json['bg_image'];
bgImageUrl = json['bg_image_url'];
skipIdentifier = json['skip_identifier'];
skipName = json['skip_name'];
requiredLogin = json['required_login'];
requiredTaobaoAuth = json['required_taobao_auth'];
isJump = json['is_jump'];
cateTag = json['cate_tag'];
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['name'] = this.name;
data['desc'] = this.desc;
data['module_type'] = this.moduleType;
data['module_key'] = this.moduleKey;
data['is_top_margin'] = this.isTopMargin;
data['is_left_right_margin'] = this.isLeftRightMargin;
data['is_show'] = this.isShow;
data['top_margin'] = this.topMargin;
data['left_right_margin'] = this.leftRightMargin;
data['top_left_radius'] = this.topLeftRadius;
data['top_right_radius'] = this.topRightRadius;
data['bottom_left_radius'] = this.bottomLeftRadius;
data['bottom_right_radius'] = this.bottomRightRadius;
data['bg_color'] = this.bgColor;
data['bg_image'] = this.bgImage;
data['bg_image_url'] = this.bgImageUrl;
data['skip_identifier'] = this.skipIdentifier;
data['skip_name'] = this.skipName;
data['required_login'] = this.requiredLogin;
data['required_taobao_auth'] = this.requiredTaobaoAuth;
data['is_jump'] = this.isJump;
data['cate_tag'] = this.cateTag;
return data;
}
}

+ 133
- 0
lib/widgets/custom/ordedr_class/order_class_nav/order_class_nav.dart View File

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

import 'package:flutter/material.dart';
import 'package:zhiying_base_widget/widgets/custom/ordedr_class/order_class_nav/order_class_style.dart';
import 'package:zhiying_comm/util/extension/color.dart';
import 'package:zhiying_comm/zhiying_comm.dart';

///订单分类
class OrderClassNav extends StatelessWidget {
final Map<String, dynamic> model;

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

OrderClassStyle style;
BuildContext context;

@override
Widget build(BuildContext context) {
// Logger.log(model['data']);
style = OrderClassStyle.fromJson(json.decode(model['data']));
if (style == null) {
return Container();
}
this.context = context;
return Container(
margin: EdgeInsets.only(
left: double.tryParse(style?.leftRightMargin ?? "0"), right: double.tryParse(style?.leftRightMargin ?? "0"), top: double.tryParse(style?.topMargin ?? "0"), bottom: 0),
padding: EdgeInsets.only(left: 10, right: 10, top: 10, bottom: 10),
decoration: BoxDecoration(
color: HexColor.fromHex(style?.bgColor ?? ''),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(double.tryParse(style?.topLeftRadius ?? "0")),
topRight: Radius.circular(double.tryParse(style?.topRightRadius ?? "0")),
bottomLeft: Radius.circular(double.tryParse(style?.bottomLeftRadius ?? "0")),
bottomRight: Radius.circular(double.tryParse(style?.bottomRightRadius ?? "0")))),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Container(
width: 4,
height: 14,
decoration: BoxDecoration(color: HexColor.fromHex("#FF2020"), borderRadius: BorderRadius.circular(10)),
margin: EdgeInsets.only(right: 10),
),
Text(
style?.title ?? "",
style: TextStyle(color: HexColor.fromHex("#333333"), fontSize: 15, fontWeight: FontWeight.w500),
)
],
),
Padding(
padding: const EdgeInsets.only(left: 15),
child: Text(
style?.subTitle ?? "",
style: TextStyle(color: HexColor.fromHex("#999999"), fontSize: 12, fontWeight: FontWeight.w500),
),
),
SizedBox(
height: 10,
),
createNav()
],
),
);
}

createNav() {
List<Widget> listWidget = List();
int row = (style?.listStyle?.length / style?.columSize).ceil();
for (var index = 0; index < row; index++) {
listWidget.add(Row(
children: _buildRow(index),
));
}

return Column(children: listWidget);
}

_buildRow(int index2) {
List<Widget> listWidget = List();

int currentIndex = index2 * style?.columSize;

for (var index = 0; index < style?.columSize; index++) {
var nowIndex = currentIndex + index;
listWidget.add(Expanded(
child: _buildItem(nowIndex),
));
}

return listWidget;
}

_buildItem(int currentIndex) {
print(currentIndex.toString());
if (currentIndex >= style?.listStyle?.length) {
return Container();
}

var item = style.listStyle[currentIndex];
print(currentIndex.toString() + item?.title);
return GestureDetector(
onTap: () {
RouterUtil.route(SkipModel.fromJson(item.toJson() ?? ''), item.toJson(), context);
},
child: Container(
margin: EdgeInsets.only(top: 10),
child: Column(
children: [
CachedNetworkImage(
imageUrl: item?.img ?? "",
width: 40,
height: 40,
),
SizedBox(
height: 6,
),
Text(
item?.title,
style: TextStyle(color: HexColor.fromHex("#333333"), fontSize: 12),
),
Text(
item?.subTitle,
style: TextStyle(color: HexColor.fromHex("#333333"), fontSize: 10),
),
],
),
),
);
}
}

+ 186
- 0
lib/widgets/custom/ordedr_class/order_class_nav/order_class_style.dart View File

@@ -0,0 +1,186 @@
class OrderClassStyle {
String name;
String desc;
String title;
int customFeaturesCate;
String moduleType;
String moduleKey;
String isTopMargin;
String isLeftRightMargin;
String isShow;
String topMargin;
String leftRightMargin;
String topLeftRadius;
String topRightRadius;
String bottomLeftRadius;
String bottomRightRadius;
String bgColor;
String subTitle;
List<ListStyle> listStyle;
int columSize;

OrderClassStyle(
{this.name,
this.desc,
this.title,
this.customFeaturesCate,
this.moduleType,
this.moduleKey,
this.isTopMargin,
this.isLeftRightMargin,
this.isShow,
this.topMargin,
this.leftRightMargin,
this.topLeftRadius,
this.topRightRadius,
this.bottomLeftRadius,
this.bottomRightRadius,
this.bgColor,
this.subTitle,
this.listStyle,
this.columSize});

OrderClassStyle.fromJson(Map<String, dynamic> json) {
name = json['name'];
desc = json['desc'];
title = json['title'];
customFeaturesCate = json['custom_features_cate'];
moduleType = json['module_type'];
moduleKey = json['module_key'];
isTopMargin = json['is_top_margin'];
isLeftRightMargin = json['is_left_right_margin'];
isShow = json['is_show'];
topMargin = json['top_margin'];
leftRightMargin = json['left_right_margin'];
topLeftRadius = json['top_left_radius'];
topRightRadius = json['top_right_radius'];
bottomLeftRadius = json['bottom_left_radius'];
bottomRightRadius = json['bottom_right_radius'];
bgColor = json['bg_color'];
subTitle = json['sub_title'];
if (json['list_style'] != null) {
listStyle = new List<ListStyle>();
json['list_style'].forEach((v) {
listStyle.add(new ListStyle.fromJson(v));
});
}
columSize = json['colum_size'];
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['name'] = this.name;
data['desc'] = this.desc;
data['title'] = this.title;
data['custom_features_cate'] = this.customFeaturesCate;
data['module_type'] = this.moduleType;
data['module_key'] = this.moduleKey;
data['is_top_margin'] = this.isTopMargin;
data['is_left_right_margin'] = this.isLeftRightMargin;
data['is_show'] = this.isShow;
data['top_margin'] = this.topMargin;
data['left_right_margin'] = this.leftRightMargin;
data['top_left_radius'] = this.topLeftRadius;
data['top_right_radius'] = this.topRightRadius;
data['bottom_left_radius'] = this.bottomLeftRadius;
data['bottom_right_radius'] = this.bottomRightRadius;
data['bg_color'] = this.bgColor;
data['sub_title'] = this.subTitle;
if (this.listStyle != null) {
data['list_style'] = this.listStyle.map((v) => v.toJson()).toList();
}
data['colum_size'] = this.columSize;
return data;
}
}

class ListStyle {
String idx;
String title;
String img;
Data data;
String imgUrl;
String subTitle;
String isShow;
String rightIcon;
String rightIconUrl;
String skipIdentifier;
String requiredLogin;
String requiredTaobaoAuth;
String isJump;
String cateTag;
String skipName;

ListStyle(
{this.idx,
this.title,
this.img,
this.data,
this.imgUrl,
this.subTitle,
this.isShow,
this.rightIcon,
this.rightIconUrl,
this.skipIdentifier,
this.requiredLogin,
this.requiredTaobaoAuth,
this.isJump,
this.cateTag,
this.skipName});

ListStyle.fromJson(Map<String, dynamic> json) {
idx = json['idx'];
title = json['title'];
img = json['img'];
data = json['data'] != null ? new Data.fromJson(json['data']) : null;
imgUrl = json['img_url'];
subTitle = json['sub_title'];
isShow = json['is_show'];
rightIcon = json['right_icon'];
rightIconUrl = json['right_icon_url'];
skipIdentifier = json['skip_identifier'];
requiredLogin = json['required_login'];
requiredTaobaoAuth = json['required_taobao_auth'];
isJump = json['is_jump'];
cateTag = json['cate_tag'];
skipName = json['skip_name'];
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['idx'] = this.idx;
data['title'] = this.title;
data['img'] = this.img;
if (this.data != null) {
data['data'] = this.data.toJson();
}
data['img_url'] = this.imgUrl;
data['sub_title'] = this.subTitle;
data['is_show'] = this.isShow;
data['right_icon'] = this.rightIcon;
data['right_icon_url'] = this.rightIconUrl;
data['skip_identifier'] = this.skipIdentifier;
data['required_login'] = this.requiredLogin;
data['required_taobao_auth'] = this.requiredTaobaoAuth;
data['is_jump'] = this.isJump;
data['cate_tag'] = this.cateTag;
data['skip_name'] = this.skipName;
return data;
}
}

class Data {
String sourceType;

Data({this.sourceType});

Data.fromJson(Map<String, dynamic> json) {
sourceType = json['source_type'];
}

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

+ 1
- 0
lib/zhiying_base_widget.dart View File

@@ -13,6 +13,7 @@ export 'package:amap_flutter_location/amap_flutter_location.dart';
export 'package:amap_flutter_location/amap_location_option.dart';
export 'package:tab_indicator_styler/tab_indicator_styler.dart';
export 'package:zhiying_base_widget/dialog/global_dialog/notification_setting_dialog/notification_setting_dialog.dart';
export 'pages/order_found_page/order_found_search_page/order_found_search_page.dart';

class ZhiyingBaseWidget {
static const MethodChannel _channel = const MethodChannel('zhiying_base_widget');


+ 2
- 2
pubspec.yaml View File

@@ -39,8 +39,8 @@ dependencies:
# image_gallery_saver: ^1.6.0
permission_handler:
git:
ref: 0.0.2
url: http://192.168.0.138:3000/FnuoOS_Flutter_Components/permission_handler.git
ref: 0.0.2

more_picture_share:
git:
@@ -63,8 +63,8 @@ dependencies:

zhiying_flutter_webview:
git:
ref: 0.0.4
url: http://192.168.0.138:3000/FnuoOS_ZhiYing/zhiying_flutter_webview.git
ref: 0.0.4

# 特效底部
# convex_bottom_bar: ^2.7.1+2


Loading…
Cancel
Save