diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index 9769b65..244869a 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -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 diff --git a/example/android/app/src/main/java/cn/zhios/zhiying_base_widget_example/MainActivity.java b/example/android/app/src/main/java/cn/zhios/zhiying_base_widget_example/MainActivity.java index 6f2cd4f..c2adee2 100644 --- a/example/android/app/src/main/java/cn/zhios/zhiying_base_widget_example/MainActivity.java +++ b/example/android/app/src/main/java/cn/zhios/zhiying_base_widget_example/MainActivity.java @@ -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 diff --git a/example/lib/main.dart b/example/lib/main.dart index 9fbd3b4..3e635cd 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -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 { // if (!currentFocus.hasPrimaryFocus && currentFocus.focusedChild != null) { // FocusManager.instance.primaryFocus.unfocus(); // } + +class TestPage extends StatefulWidget { + @override + _TestPageState createState() => _TestPageState(); +} + +class _TestPageState extends State { + @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())); + }, + ) + ], + ), + ), + ); + } +} diff --git a/lib/pages/custom_page/custom_item_page.dart b/lib/pages/custom_page/custom_item_page.dart index 7620bde..db43bb0 100644 --- a/lib/pages/custom_page/custom_item_page.dart +++ b/lib/pages/custom_page/custom_item_page.dart @@ -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( 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 result = []; for (int i = 0; i < datas.length; i++) { WidgetModel item = WidgetModel.fromJson(Map.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> 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.from(datas[i])); + if (item.modName == 'bottom_suspension') { + rlt = BottomPic(model: datas[i]); + break; + } + } + + return rlt ?? Container(); + } } diff --git a/lib/pages/custom_page/custom_page.dart b/lib/pages/custom_page/custom_page.dart index 8222b8c..be57a50 100644 --- a/lib/pages/custom_page/custom_page.dart +++ b/lib/pages/custom_page/custom_page.dart @@ -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'], ); diff --git a/lib/pages/order_found_page/order_found_result/order_found_result_bloc.dart b/lib/pages/order_found_page/order_found_result/order_found_result_bloc.dart new file mode 100644 index 0000000..db622c8 --- /dev/null +++ b/lib/pages/order_found_page/order_found_result/order_found_result_bloc.dart @@ -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 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 + } +} diff --git a/lib/pages/order_found_page/order_found_result/order_found_result_model.dart b/lib/pages/order_found_page/order_found_result/order_found_result_model.dart new file mode 100644 index 0000000..cdc1f1b --- /dev/null +++ b/lib/pages/order_found_page/order_found_result/order_found_result_model.dart @@ -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 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 toJson() { + final Map data = new Map(); + 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; + } +} \ No newline at end of file diff --git a/lib/pages/order_found_page/order_found_result/order_found_result_page.dart b/lib/pages/order_found_page/order_found_result/order_found_result_page.dart new file mode 100644 index 0000000..74eddc0 --- /dev/null +++ b/lib/pages/order_found_page/order_found_result/order_found_result_page.dart @@ -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 { + // 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 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), + ), + ), + ), + ], + ); + } +} diff --git a/lib/pages/order_found_page/order_found_search_page/model/order_found_search_style.dart b/lib/pages/order_found_page/order_found_search_page/model/order_found_search_style.dart new file mode 100644 index 0000000..1023e12 --- /dev/null +++ b/lib/pages/order_found_page/order_found_search_page/model/order_found_search_style.dart @@ -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 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 toJson() { + final Map data = new Map(); + 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 json) { + bgColor = json['bg_color']; + bgSubColor = json['bg_sub_color']; + str = json['str']; + strColor = json['str_color']; + } + + Map toJson() { + final Map data = new Map(); + 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 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 toJson() { + final Map data = new Map(); + 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 json) { + str = json['str']; + img = json['img']; + imgUrl = json['img_url']; + } + + Map toJson() { + final Map data = new Map(); + 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 json) { + title = json['title']; + content = json['content']; + } + + Map toJson() { + final Map data = new Map(); + data['title'] = this.title; + data['content'] = this.content; + return data; + } +} + +class ResultCss { + String btnBgColor; + String btnBgSubColor; + + ResultCss({this.btnBgColor, this.btnBgSubColor}); + + ResultCss.fromJson(Map json) { + btnBgColor = json['btn_bg_color']; + btnBgSubColor = json['btn_bg_sub_color']; + } + + Map toJson() { + final Map data = new Map(); + data['btn_bg_color'] = this.btnBgColor; + data['btn_bg_sub_color'] = this.btnBgSubColor; + return data; + } +} diff --git a/lib/pages/order_found_page/order_found_search_page/order_found_search_bloc.dart b/lib/pages/order_found_page/order_found_search_page/order_found_search_bloc.dart new file mode 100644 index 0000000..e0d17e3 --- /dev/null +++ b/lib/pages/order_found_page/order_found_search_page/order_found_search_bloc.dart @@ -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 + } +} diff --git a/lib/pages/order_found_page/order_found_search_page/order_found_search_page.dart b/lib/pages/order_found_page/order_found_search_page/order_found_search_page.dart new file mode 100644 index 0000000..ca3b246 --- /dev/null +++ b/lib/pages/order_found_page/order_found_search_page/order_found_search_page.dart @@ -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 { + 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), + ) + ], + ) + ], + ), + ); + } + +} diff --git a/lib/pages/orders_page/bloc/order_content_bloc.dart b/lib/pages/orders_page/bloc/order_content_bloc.dart index 0fdb46d..7265a84 100644 --- a/lib/pages/orders_page/bloc/order_content_bloc.dart +++ b/lib/pages/orders_page/bloc/order_content_bloc.dart @@ -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 _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); diff --git a/lib/pages/orders_page/bloc/order_page_bloc.dart b/lib/pages/orders_page/bloc/order_page_bloc.dart index 2eeed3e..634f715 100644 --- a/lib/pages/orders_page/bloc/order_page_bloc.dart +++ b/lib/pages/orders_page/bloc/order_page_bloc.dart @@ -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) { diff --git a/lib/pages/orders_page/bloc/order_search_bloc.dart b/lib/pages/orders_page/bloc/order_search_bloc.dart index d0ceb84..9d33ac4 100644 --- a/lib/pages/orders_page/bloc/order_search_bloc.dart +++ b/lib/pages/orders_page/bloc/order_search_bloc.dart @@ -14,6 +14,7 @@ class OrderSearchBloc extends BlocBase { int _page = 1; String _keyword = ''; + String source; @override void dispose() { _ordersController.close(); diff --git a/lib/pages/orders_page/order_content_page.dart b/lib/pages/orders_page/order_content_page.dart index d90d3ee..eb89fe6 100644 --- a/lib/pages/orders_page/order_content_page.dart +++ b/lib/pages/orders_page/order_content_page.dart @@ -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 { @override Widget build(BuildContext context) { return BlocProvider( - 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); diff --git a/lib/pages/orders_page/orders_page.dart b/lib/pages/orders_page/orders_page.dart index 46f1b50..be73bd8 100644 --- a/lib/pages/orders_page/orders_page.dart +++ b/lib/pages/orders_page/orders_page.dart @@ -67,7 +67,7 @@ class _OrdersPageState extends State { ) : 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(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 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, diff --git a/lib/register.dart b/lib/register.dart index d59174e..59e91a5 100644 --- a/lib/register.dart +++ b/lib/register.dart @@ -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))); } } diff --git a/lib/widgets/custom/bottom_pic/bottom_pic.dart b/lib/widgets/custom/bottom_pic/bottom_pic.dart new file mode 100644 index 0000000..21ff32d --- /dev/null +++ b/lib/widgets/custom/bottom_pic/bottom_pic.dart @@ -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 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 ?? "", + ), + ), + ); + } +} diff --git a/lib/widgets/custom/bottom_pic/bottom_pic_style.dart b/lib/widgets/custom/bottom_pic/bottom_pic_style.dart new file mode 100644 index 0000000..92f08c0 --- /dev/null +++ b/lib/widgets/custom/bottom_pic/bottom_pic_style.dart @@ -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 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 toJson() { + final Map data = new Map(); + 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; + } +} diff --git a/lib/widgets/custom/ordedr_class/order_class_nav/order_class_nav.dart b/lib/widgets/custom/ordedr_class/order_class_nav/order_class_nav.dart new file mode 100644 index 0000000..8573e1c --- /dev/null +++ b/lib/widgets/custom/ordedr_class/order_class_nav/order_class_nav.dart @@ -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 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 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 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), + ), + ], + ), + ), + ); + } +} diff --git a/lib/widgets/custom/ordedr_class/order_class_nav/order_class_style.dart b/lib/widgets/custom/ordedr_class/order_class_nav/order_class_style.dart new file mode 100644 index 0000000..cbb02bc --- /dev/null +++ b/lib/widgets/custom/ordedr_class/order_class_nav/order_class_style.dart @@ -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; + 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 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(); + json['list_style'].forEach((v) { + listStyle.add(new ListStyle.fromJson(v)); + }); + } + columSize = json['colum_size']; + } + + Map toJson() { + final Map data = new Map(); + 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 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 toJson() { + final Map data = new Map(); + 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 json) { + sourceType = json['source_type']; + } + + Map toJson() { + final Map data = new Map(); + data['source_type'] = this.sourceType; + return data; + } +} diff --git a/lib/zhiying_base_widget.dart b/lib/zhiying_base_widget.dart index ed9c031..dfe74eb 100644 --- a/lib/zhiying_base_widget.dart +++ b/lib/zhiying_base_widget.dart @@ -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'); diff --git a/pubspec.yaml b/pubspec.yaml index 8ff9ac7..f465504 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -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