diff --git a/lib/pages/custom_page/custom_item_page.dart b/lib/pages/custom_page/custom_item_page.dart index 68cd88a..488b0b7 100644 --- a/lib/pages/custom_page/custom_item_page.dart +++ b/lib/pages/custom_page/custom_item_page.dart @@ -61,7 +61,7 @@ class __CustomItemPageContainerState extends State<_CustomItemPageContainer> wit ScrollController _controller; RefreshController _refreshController; - final EventBus _eventBus = EventBus(); + EventBus _eventBus; /// 回到顶点 void _scrollTop() { @@ -89,6 +89,7 @@ class __CustomItemPageContainerState extends State<_CustomItemPageContainer> wit @override void initState() { _controller = ScrollController(); + _eventBus = EventBus(); _refreshController = RefreshController(initialRefresh: false); _initEvent();_controller.addListener(() { print(_controller.offset.toString()); @@ -103,6 +104,7 @@ class __CustomItemPageContainerState extends State<_CustomItemPageContainer> wit void dispose() { _controller?.dispose(); _refreshController?.dispose(); + _eventBus?.destroy(); super.dispose(); } diff --git a/lib/pages/goods_details_page/goods_details_page.dart b/lib/pages/goods_details_page/goods_details_page.dart index 2999bff..d0814e9 100644 --- a/lib/pages/goods_details_page/goods_details_page.dart +++ b/lib/pages/goods_details_page/goods_details_page.dart @@ -1,5 +1,6 @@ import 'dart:ui'; +import 'package:event_bus/event_bus.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:provider/provider.dart'; @@ -7,8 +8,9 @@ import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:zhiying_base_widget/pages/goods_details_page/bloc/goods_details_page_bloc.dart'; import 'package:zhiying_base_widget/pages/goods_details_page/bloc/goods_details_page_repository.dart'; import 'package:zhiying_base_widget/pages/goods_details_page/goods_details_page_sk.dart'; -import 'package:zhiying_base_widget/pages/goods_details_page/notifier/goods_details_page_notifier.dart'; + import 'package:zhiying_base_widget/pages/main_page/notifier/main_page_notifier.dart'; +import 'package:zhiying_base_widget/pages/main_page/notifier/main_page_bg_notifier.dart'; import 'package:zhiying_base_widget/widgets/goods_details/appbar/goods_details_appbar_widget.dart'; import 'package:zhiying_base_widget/widgets/goods_details/footer/goods_details_footer_widget.dart'; import 'package:zhiying_comm/zhiying_comm.dart'; @@ -36,6 +38,7 @@ class _GoodsDetailsPageState extends State { return MultiProvider( providers: [ /// 滑动通知 + ChangeNotifierProvider.value(value: MainPageBgNotifier()), ChangeNotifierProvider.value(value: MainPageNotifier()), ChangeNotifierProvider.value(value: GoodsDetailsAppBarColorNotifier()), ], @@ -62,6 +65,7 @@ class _GoodsDetailsContainerState extends State { ScrollController _controller; RefreshController _refreshController; final int BANNER_HEIGHT = 375 - 40; + EventBus _eventBus; void _onLoading() async { // await Future.delayed(Duration(milliseconds: 1000)); @@ -78,6 +82,7 @@ class _GoodsDetailsContainerState extends State { @override void initState() { + _eventBus = EventBus(); _refreshController = RefreshController(initialRefresh: false); _controller = ScrollController(); _controller.addListener(() { @@ -104,6 +109,7 @@ class _GoodsDetailsContainerState extends State { @override void dispose() { _controller?.dispose(); + _eventBus?.destroy(); _refreshController?.dispose(); super.dispose(); } @@ -167,12 +173,17 @@ class _GoodsDetailsContainerState extends State { print('商品详情页面item.modName ${item.modName}'); + if (item.modName == 'product') { + datas[i]['eventBus'] = _eventBus; + } + list.addAll(WidgetFactory.create( item.modName, isSliver: true, model: datas[i], )); } + if (list.length <= 0) { list.add(SliverToBoxAdapter( child: Container( diff --git a/lib/pages/goods_details_page/notifier/goods_details_page_notifier.dart b/lib/pages/goods_details_page/notifier/goods_details_page_notifier.dart deleted file mode 100644 index f8159e4..0000000 --- a/lib/pages/goods_details_page/notifier/goods_details_page_notifier.dart +++ /dev/null @@ -1,16 +0,0 @@ -import 'package:flutter/material.dart'; - -// class GoodsDetailsPageNotifier with ChangeNotifier { -// bool scrollEnd = false; -// -// // 加载更多数据 -// void loadMore() { -// scrollEnd = true; -// notifyListeners(); -// } -// -// void reset() { -// scrollEnd = false; -// notifyListeners(); -// } -// } diff --git a/lib/widgets/goods_details/counpon_description/counpon_description_widget.dart b/lib/widgets/goods_details/counpon_description/counpon_description_widget.dart deleted file mode 100644 index cbafae9..0000000 --- a/lib/widgets/goods_details/counpon_description/counpon_description_widget.dart +++ /dev/null @@ -1,61 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:zhiying_comm/zhiying_comm.dart'; - -/// -/// 优惠券说明 -/// -class CounponDescriptionWidget extends StatelessWidget { - final Map model; - - const CounponDescriptionWidget(this.model); - - @override - Widget build(BuildContext context) { - return Container( - margin: const EdgeInsets.symmetric(horizontal: 12.5), - width: double.infinity, - child:_getMainWidget(), - ); - } - - /// 主widget - Widget _getMainWidget() { - return Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - - /// 领券立减 - Padding(padding: const EdgeInsets.only(right: 5), child: _getButtom1Widget()), - - - /// 收货后返现 - Padding(padding: const EdgeInsets.only(right: 5), child: _getButtom2Widget()), - - - ], - ); - } - - /// 领券立减 - Widget _getButtom1Widget() { - return Container( - decoration: BoxDecoration( - color: HexColor.fromHex('#FFE0E0'), - borderRadius: BorderRadius.circular(50), - ), - padding: const EdgeInsets.only(left: 14, right: 14, top: 3, bottom: 3), - child: Text('领券立减100元', style: TextStyle(color: HexColor.fromHex('#FF4242'), fontSize: 11))); - } - - - /// 收货后返现 - Widget _getButtom2Widget() { - return Container( - decoration: BoxDecoration( - color: HexColor.fromHex('#FFEFDA'), - borderRadius: BorderRadius.circular(50), - ), - padding: const EdgeInsets.only(left: 14, right: 14, top: 3, bottom: 3), - child: Text('收货后返现5.5元', style: TextStyle(color: HexColor.fromHex('#B78107'), fontSize: 11))); - } -} diff --git a/lib/widgets/goods_details/coupon/counpon_widget.dart b/lib/widgets/goods_details/coupon/counpon_widget.dart index 2b36ed8..e25ecc3 100644 --- a/lib/widgets/goods_details/coupon/counpon_widget.dart +++ b/lib/widgets/goods_details/coupon/counpon_widget.dart @@ -89,8 +89,17 @@ class _CounponWidgetContainerState extends State { behavior: HitTestBehavior.opaque, child: Container( width: double.infinity, - color: Colors.white, - padding: const EdgeInsets.only(left: 12.5, right: 12.5, top: 12), + decoration: BoxDecoration( + color: HexColor.fromHex(model?.bgColor), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(ParseUtil.stringParseDouble(model?.topLeftRadius)), + topRight: Radius.circular(ParseUtil.stringParseDouble(model?.topRightRadius)), + bottomLeft: Radius.circular(ParseUtil.stringParseDouble(model?.bottomLeftRadius)), + bottomRight: Radius.circular(ParseUtil.stringParseDouble(model?.bottomRightRadius)) + ) + ), + margin: EdgeInsets.only(top: ParseUtil.stringParseDouble(model?.topMargin), left: ParseUtil.stringParseDouble(model?.leftRightMargin), right: ParseUtil.stringParseDouble(model?.leftRightMargin)), + padding: const EdgeInsets.only(left: 12.5, right: 12.5, top: 6, bottom: 6), child: Container( // color: Colors.red, width: double.infinity, @@ -98,7 +107,7 @@ class _CounponWidgetContainerState extends State { decoration: BoxDecoration( image: DecorationImage( image: CachedNetworkImageProvider( - model?.bg_img ?? '', + model?.bgImage ?? '', ), fit: BoxFit.fill)), alignment: Alignment.centerLeft, @@ -125,11 +134,11 @@ class _CounponWidgetContainerState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ /// 价格类型 - Text(model?.price_type ?? '¥ ', style: TextStyle(fontSize: 15, color: HexColor.fromHex(model?.price_type_color ?? '#FFFFFF'))), + Text('¥ ', style: TextStyle(fontSize: 15, color: HexColor.fromHex(model?.couponPriceColor ?? '#FFFFFF'))), /// 价格 Text(model?.coupon_price ?? '100', - style: TextStyle(fontSize: 30, color: HexColor.fromHex(model?.coupon_price_color ?? '#FFFFFF'), fontFamily: 'Din', package: 'zhiying_comm')), + style: TextStyle(fontSize: 30, color: HexColor.fromHex(model?.couponPriceColor ?? '#FFFFFF'), fontFamily: 'Din', package: 'zhiying_comm')), ], ); } @@ -140,12 +149,12 @@ class _CounponWidgetContainerState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ /// 标题 - Text(model?.coupon_title ?? '优惠券', style: TextStyle(fontSize: 17, color: HexColor.fromHex(model?.coupon_title_color ?? '#FFFFFF'))), + Text(model?.couponText ?? '优惠券', style: TextStyle(fontSize: 17, color: HexColor.fromHex(model?.couponTextColor ?? '#FFFFFF'))), /// 到期时间 Visibility( visible: !EmptyUtil.isEmpty(model?.coupon_endtime), - child: Text(model?.coupon_endtime ?? '有效期至2020-10-01', style: TextStyle(fontSize: 10, color: HexColor.fromHex(model?.coupon_time_color ?? '#FFFFFF')))) + child: Text(model?.coupon_endtime ?? '有效期至2020-10-01', style: TextStyle(fontSize: 10, color: HexColor.fromHex(model?.couponTimeColor ?? '#FFFFFF')))) ], ); } diff --git a/lib/widgets/goods_details/coupon/model/counpon_model.dart b/lib/widgets/goods_details/coupon/model/counpon_model.dart index 94bbb10..3f8c8c2 100644 --- a/lib/widgets/goods_details/coupon/model/counpon_model.dart +++ b/lib/widgets/goods_details/coupon/model/counpon_model.dart @@ -1,77 +1,125 @@ class CounponModel { - String bg_img; - String coupon_endtime; - String coupon_price; - String coupon_price_color; - String coupon_time_color; - String coupon_title; - String coupon_title_color; - String coupon_url; - String price_type; - String price_type_color; - String buy_url; String provider; String good_id; + ConvertArgs convertArgs; - String commission; + String coupon_endtime; + String coupon_price; + String coupon_url; + + 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 couponText; + String couponTextColor; + String couponPriceColor; + String couponTimeColor; + String bgImage; CounponModel({ this.good_id, this.provider, - this.bg_img, this.coupon_endtime, this.coupon_price, - this.coupon_price_color, - this.coupon_time_color, - this.coupon_title, - this.coupon_title_color, this.coupon_url, - this.price_type, - this.price_type_color, - this.buy_url, this.convertArgs, - this.commission, + + 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.couponText, + this.couponTextColor, + this.couponPriceColor, + this.couponTimeColor, + this.bgImage }); - factory CounponModel.fromJson(Map json) { - return CounponModel( - good_id: json['good_id'], - provider: json['provider'], - bg_img: json['bg_img'], - coupon_endtime: json['coupon_endtime'], - coupon_price: json['coupon_price'], - coupon_price_color: json['coupon_price_color'], - coupon_time_color: json['coupon_time_color'], - coupon_title: json['coupon_title'], - coupon_title_color: json['coupon_title_color'], - coupon_url: json['coupon_url'], - price_type: json['price_type'], - price_type_color: json['price_type_color'], - buy_url: json['buy_url'], - convertArgs: json['convert_args'] != null ? ConvertArgs.fromJson(json['convert_args']) : null, - commission: json['commission'], - ); + CounponModel.fromJson(Map json) { + good_id = json['good_id']; + provider = json['provider']; + coupon_endtime = json['coupon_endtime']; + coupon_price = json['coupon_price']; + coupon_url = json['coupon_url']; + convertArgs = json['convert_args'] != null ? ConvertArgs.fromJson(json['convert_args']) : null; + + + 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']; + couponText = json['coupon_text']; + couponTextColor = json['coupon_text_color']; + couponPriceColor = json['coupon_price_color']; + couponTimeColor = json['coupon_time_color']; + bgImage = json['bg_image']; + + } Map toJson() { final Map data = new Map(); - data['bg_img'] = this.bg_img; data['coupon_endtime'] = this.coupon_endtime; data['coupon_price'] = this.coupon_price; - data['coupon_price_color'] = this.coupon_price_color; - data['coupon_time_color'] = this.coupon_time_color; - data['coupon_title'] = this.coupon_title; - data['coupon_title_color'] = this.coupon_title_color; data['coupon_url'] = this.coupon_url; - data['price_type'] = this.price_type; - data['price_type_color'] = this.price_type_color; - data['buy_url'] = this.buy_url; data['provider'] = this.provider; data['good_id'] = this.good_id; if (this.convertArgs != null) { data['convert_args'] = this.convertArgs.toJson(); } - data['commission'] = this.commission; + + 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['coupon_text'] = this.couponText; + data['coupon_text_color'] = this.couponTextColor; + data['coupon_price_color'] = this.couponPriceColor; + data['coupon_time_color'] = this.couponTimeColor; + data['bg_image'] = this.bgImage; + + return data; } } diff --git a/lib/widgets/goods_details/detail_img/goods_details_img.dart b/lib/widgets/goods_details/detail_img/goods_details_img.dart index 54e4ac1..d6301c0 100644 --- a/lib/widgets/goods_details/detail_img/goods_details_img.dart +++ b/lib/widgets/goods_details/detail_img/goods_details_img.dart @@ -137,10 +137,18 @@ class _GoodsDetailsImgWidgetContainerState extends State image_detail_list; - String title; - String title_color; String provider; String good_id; + + String name; + String desc; String icon; + String title; + 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 titleColor; GoodsDetailsImgModel({ this.image_detail_list, - this.title, - this.title_color, this.provider, this.good_id, - this.icon + this.name, + this.desc, + this.icon, + this.title, + 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.titleColor, }); - factory GoodsDetailsImgModel.fromJson(Map json) { - return GoodsDetailsImgModel( - image_detail_list: json['image_detail_list'] != null ? new List.from(json['image_detail_list']) : null, - title: json['title'], - title_color: json['title_color'], - provider: json['provider'], - good_id: json['good_id'], - icon: json['icon'] - ); + GoodsDetailsImgModel.fromJson(Map json) { + image_detail_list = json['image_detail_list'] != null ? new List.from(json['image_detail_list']) : null; + provider = json['provider']; + good_id = json['good_id']; + + name = json['name']; + desc = json['desc']; + icon = json['icon']; + title = json['title']; + 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']; + titleColor = json['title_color']; } - GoodsDetailsImgModel copyWith(List newImgs){ + GoodsDetailsImgModel copyWith(List newImgs) { return GoodsDetailsImgModel( image_detail_list: newImgs, - title: title, - title_color: title_color, provider: provider, good_id: good_id, icon: icon, + titleColor: titleColor, + title: title, + name: name, + desc: desc, + moduleKey: moduleKey, + moduleType: moduleType, + isTopMargin: isTopMargin, + isLeftRightMargin: isLeftRightMargin, + isShow: isShow, + topMargin: topMargin, + leftRightMargin: leftRightMargin, + topLeftRadius: topLeftRadius, + topRightRadius: topRightRadius, + bottomLeftRadius: bottomLeftRadius, + bottomRightRadius: bottomRightRadius, + bgColor: bgColor, ); } Map toJson() { final Map data = new Map(); - data['title'] = this.title; - data['title_color'] = this.title_color; if (this.image_detail_list != null) { data['image_detail_list'] = this.image_detail_list; } data['provider'] = this.provider; data['good_id'] = this.good_id; + + data['name'] = this.name; + data['desc'] = this.desc; data['icon'] = this.icon; + data['title'] = this.title; + 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['title_color'] = this.titleColor; + return data; } } diff --git a/lib/widgets/goods_details/evaluate/goods_details_evaluate_widget.dart b/lib/widgets/goods_details/evaluate/goods_details_evaluate_widget.dart index 938d758..130bbfc 100644 --- a/lib/widgets/goods_details/evaluate/goods_details_evaluate_widget.dart +++ b/lib/widgets/goods_details/evaluate/goods_details_evaluate_widget.dart @@ -13,12 +13,12 @@ import 'package:provider/provider.dart'; /// 商品详情评价Widget /// class GoodsDetailsEvaluateWidget extends StatelessWidget { - final Map model; - GoodsDetailsEvaluateModel _modell; + final Map data; + GoodsDetailsEvaluateModel _model; - GoodsDetailsEvaluateWidget(this.model, {Key key}) : super(key: key) { + GoodsDetailsEvaluateWidget(this.data, {Key key}) : super(key: key) { try { - _modell = GoodsDetailsEvaluateModel.fromJson(jsonDecode(model['data'])); + _model = GoodsDetailsEvaluateModel.fromJson(jsonDecode(data['data'])); } catch (e) { Logger.log('GoodsDetailsEvaluateWidget e = $e}'); } @@ -40,11 +40,11 @@ class GoodsDetailsEvaluateWidget extends StatelessWidget { return; } TradeResult result; - if (!EmptyUtil.isEmpty(_modell?.comment_url)) { + if (!EmptyUtil.isEmpty(_model?.comment_url)) { if (Platform.isAndroid) { - result = await FlutterAlibc.openByUrl(url: _modell?.comment_url, backUrl: "alisdk://"); + result = await FlutterAlibc.openByUrl(url: _model?.comment_url, backUrl: "alisdk://"); } else if (Platform.isIOS) { - result = await FlutterAlibc.openByUrl(url: _modell?.comment_url); + result = await FlutterAlibc.openByUrl(url: _model?.comment_url); } Logger.debug('${result.errorCode} ${result.errorMessage} '); } @@ -55,16 +55,24 @@ class GoodsDetailsEvaluateWidget extends StatelessWidget { _user = Provider.of(context).userInfo; return Visibility( - visible: !EmptyUtil.isEmpty(_modell?.comment_url), + visible: !EmptyUtil.isEmpty(_model?.comment_url), child: GestureDetector( onTap: () => _openLookMore(context), behavior: HitTestBehavior.opaque, child: Container( - color: Colors.white, - margin: const EdgeInsets.only(top: 6), + decoration: BoxDecoration( + color: HexColor.fromHex(_model?.bgColor), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(ParseUtil.stringParseDouble(_model?.topLeftRadius)), + topRight: Radius.circular(ParseUtil.stringParseDouble(_model?.topRightRadius)), + bottomLeft: Radius.circular(ParseUtil.stringParseDouble(_model?.bottomLeftRadius)), + bottomRight: Radius.circular(ParseUtil.stringParseDouble(_model?.bottomRightRadius)), + ) + ), + margin: EdgeInsets.only(top: ParseUtil.stringParseDouble(_model?.topMargin), left: ParseUtil.stringParseDouble(_model?.leftRightMargin), right: ParseUtil.stringParseDouble(_model?.leftRightMargin)), width: double.infinity, padding: const EdgeInsets.only(top: 15, bottom: 15, left: 12.5, right: 12.5), - child: getMainWidget(_modell), + child: getMainWidget(_model), ), ), ); @@ -76,7 +84,18 @@ class GoodsDetailsEvaluateWidget extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ getLeftWidget(model), - Text(model?.more ?? '查看更多 >', style: TextStyle(color: HexColor.fromHex(model?.more_color ?? '#999999'), fontSize: 11)), + getRightWidget(model), + ], + ); + } + + /// 查看更多 + Widget getRightWidget(GoodsDetailsEvaluateModel model) { + return Row( + children: [ + Text(model?.moreText ?? '查看更多', style: TextStyle(color: HexColor.fromHex(model?.more_color ?? '#999999'), fontSize: 12)), + const SizedBox(width: 2.5,), + CachedNetworkImage(imageUrl: model?.moreIcon, width: 12), ], ); } @@ -86,11 +105,11 @@ class GoodsDetailsEvaluateWidget extends StatelessWidget { return Row( children: [ CachedNetworkImage( - imageUrl: model?.icon ?? '', + imageUrl: model?.titleIcon ?? '', width: 12, ), - const SizedBox(width: 2.5), - Text(model?.title ?? '宝贝评价', style: TextStyle(color: HexColor.fromHex(model?.title_color ?? '#333333'), fontSize: 12)), + const SizedBox(width: 7), + Text(model?.title ?? '宝贝评价', style: TextStyle(color: HexColor.fromHex(model?.titleColor ?? '#333333'), fontSize: 12)), ], ); } diff --git a/lib/widgets/goods_details/evaluate/model/goods_details_evaluate_model.dart b/lib/widgets/goods_details/evaluate/model/goods_details_evaluate_model.dart index f5dafc4..5ce72dd 100644 --- a/lib/widgets/goods_details/evaluate/model/goods_details_evaluate_model.dart +++ b/lib/widgets/goods_details/evaluate/model/goods_details_evaluate_model.dart @@ -1,39 +1,103 @@ class GoodsDetailsEvaluateModel { String comment_url; - String more; String more_color; + + String name; + String desc; String title; - String title_color; - String icon; + 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 titleColor; + String titleIcon; + String moreText; + String moreIcon; GoodsDetailsEvaluateModel({ this.comment_url, - this.more, this.more_color, this.title, - this.title_color, - this.icon, + 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.titleColor, + this.titleIcon, + this.moreText, + this.moreIcon }); - factory GoodsDetailsEvaluateModel.fromJson(Map json) { - return GoodsDetailsEvaluateModel( - comment_url: json['comment_url'], - more: json['more'], - more_color: json['more_color'], - title: json['title'], - title_color: json['title_color'], - icon: json['icon'], - ); + GoodsDetailsEvaluateModel.fromJson(Map json) { + comment_url = json['comment_url']; + more_color = json['more_color']; + title = json['title']; + + name = json['name']; + desc = json['desc']; + title = json['title']; + 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']; + titleColor = json['title_color']; + titleIcon = json['title_icon']; + moreText = json['more_text']; + moreIcon = json['more_icon']; } Map toJson() { final Map data = new Map(); data['comment_url'] = this.comment_url; - data['more'] = this.more; data['more_color'] = this.more_color; data['title'] = this.title; - data['title_color'] = this.title_color; - data['icon'] = this.icon; + + data['name'] = this.name; + data['desc'] = this.desc; + data['title'] = this.title; + 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['title_color'] = this.titleColor; + data['title_icon'] = this.titleIcon; + data['more_text'] = this.moreText; + data['more_icon'] = this.moreIcon; + return data; } } diff --git a/lib/widgets/goods_details/footer/goods_details_footer_widget.dart b/lib/widgets/goods_details/footer/goods_details_footer_widget.dart index 0100489..ce0f22e 100644 --- a/lib/widgets/goods_details/footer/goods_details_footer_widget.dart +++ b/lib/widgets/goods_details/footer/goods_details_footer_widget.dart @@ -137,7 +137,13 @@ class _GoodsDetailsFooterContainerState extends State<_GoodsDetailsFooterContain // BoxShadow(color: Colors.grey[300], offset: Offset(0.0, 0.0), blurRadius: 5.0, spreadRadius: 2.0), // BoxShadow(color: Colors.grey[300], offset: Offset(0.0, 0.0)), // ], - color: Colors.white, + color: HexColor.fromHex(model?.bgColor), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(ParseUtil.stringParseDouble(model?.topLeftRadius)), + topRight: Radius.circular(ParseUtil.stringParseDouble(model?.topRightRadius)), + bottomLeft: Radius.circular(ParseUtil.stringParseDouble(model?.bottomLeftRadius)), + bottomRight: Radius.circular(ParseUtil.stringParseDouble(model?.bottomRightRadius)), + ) ), child: Container(height: 44, child: _getMainWidet(model)), ), @@ -170,14 +176,14 @@ class _GoodsDetailsFooterContainerState extends State<_GoodsDetailsFooterContain onTap: () => _openHome(), child: Padding( padding: const EdgeInsets.only(right: 35), - child: _getCustomWidget(model?.home ?? '首页', model?.home_color ?? '999999', model?.home_icon ?? ''), + child: _getCustomWidget(model?.listStyle?.leftIcon1?.text ?? '首页', model?.listStyle?.leftIcon1?.color ?? '999999', model?.listStyle?.leftIcon1?.beforeIcon ?? ''), )), GestureDetector( behavior: HitTestBehavior.opaque, onTap: () => _collectOnClick(model), child: Padding( padding: const EdgeInsets.only(right: 0), - child: _getCustomWidget(model?.collect ?? '收藏', model?.collect_color ?? '999999', model?.isFav == '0' ? model?.collect_icon ?? '' : model?.collected_icon ?? ''))) + child: _getCustomWidget(model?.listStyle?.leftIcon2?.text ?? '收藏', model?.listStyle?.leftIcon2?.color ?? '999999', model?.isFav == '0' ? model?.listStyle?.leftIcon2?.beforeIcon ?? '' : model?.listStyle?.leftIcon2?.afterIcon ?? ''))) ], ); } @@ -205,7 +211,7 @@ class _GoodsDetailsFooterContainerState extends State<_GoodsDetailsFooterContain // padding: const EdgeInsets.only(left: 30, right: 30, top: 5, bottom: 5), decoration: BoxDecoration( gradient: LinearGradient( - colors: [HexColor.fromHex(model?.share_earn_bg1_color ?? '#FFCA66'), HexColor.fromHex(model?.share_earn_bg2_color ?? '#FFD961')], + colors: [HexColor.fromHex(/*model?.share_earn_bg1_color ??*/ '#FFCA66'), HexColor.fromHex(/*model?.share_earn_bg2_color ??*/ '#FFD961')], begin: Alignment.centerLeft, end: Alignment.centerRight), borderRadius: BorderRadius.only(bottomLeft: Radius.circular(25), topLeft: Radius.circular(25))), @@ -214,16 +220,16 @@ class _GoodsDetailsFooterContainerState extends State<_GoodsDetailsFooterContain mainAxisAlignment: MainAxisAlignment.center, children: [ RichText( - text: TextSpan(text: '¥ ', style: TextStyle(fontSize: 12, color: HexColor.fromHex(model?.share_earn_val_color ?? 'FFFFFF')), children: [ + text: TextSpan(text: '¥ ', style: TextStyle(fontSize: 12, color: HexColor.fromHex(model?.listStyle?.rightIcon1?.color ?? 'FFFFFF')), children: [ TextSpan( text: model?.share_value ?? '0.0', style: TextStyle( - fontSize: 15, fontWeight: FontWeight.bold, color: HexColor.fromHex(model?.share_earn_color ?? '#FFFFFF'), fontFamily: 'Din', package: 'zhiying_comm')), + fontSize: 15, fontWeight: FontWeight.bold, color: HexColor.fromHex(model?.listStyle?.rightIcon1?.color ?? '#FFFFFF'), fontFamily: 'Din', package: 'zhiying_comm')), ]), ), Text( - model?.share_earn ?? '分享赚', - style: TextStyle(color: HexColor.fromHex(model?.share_earn_color ?? '#FFFFFF'), fontSize: 12), + model?.listStyle?.rightIcon1?.text ?? '分享赚', + style: TextStyle(color: HexColor.fromHex(model?.listStyle?.rightIcon1?.color ?? '#FFFFFF'), fontSize: 12), ), ], ), @@ -243,7 +249,7 @@ class _GoodsDetailsFooterContainerState extends State<_GoodsDetailsFooterContain width: 110, decoration: BoxDecoration( gradient: LinearGradient( - colors: [HexColor.fromHex(model?.save_earn_bg1_color ?? '#FF6969'), HexColor.fromHex(model?.save_earn_bg2_color ?? '#FF4646')], + colors: [HexColor.fromHex(/*model?.save_earn_bg1_color ??*/ '#FF6969'), HexColor.fromHex(/*model?.save_earn_bg2_color ??*/ '#FF4646')], begin: Alignment.centerLeft, end: Alignment.centerRight), borderRadius: BorderRadius.only(bottomRight: Radius.circular(25), topRight: Radius.circular(25))), @@ -252,19 +258,19 @@ class _GoodsDetailsFooterContainerState extends State<_GoodsDetailsFooterContain mainAxisAlignment: MainAxisAlignment.center, children: [ RichText( - text: TextSpan(text: '¥ ', style: TextStyle(fontSize: 12, color: HexColor.fromHex(model?.save_earn_val_color ?? 'FFFFFF')), children: [ + text: TextSpan(text: '¥ ', style: TextStyle(fontSize: 12, color: HexColor.fromHex(model?.listStyle?.rightIcon2?.color ?? 'FFFFFF')), children: [ TextSpan( text: model?.self_buy_value ?? '0.0', style: TextStyle( fontSize: 15, fontWeight: FontWeight.bold, - color: HexColor.fromHex(model?.save_earn_val_color ?? '#FFFFFF'), + color: HexColor.fromHex(model?.listStyle?.rightIcon2?.color ?? '#FFFFFF'), fontFamily: 'Din', package: 'zhiying_comm', )), ]), ), - Text(model?.save_earn ?? '自购省', style: TextStyle(color: HexColor.fromHex(model?.save_earn_color ?? '#FFFFFF'), fontSize: 12)) + Text(model?.listStyle?.rightIcon2?.text ?? '自购省', style: TextStyle(color: HexColor.fromHex(model?.listStyle?.rightIcon2?.color ?? '#FFFFFF'), fontSize: 12)) ], ), ), diff --git a/lib/widgets/goods_details/footer/model/goods_details_footer_model.dart b/lib/widgets/goods_details/footer/model/goods_details_footer_model.dart index 1a04d18..6a9065b 100644 --- a/lib/widgets/goods_details/footer/model/goods_details_footer_model.dart +++ b/lib/widgets/goods_details/footer/model/goods_details_footer_model.dart @@ -1,21 +1,23 @@ + +import 'package:zhiying_comm/zhiying_comm.dart'; + class GoodsDetailsFooterModel { - String collect; - String collect_color; - String collect_icon; - String collected_icon; - String home; - String home_color; - String home_icon; - String save_earn; - String save_earn_bg1_color; - String save_earn_bg2_color; - String save_earn_color; - String save_earn_val_color; - String share_earn; - String share_earn_bg1_color; - String share_earn_bg2_color; - String share_earn_color; - String share_earn_val_color; + 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; + ListStyle listStyle; + String share_value; String self_buy_value; @@ -24,10 +26,40 @@ class GoodsDetailsFooterModel { String shareUrl; FavArgs favArgs; ShareUrlArgs shareUrlArgs; - + ConvertArgs convertArgs; String provider; String good_id; - ConvertArgs convertArgs; + + factory GoodsDetailsFooterModel.fromJson(Map json) { + return GoodsDetailsFooterModel( + isFav: json['is_fav'], + buyUrl: json['buy_url'], + shareUrl: json['share_url'], + favArgs: json['fav_args'] != null ? new FavArgs.fromJson(json['fav_args']) : null, + shareUrlArgs: json['share_url_args'] != null ? new ShareUrlArgs.fromJson(json['share_url_args']) : null, + share_value: json['share_value'], + self_buy_value: json['self_buy_value'], + good_id: json['good_id'], + provider: json['provider'], + convertArgs: json['convert_args'] != null ? ConvertArgs.fromJson(json['convert_args']) : null, + // 修改 + 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'], + listStyle : json['list_style'] != null? new ListStyle.fromJson(json['list_style']): null + ); + } GoodsDetailsFooterModel({ this.buyUrl, @@ -35,84 +67,34 @@ class GoodsDetailsFooterModel { this.isFav, this.shareUrl, this.shareUrlArgs, - this.collect, - this.collect_color, - this.collect_icon, - this.home, - this.home_color, - this.home_icon, - this.save_earn, - this.save_earn_bg1_color, - this.save_earn_bg2_color, - this.save_earn_color, - this.save_earn_val_color, - this.share_earn, - this.share_earn_bg1_color, - this.share_earn_bg2_color, - this.share_earn_color, - this.share_earn_val_color, this.share_value, this.self_buy_value, - this.collected_icon, this.good_id, this.provider, this.convertArgs, + // 修改 + 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.listStyle, }); - factory GoodsDetailsFooterModel.fromJson(Map json) { - return GoodsDetailsFooterModel( - isFav: json['is_fav'], - buyUrl: json['buy_url'], - shareUrl: json['share_url'], - favArgs: json['fav_args'] != null ? new FavArgs.fromJson(json['fav_args']) : null, - shareUrlArgs: json['share_url_args'] != null ? new ShareUrlArgs.fromJson(json['share_url_args']) : null, - collect: json['collect'], - collect_color: json['collect_color'], - collect_icon: json['collect_icon'], - home: json['home'], - home_color: json['home_color'], - home_icon: json['home_icon'], - save_earn: json['save_earn'], - save_earn_bg1_color: json['save_earn_bg1_color'], - save_earn_bg2_color: json['save_earn_bg2_color'], - save_earn_color: json['save_earn_color'], - save_earn_val_color: json['save_earn_val_color'], - share_earn: json['share_earn'], - share_earn_bg1_color: json['share_earn_bg1_color'], - share_earn_bg2_color: json['share_earn_bg2_color'], - share_earn_color: json['share_earn_color'], - share_earn_val_color: json['share_earn_val_color'], - share_value: json['share_value'], - self_buy_value: json['self_buy_value'], - collected_icon: json['collected_icon'], - good_id: json['good_id'], - provider: json['provider'], - convertArgs: json['convert_args'] != null ? ConvertArgs.fromJson(json['convert_args']) : null, - ); - } - Map toJson() { final Map data = new Map(); - data['collect'] = this.collect; - data['collect_color'] = this.collect_color; - data['collect_icon'] = this.collect_icon; - data['home'] = this.home; - data['home_color'] = this.home_color; - data['home_icon'] = this.home_icon; - data['save_earn'] = this.save_earn; - data['save_earn_bg1_color'] = this.save_earn_bg1_color; - data['save_earn_bg2_color'] = this.save_earn_bg2_color; - data['save_earn_color'] = this.save_earn_color; - data['save_earn_val_color'] = this.save_earn_val_color; - data['share_earn'] = this.share_earn; - data['share_earn_bg1_color'] = this.share_earn_bg1_color; - data['share_earn_bg2_color'] = this.share_earn_bg2_color; - data['share_earn_color'] = this.share_earn_color; - data['share_earn_val_color'] = this.share_earn_val_color; + data['share_value'] = this.share_value; data['self_buy_value'] = this.self_buy_value; - data['collected_icon'] = this.collected_icon; - data['is_fav'] = this.isFav; data['buy_url'] = this.buyUrl; data['share_url'] = this.shareUrl; @@ -122,13 +104,30 @@ class GoodsDetailsFooterModel { if (this.shareUrlArgs != null) { data['share_url_args'] = this.shareUrlArgs.toJson(); } - data['provider'] = this.provider; data['good_id'] = this.good_id; if (this.convertArgs != null) { data['convert_args'] = this.convertArgs.toJson(); } + 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; + if (this.listStyle != null) { + data['list_style'] = this.listStyle.toJson(); + } + return data; } } @@ -148,20 +147,19 @@ class FavArgs { String inorderCount; Null detailData; - FavArgs( - {this.provider, - this.providerName, - this.goodId, - this.goodImage, - this.goodTitle, - this.shopName, - this.coupon, - this.couponUrl, - this.commission, - this.marketPrice, - this.currentPrice, - this.inorderCount, - this.detailData}); + FavArgs({this.provider, + this.providerName, + this.goodId, + this.goodImage, + this.goodTitle, + this.shopName, + this.coupon, + this.couponUrl, + this.commission, + this.marketPrice, + this.currentPrice, + this.inorderCount, + this.detailData}); FavArgs.fromJson(Map json) { provider = json['provider']; @@ -268,3 +266,185 @@ class ConvertArgs { return data; } } + + +class ListStyle { + LeftIcon1 leftIcon1; + LeftIcon1 leftIcon2; + RightIcon1 rightIcon1; + RightIcon1 rightIcon2; + BuyBubbleTip buyBubbleTip; + BuyBubbleTip buyShareTip; + + ListStyle({this.leftIcon1, + this.leftIcon2, + this.rightIcon1, + this.rightIcon2, + this.buyBubbleTip, + this.buyShareTip}); + + ListStyle.fromJson(Map json) { + leftIcon1 = json['left_icon1'] != null + ? new LeftIcon1.fromJson(json['left_icon1']) + : null; + leftIcon2 = json['left_icon2'] != null + ? new LeftIcon1.fromJson(json['left_icon2']) + : null; + rightIcon1 = json['right_icon1'] != null + ? new RightIcon1.fromJson(json['right_icon1']) + : null; + rightIcon2 = json['right_icon2'] != null + ? new RightIcon1.fromJson(json['right_icon2']) + : null; + buyBubbleTip = json['buy_bubble_tip'] != null + ? new BuyBubbleTip.fromJson(json['buy_bubble_tip']) + : null; + buyShareTip = json['buy_share_tip'] != null + ? new BuyBubbleTip.fromJson(json['buy_share_tip']) + : null; + } + + Map toJson() { + final Map data = new Map(); + if (this.leftIcon1 != null) { + data['left_icon1'] = this.leftIcon1.toJson(); + } + if (this.leftIcon2 != null) { + data['left_icon2'] = this.leftIcon2.toJson(); + } + if (this.rightIcon1 != null) { + data['right_icon1'] = this.rightIcon1.toJson(); + } + if (this.rightIcon2 != null) { + data['right_icon2'] = this.rightIcon2.toJson(); + } + if (this.buyBubbleTip != null) { + data['buy_bubble_tip'] = this.buyBubbleTip.toJson(); + } + if (this.buyShareTip != null) { + data['buy_share_tip'] = this.buyShareTip.toJson(); + } + return data; + } +} + +class LeftIcon1 extends SkipModel{ + String text; + String color; + String beforeIcon; + String afterIcon; + String skipIdentifier; + String requiredLogin; + String requiredTaobaoAuth; + String isJump; + + LeftIcon1({this.text, + this.color, + this.beforeIcon, + this.afterIcon, + this.skipIdentifier, + this.requiredLogin, + this.requiredTaobaoAuth, + this.isJump}); + + LeftIcon1.fromJson(Map json) { + super.fromJson(json); + text = json['text']; + color = json['color']; + beforeIcon = json['before_icon']; + afterIcon = json['after_icon']; + skipIdentifier = json['skip_identifier']; + requiredLogin = json['required_login']; + requiredTaobaoAuth = json['required_taobao_auth']; + isJump = json['is_jump']; + } + + Map toJson() { + final Map data = super.toJson(); + data['text'] = this.text; + data['color'] = this.color; + data['before_icon'] = this.beforeIcon; + data['after_icon'] = this.afterIcon; + data['skip_identifier'] = this.skipIdentifier; + data['required_login'] = this.requiredLogin; + data['required_taobao_auth'] = this.requiredTaobaoAuth; + data['is_jump'] = this.isJump; + return data; + } +} + +class RightIcon1 { + String text; + String color; + String btnStr; + String bgImage; + String functionType; + List sourceList; + + RightIcon1({this.text, + this.color, + this.btnStr, + this.bgImage, + this.functionType, + this.sourceList}); + + RightIcon1.fromJson(Map json) { + text = json['text']; + color = json['color']; + btnStr = json['btn_str']; + bgImage = json['bg_image']; + functionType = json['function_type']; + sourceList = json['source_list'].cast(); + } + + Map toJson() { + final Map data = new Map(); + data['text'] = this.text; + data['color'] = this.color; + data['btn_str'] = this.btnStr; + data['bg_image'] = this.bgImage; + data['function_type'] = this.functionType; + data['source_list'] = this.sourceList; + return data; + } +} + +class BuyBubbleTip { + String textStr; + String textColor; + String priceIcon; + String bgImage; + String closeIcon; + String isShow; + List sourceList; + + BuyBubbleTip({this.textStr, + this.textColor, + this.priceIcon, + this.bgImage, + this.closeIcon, + this.isShow, + this.sourceList}); + + BuyBubbleTip.fromJson(Map json) { + textStr = json['text_str']; + textColor = json['text_color']; + priceIcon = json['price_icon']; + bgImage = json['bg_image']; + closeIcon = json['close_icon']; + isShow = json['is_show']; + sourceList = json['source_list'].cast(); + } + + Map toJson() { + final Map data = new Map(); + data['text_str'] = this.textStr; + data['text_color'] = this.textColor; + data['price_icon'] = this.priceIcon; + data['bg_image'] = this.bgImage; + data['close_icon'] = this.closeIcon; + data['is_show'] = this.isShow; + data['source_list'] = this.sourceList; + return data; + } +} diff --git a/lib/widgets/goods_details/recommend/goods_detail_commend_creater.dart b/lib/widgets/goods_details/recommend/goods_detail_commend_creater.dart index bbf7a6f..82e2e27 100644 --- a/lib/widgets/goods_details/recommend/goods_detail_commend_creater.dart +++ b/lib/widgets/goods_details/recommend/goods_detail_commend_creater.dart @@ -50,9 +50,9 @@ class GoodsDetailCommendCreater extends WidgetCreater { Logger.warn(model?.toString()); return [ - SliverToBoxAdapter( - child: GoodsDetailsRecommendWidget(model), - ), + // SliverToBoxAdapter( + // child: GoodsDetailsRecommendWidget(model), + // ), GoodsDetailCommendList( model, provider: provider, // 猜你喜欢数据源暂无数据 diff --git a/lib/widgets/goods_details/recommend_title/goods_details_recommend_title_widget.dart b/lib/widgets/goods_details/recommend_title/goods_details_recommend_title_widget.dart new file mode 100644 index 0000000..c304d1e --- /dev/null +++ b/lib/widgets/goods_details/recommend_title/goods_details_recommend_title_widget.dart @@ -0,0 +1,72 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'model/goods_details_recommend_titile_model.dart'; +import 'package:zhiying_comm/zhiying_comm.dart'; + +/// +/// 商品详情的推荐列表小标题 +/// +class GoodsDetailsRecommendTitleWidget extends StatelessWidget { + final Map data; + GoodsDetailsRecommendTitileModel model; + + GoodsDetailsRecommendTitleWidget(this.data, {Key key}) : super(key: key) { + try { + model = GoodsDetailsRecommendTitileModel.fromJson(jsonDecode(data['data'])); + } catch (e, s) { + Logger.error(e, s); + } + } + + @override + Widget build(BuildContext context) { + + if( null == model) return Container(); + + return Container( + width: double.infinity, + margin: EdgeInsets.only(top: ParseUtil.stringParseDouble(model?.topMargin, defVal: 0), left: ParseUtil.stringParseDouble(model?.leftRightMargin), right: ParseUtil.stringParseDouble(model?.leftRightMargin)), + padding: EdgeInsets.only(top: 15, bottom: 15), + decoration: BoxDecoration( + color: HexColor.fromHex(model?.bgColor), + borderRadius: BorderRadius.only( + topRight: Radius.circular(ParseUtil.stringParseDouble(model?.topRightRadius)), + topLeft: Radius.circular(ParseUtil.stringParseDouble(model?.topLeftRadius)), + bottomRight: Radius.circular(ParseUtil.stringParseDouble(model?.bottomRightRadius)), + bottomLeft: Radius.circular(ParseUtil.stringParseDouble(model?.bottomLeftRadius)), + ) + ), + child: _buildMainWidget(), + ); + } + + Widget _buildMainWidget() { + Widget rlt; + switch(model?.moduleType ?? '') { + case 'product_detail_recommend_title1': + rlt = _buildWidgetStyle1(); + break; + default: + rlt = Container(); + break; + } + return rlt; + + } + + // module_type = product_detail_recommend_title1 + Widget _buildWidgetStyle1() { + return Container( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CachedNetworkImage(imageUrl: model?.icon ?? '', width: 15), + const SizedBox(width: 7.5), + Text(model?.title, style: TextStyle(color: HexColor.fromHex(model?.titleColor), fontSize: 14, fontWeight: FontWeight.bold),) + ], + ), + ); + } + +} diff --git a/lib/widgets/goods_details/recommend_title/model/goods_details_recommend_titile_model.dart b/lib/widgets/goods_details/recommend_title/model/goods_details_recommend_titile_model.dart new file mode 100644 index 0000000..9a6a912 --- /dev/null +++ b/lib/widgets/goods_details/recommend_title/model/goods_details_recommend_titile_model.dart @@ -0,0 +1,80 @@ +class GoodsDetailsRecommendTitileModel { + String name; + String desc; + String title; + String icon; + 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 titleColor; + + GoodsDetailsRecommendTitileModel( + {this.name, + this.desc, + this.title, + this.icon, + 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.titleColor}); + + GoodsDetailsRecommendTitileModel.fromJson(Map json) { + name = json['name']; + desc = json['desc']; + title = json['title']; + icon = json['icon']; + 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']; + titleColor = json['title_color']; + } + + Map toJson() { + final Map data = new Map(); + data['name'] = this.name; + data['desc'] = this.desc; + data['title'] = this.title; + data['icon'] = this.icon; + 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['title_color'] = this.titleColor; + return data; + } +} diff --git a/lib/widgets/goods_details/store/model/store_model.dart b/lib/widgets/goods_details/store/model/store_model.dart index 74ccb9b..c8de870 100644 --- a/lib/widgets/goods_details/store/model/store_model.dart +++ b/lib/widgets/goods_details/store/model/store_model.dart @@ -1,70 +1,143 @@ class StoreModel { - String description; - String description_color; - String description_leve_icon; - String logistics; - String logistics_color; - String logistics_leve_icon; - String more; - String service; - String service_color; - String service_leve_icon; String shop_id; String shop_name; - String shop_name_color; String shop_avatar; + // 宝贝描述 + String description; + // 物流服务 + String logistics; + // 服务态度 + String service; + + 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 shopTextColor; + String descTextColor1; + String descTextColor2; + String descTextColor3; + String moreText; + String moreTextColor; + String moreIcon; + String heightPointIcon; + String publicPointIcon; + String lowPointIcon; StoreModel({ this.description, - this.description_color, - this.description_leve_icon, this.logistics, - this.logistics_color, - this.logistics_leve_icon, - this.more, this.service, - this.service_color, - this.service_leve_icon, this.shop_id, this.shop_name, - this.shop_name_color, this.shop_avatar, + + 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.shopTextColor, + this.descTextColor1, + this.descTextColor2, + this.descTextColor3, + this.moreText, + this.moreTextColor, + this.moreIcon, + this.heightPointIcon, + this.publicPointIcon, + this.lowPointIcon + }); - factory StoreModel.fromJson(Map json) { - return StoreModel( - description: json['description'], - description_color: json['description_color'], - description_leve_icon: json['description_leve_icon'], - logistics: json['logistics'], - logistics_color: json['logistics_color'], - logistics_leve_icon: json['logistics_leve_icon'], - more: json['more'], - service: json['service'], - service_color: json['service_color'], - service_leve_icon: json['service_leve_icon'], - shop_id: json['shop_id'], - shop_name: json['shop_name'], - shop_name_color: json['shop_name_color'], - shop_avatar: json['shop_avatar']); + StoreModel.fromJson(Map json) { + description = json['description']; + logistics = json['logistics']; + service = json['service']; + shop_id = json['shop_id']; + shop_name = json['shop_name']; + shop_avatar = json['shop_avatar']; + + 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']; + shopTextColor = json['shop_text_color']; + descTextColor1 = json['desc_text_color1']; + descTextColor2 = json['desc_text_color2']; + descTextColor3 = json['desc_text_color3']; + moreText = json['more_text']; + moreTextColor = json['more_text_color']; + moreIcon = json['more_icon']; + heightPointIcon = json['height_point_icon']; + publicPointIcon = json['public_point_icon']; + lowPointIcon = json['low_point_icon']; + } Map toJson() { final Map data = new Map(); data['description'] = this.description; - data['description_color'] = this.description_color; - data['description_leve_icon'] = this.description_leve_icon; data['logistics'] = this.logistics; - data['logistics_color'] = this.logistics_color; - data['logistics_leve_icon'] = this.logistics_leve_icon; - data['more'] = this.more; data['service'] = this.service; - data['service_color'] = this.service_color; - data['service_leve_icon'] = this.service_leve_icon; data['shop_id'] = this.shop_id; data['shop_name'] = this.shop_name; - data['shop_name_color'] = this.shop_name_color; data['shop_avatar'] = this.shop_avatar; + + 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['shop_text_color'] = this.shopTextColor; + data['desc_text_color1'] = this.descTextColor1; + data['desc_text_color2'] = this.descTextColor2; + data['desc_text_color3'] = this.descTextColor3; + data['more_text'] = this.moreText; + data['more_text_color'] = this.moreTextColor; + data['more_icon'] = this.moreIcon; + data['height_point_icon'] = this.heightPointIcon; + data['public_point_icon'] = this.publicPointIcon; + data['low_point_icon'] = this.lowPointIcon; + return data; } } diff --git a/lib/widgets/goods_details/store/store_widget.dart b/lib/widgets/goods_details/store/store_widget.dart index 0b1e4dd..ea47d6b 100644 --- a/lib/widgets/goods_details/store/store_widget.dart +++ b/lib/widgets/goods_details/store/store_widget.dart @@ -83,10 +83,19 @@ class _StoreContainerState extends State { _onStoreClick(); }, child: Container( - color: Colors.white, width: double.infinity, height: 50 + 20.0 + 18, padding: const EdgeInsets.only(left: 12.5, right: 12.5, top: 20, bottom: 18), + margin: EdgeInsets.only(top: ParseUtil.stringParseDouble(model?.topMargin), left: ParseUtil.stringParseDouble(model?.leftRightMargin), right: ParseUtil.stringParseDouble(model?.leftRightMargin)), + decoration: BoxDecoration( + color: HexColor.fromHex(model?.bgColor), + borderRadius: BorderRadius.only( + topRight: Radius.circular(ParseUtil.stringParseDouble(model?.topRightRadius)), + topLeft: Radius.circular(ParseUtil.stringParseDouble(model?.topLeftRadius)), + bottomRight: Radius.circular(ParseUtil.stringParseDouble(model?.bottomRightRadius)), + bottomLeft: Radius.circular(ParseUtil.stringParseDouble(model?.bottomLeftRadius)), + ) + ), child: Row( children: [ /// 商家图片 @@ -133,14 +142,14 @@ class _StoreContainerState extends State { /// 商店名称 Text(model?.shop_name ?? '品胜京东自营旗舰店', style: TextStyle( - color: HexColor.fromHex(model?.shop_name_color ?? '#333333'), + color: HexColor.fromHex(model?.shopTextColor ?? '#333333'), fontSize: 13, fontWeight: FontWeight.bold)), /// 更多 TODO 暂时隐藏,等后台有数据后再打开 Visibility( visible: false, - child: Text(model?.more ?? '更多店铺优惠 >', style: TextStyle(color: HexColor.fromHex('#FF4242'), fontSize: 11))), + child: Text(model?.moreText ?? '更多店铺优惠', style: TextStyle(color: HexColor.fromHex('#FF4242'), fontSize: 11))), ], ); } @@ -151,16 +160,13 @@ class _StoreContainerState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ /// 宝贝描述 5.0 - _getCoustomWidet(model?.description ?? '宝贝描述 5.0', model?.description_color ?? '#999999', - model?.description_leve_icon ?? ''), + _getCoustomWidet(model?.description ?? '宝贝描述 5.0', model?.descTextColor1 ?? '#999999', model?.heightPointIcon ?? ''), /// 物流服务 5.0 - _getCoustomWidet( - model?.logistics ?? '宝贝描述 5.0', model?.logistics_color ?? '#999999', model?.logistics_leve_icon ?? ''), + _getCoustomWidet(model?.logistics ?? '宝贝描述 5.0', model?.descTextColor2 ?? '#999999', model?.publicPointIcon ?? ''), /// 服务态度 1.0 - _getCoustomWidet( - model?.service ?? '宝贝描述 5.0', model?.service_color ?? '#999999', model?.service_leve_icon ?? ''), + _getCoustomWidet(model?.service ?? '宝贝描述 5.0', model?.descTextColor3 ?? '#999999', model?.lowPointIcon ?? ''), ], ); } diff --git a/lib/widgets/goods_details/tag/goods_details_tag_widget.dart b/lib/widgets/goods_details/tag/goods_details_tag_widget.dart new file mode 100644 index 0000000..c2d33b1 --- /dev/null +++ b/lib/widgets/goods_details/tag/goods_details_tag_widget.dart @@ -0,0 +1,64 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:zhiying_base_widget/widgets/goods_details/tag/model/goods_details_tag_model.dart'; +import 'package:zhiying_comm/zhiying_comm.dart'; + +class GoodsDetailsTagWidget extends StatelessWidget { + final Map data; + GoodsDetailsTagModel _model; + + GoodsDetailsTagWidget(this.data, {Key key}) : super(key: key) { + try { + _model = GoodsDetailsTagModel.fromJson(jsonDecode(data['data'])); + } catch(e, s) { + Logger.error(e, s); + } + } + + @override + Widget build(BuildContext context) { + if(null == _model) return Container(); + return Container( + width: double.infinity, + margin: EdgeInsets.only(top: ParseUtil.stringParseDouble(_model?.topMargin), left: ParseUtil.stringParseDouble(_model?.leftRightMargin), right: ParseUtil.stringParseDouble(_model?.leftRightMargin)), + padding: const EdgeInsets.only(left: 12.5, right: 12.5, top: 6, bottom: 6), + decoration: BoxDecoration( + color: HexColor.fromHex(_model?.bgColor), + borderRadius: BorderRadius.only( + topRight: Radius.circular(ParseUtil.stringParseDouble(_model.topRightRadius)), + topLeft: Radius.circular(ParseUtil.stringParseDouble(_model.topLeftRadius)), + bottomRight: Radius.circular(ParseUtil.stringParseDouble(_model.bottomRightRadius)), + bottomLeft: Radius.circular(ParseUtil.stringParseDouble(_model.bottomLeftRadius)), + ) + ), + child: _buildMainWidget(), + ); + } + + Widget _buildMainWidget() { + return Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + /// 领券立减100元 widget + Visibility(visible: !EmptyUtil.isEmpty(_model?.couponText), child: _getCoumstonButtomWidget(_model?.couponText, _model?.tagList[1]?.textColor ?? '#FF4242', _model?.tagList[1]?.bgColor ?? '#FFE0E0')), + + /// 收货后返现5.5元 + Visibility(visible: !EmptyUtil.isEmpty(_model?.commissionText), child: _getCoumstonButtomWidget(_model?.commissionText, _model?.tagList[0]?.textColor ?? '#B78107', _model?.tagList[0]?.bgColor ?? '#FFEFDA')), + ], + ); + } + + + Widget _getCoumstonButtomWidget(String text, String textColor, String bg) { + return Container( + margin: const EdgeInsets.only(right: 5), + padding: const EdgeInsets.only(left: 13.5, right: 14.5, top: 2.5, bottom: 2.5), + decoration: BoxDecoration(borderRadius: BorderRadius.circular(30), color: HexColor.fromHex(bg)), + child: Text( + text ?? '', + style: TextStyle(color: HexColor.fromHex(textColor), fontSize: 11), + ), + ); + } +} diff --git a/lib/widgets/goods_details/tag/model/goods_details_tag_model.dart b/lib/widgets/goods_details/tag/model/goods_details_tag_model.dart new file mode 100644 index 0000000..c86394f --- /dev/null +++ b/lib/widgets/goods_details/tag/model/goods_details_tag_model.dart @@ -0,0 +1,128 @@ +class GoodsDetailsTagModel { + 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; + List tagList; + List sourceList; + + // data + String commissionText; + String couponText; + String providerName; + String title; + + GoodsDetailsTagModel({ + 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.tagList, + this.sourceList, + + this.commissionText, + this.couponText, + this.providerName, + this.title, + }); + + GoodsDetailsTagModel.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']; + if (json['tag_list'] != null) { + tagList = new List(); + json['tag_list'].forEach((v) { + tagList.add(new TagList.fromJson(v)); + }); + } + sourceList = json['source_list'].cast(); + + commissionText = json['commission_text']; + couponText = json['coupon_text']; + providerName = json['provider_name']; + title = json['title']; + } + + 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; + if (this.tagList != null) { + data['tag_list'] = this.tagList.map((v) => v.toJson()).toList(); + } + data['source_list'] = this.sourceList; + + data['commission_text'] = this.commissionText; + data['coupon_text'] = this.couponText; + data['provider_name'] = this.providerName; + data['title'] = this.title; + + return data; + } +} + +class TagList { + String name; + String textColor; + String bgColor; + + TagList({this.name, this.textColor, this.bgColor}); + + TagList.fromJson(Map json) { + name = json['name']; + textColor = json['text_color']; + bgColor = json['bg_color']; + } + + Map toJson() { + final Map data = new Map(); + data['name'] = this.name; + data['text_color'] = this.textColor; + data['bg_color'] = this.bgColor; + return data; + } +} diff --git a/lib/widgets/goods_details/title/goods_details_title_widget.dart b/lib/widgets/goods_details/title/goods_details_title_widget.dart index 94bd1dc..55f1edf 100644 --- a/lib/widgets/goods_details/title/goods_details_title_widget.dart +++ b/lib/widgets/goods_details/title/goods_details_title_widget.dart @@ -23,8 +23,17 @@ class GoodsDetailsTitleWidget extends StatelessWidget { Widget build(BuildContext context) { return Container( width: double.infinity, - color: Colors.white, - padding: const EdgeInsets.only(left: 12.5, right: 12.5, top: 6.5), + padding: const EdgeInsets.only(left: 12.5, right: 12.5, top: 6, bottom: 6), + margin: EdgeInsets.only(top: ParseUtil.stringParseDouble(_model?.topMargin), left: ParseUtil.stringParseDouble(_model?.leftRightMargin), right: ParseUtil.stringParseDouble(_model?.leftRightMargin)), + decoration: BoxDecoration( + color: HexColor.fromHex(_model?.bgColor), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(ParseUtil.stringParseDouble(_model?.topLeftRadius)), + topRight: Radius.circular(ParseUtil.stringParseDouble(_model?.topRightRadius)), + bottomRight: Radius.circular(ParseUtil.stringParseDouble(_model?.bottomRightRadius)), + bottomLeft: Radius.circular(ParseUtil.stringParseDouble(_model?.bottomLeftRadius)), + ) + ), child: _getMaiWidget(_model), ); } @@ -35,21 +44,99 @@ class GoodsDetailsTitleWidget extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, children: [ - RichText( - maxLines: 2, - overflow: TextOverflow.ellipsis, - text: TextSpan(children: [ - WidgetSpan(child: _getGoodsTypeIcon(model)), - _getGoodsTitle(model), - ]), - ), - - /// 优惠卷说明 - Padding(padding: const EdgeInsets.only(top: 12.5), child: _getCounponDestrWidget(model)), + _buildPriceWidget(model), + const SizedBox(height: 6.5), + _buildTitleWidget(model) + ], + ); + } + + /// 价格 + Widget _buildPriceWidget(GoodsDetailsTitleModel model) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + _getLeftWidget(model), + + /// 右边widget + _getBuyNumberWidget(model), ], ); } + /// 左边的wiget 包括价格等 + Widget _getLeftWidget(GoodsDetailsTitleModel model) { + return Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + /// 价格 + _getPriceWidget(model), + const SizedBox(width: 5), + + /// 券后 + _getQhPriceWidget(model), + const SizedBox(width: 5), + + /// 积分 + Visibility( + visible: !EmptyUtil.isEmpty(model?.point), + child: _getPointsWidget(model)) + ], + ); + } + + /// 价格 + Widget _getPriceWidget(GoodsDetailsTitleModel model) { + return Row( + children: [ + Text('¥ ', style: TextStyle(color: HexColor.fromHex( model?.newPriceColor ??'#FF4242'), fontSize: 15)), + Text(model?.currentPrice ?? '0', style: TextStyle(color: HexColor.fromHex(model?.newPriceColor ?? '#FF4242'), fontSize: 30, fontFamily: 'Din', package: 'zhiying_comm', fontWeight: FontWeight.bold)), + ], + ); + } + + /// 积分 + Widget _getPointsWidget(GoodsDetailsTitleModel model) { + return Container( + decoration: BoxDecoration(color: HexColor.fromHex(model?.rewardBgColor ?? '#FFEFDA'), borderRadius: BorderRadius.circular(5)), + padding: const EdgeInsets.only(left: 4, right: 7.5, top: 4, bottom: 4), + child: Text(model?.point ?? '+ 0.00 积分', style: TextStyle(color: HexColor.fromHex( model?.rewardTextColor ?? '#B78107'), fontSize: 9, fontFamily: 'Din', package: 'zhiying_comm')), + ); + } + + /// 券后价格 + Widget _getQhPriceWidget(GoodsDetailsTitleModel model) { + return Column( + children: [ + Text( model?.isCoupon == '1' ? model?.couponText ?? '券后' : /*model?.hand_price_text ??*/ '到手价', style: TextStyle(color: HexColor.fromHex(model?.couponTextColor ?? '#FF4242'), fontSize: 11)), + Text('¥ ${model?.marketPrice}' ?? '¥ 0', style: TextStyle(color: HexColor.fromHex(model?.saleTextColor ?? '#999999'), fontSize: 10, fontFamily: 'Din', package: 'zhiying_comm', decoration: TextDecoration.lineThrough)), + ], + ); + } + + /// 购买人数 + Widget _getBuyNumberWidget(GoodsDetailsTitleModel model) { + // 考拉和唯品会不展示 + if(model?.provider == GlobalConfig.PROVIDER_VIP || model?.provider == GlobalConfig.PROVIDER_KL){ + return Container(); + } + return Text('${model?.soldCount}人已购买' ?? '99999人已购买', style: TextStyle(color: HexColor.fromHex(/*model?.buy_color ??*/ '#999999'), fontSize: 12.5)); + } + + + /// 标题 + Widget _buildTitleWidget(GoodsDetailsTitleModel model) { + return RichText( + maxLines: 2, + overflow: TextOverflow.ellipsis, + text: TextSpan(children: [ + WidgetSpan(child: _getGoodsTypeIcon(model)), + _getGoodsTitle(model), + ]), + ); + } + /// 商品类型图标 Widget _getGoodsTypeIcon(GoodsDetailsTitleModel model) { return Container( @@ -57,8 +144,8 @@ class GoodsDetailsTitleWidget extends StatelessWidget { // width: 32, padding: const EdgeInsets.only(left: 7.5, right: 7.5, bottom: 2, top: 3), margin: const EdgeInsets.only(right: 4), - decoration: BoxDecoration(borderRadius: BorderRadius.circular(2.5), color: HexColor.fromHex(model?.provider_bg_color)), - child: Text(model?.provider_name, textAlign: TextAlign.center, style: TextStyle(color: HexColor.fromHex(model?.provider_name_color), fontSize: 9)), + decoration: BoxDecoration(borderRadius: BorderRadius.circular(2.5), color: HexColor.fromHex(getPlatformCssByPvd()?.bgColor)), + child: Text(getPlatformCssByPvd()?.name ?? '', textAlign: TextAlign.center, style: TextStyle(color: HexColor.fromHex(getPlatformCssByPvd()?.textColor ?? ''), fontSize: 9)), ); } @@ -69,33 +156,18 @@ class GoodsDetailsTitleWidget extends StatelessWidget { style: TextStyle( fontWeight: FontWeight.bold, fontSize: 14, - color: HexColor.fromHex(model?.good_title_color ?? '#FF333333'), + color: HexColor.fromHex(model?.titleTextColor ?? '#FF333333'), )); } - /// 优惠卷说明 - Widget _getCounponDestrWidget(GoodsDetailsTitleModel model) { - return Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - /// 领券立减100元 widget - Visibility(visible: !EmptyUtil.isEmpty(model?.couponPrice), child: _getCoumstonButtomWidget(model?.coupon_text, model?.coupon_text_color, model?.coupon_bg_color)), - - /// 收货后返现5.5元 - Visibility(visible: !EmptyUtil.isEmpty(model?.commission), child: _getCoumstonButtomWidget(model?.commission_text, model?.commission_text_color, model?.commission_bg_color)), - ], - ); + PlatformCss getPlatformCssByPvd() { + PlatformCss rlt = null; + this._model.platformCss.forEach((element) { + if(element.type == this._model.provider) { + rlt = element; + } + }); + return rlt; } - Widget _getCoumstonButtomWidget(String text, String textColor, String bg) { - return Container( - margin: const EdgeInsets.only(right: 5), - padding: const EdgeInsets.only(left: 13.5, right: 14.5, top: 2.5, bottom: 2.5), - decoration: BoxDecoration(borderRadius: BorderRadius.circular(30), color: HexColor.fromHex(bg)), - child: Text( - text, - style: TextStyle(color: HexColor.fromHex(textColor), fontSize: 11), - ), - ); - } } diff --git a/lib/widgets/goods_details/title/model/goods_details_title_model.dart b/lib/widgets/goods_details/title/model/goods_details_title_model.dart index bb5b5cf..f97b9f9 100644 --- a/lib/widgets/goods_details/title/model/goods_details_title_model.dart +++ b/lib/widgets/goods_details/title/model/goods_details_title_model.dart @@ -1,67 +1,187 @@ class GoodsDetailsTitleModel { - String commission_bg_color; - String commission_text; - String commission_text_color; - String coupon_bg_color; - String coupon_text; - String coupon_text_color; - String good_title_color; - String provider_bg_color; - String provider_name; - String provider_name_color; + 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 newPriceColor; + String originalPriceColor; + String couponText; + String couponTextColor; + String saleTextColor; + String titleTextColor; + String rewardBgColor; + String rewardTextColor; + String rewardStr; + List platformCss; + List sourceList; + + + String currentPrice; + String isCoupon; + String marketPrice; + String point; + String soldCount; String title; - String commission; - String couponPrice; - - GoodsDetailsTitleModel({ - this.commission_bg_color, - this.commission_text, - this.commission_text_color, - this.coupon_bg_color, - this.coupon_text, - this.coupon_text_color, - this.good_title_color, - this.provider_bg_color, - this.provider_name, - this.provider_name_color, - this.title, - this.commission, - this.couponPrice, - }); - - factory GoodsDetailsTitleModel.fromJson(Map json) { - return GoodsDetailsTitleModel( - commission_bg_color: json['commission_bg_color'], - commission_text: json['commission_text'], - commission_text_color: json['commission_text_color'], - coupon_bg_color: json['coupon_bg_color'], - coupon_text: json['coupon_text'], - coupon_text_color: json['coupon_text_color'], - good_title_color: json['good_title_color'], - provider_bg_color: json['provider_bg_color'], - provider_name: json['provider_name'], - provider_name_color: json['provider_name_color'], - title: json['title'], - commission: json['commission'], - couponPrice: json['coupon_price'], - ); + + String provider; + String good_id; + + GoodsDetailsTitleModel( + {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.newPriceColor, + this.originalPriceColor, + this.couponText, + this.couponTextColor, + this.saleTextColor, + this.titleTextColor, + this.rewardBgColor, + this.rewardTextColor, + this.rewardStr, + this.platformCss, + this.sourceList, + + this.currentPrice, + this.isCoupon, + this.marketPrice, + this.point, + this.soldCount, + this.title, + + this.good_id, + this.provider, + }); + + GoodsDetailsTitleModel.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']; + newPriceColor = json['new_price_color']; + originalPriceColor = json['original_price_color']; + couponText = json['coupon_text']; + couponTextColor = json['coupon_text_color']; + saleTextColor = json['sale_text_color']; + titleTextColor = json['title_text_color']; + rewardBgColor = json['reward_bg_color']; + rewardTextColor = json['reward_text_color']; + rewardStr = json['reward_str']; + if (json['platform_css'] != null) { + platformCss = new List(); + json['platform_css'].forEach((v) { + platformCss.add(new PlatformCss.fromJson(v)); + }); + } + sourceList = json['source_list'].cast(); + + currentPrice = json['current_price']; + isCoupon = json['is_coupon']; + marketPrice = json['market_price']; + point = json['point']; + soldCount = json['sold_count']; + title = json['title']; + + good_id = json['good_id']; + provider = json['provider']; } Map toJson() { final Map data = new Map(); - data['commission_bg_color'] = this.commission_bg_color; - data['commission_text'] = this.commission_text; - data['commission_text_color'] = this.commission_text_color; - data['coupon_bg_color'] = this.coupon_bg_color; - data['coupon_text'] = this.coupon_text; - data['coupon_text_color'] = this.coupon_text_color; - data['good_title_color'] = this.good_title_color; - data['provider_bg_color'] = this.provider_bg_color; - data['provider_name'] = this.provider_name; - data['provider_name_color'] = this.provider_name_color; + 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['new_price_color'] = this.newPriceColor; + data['original_price_color'] = this.originalPriceColor; + data['coupon_text'] = this.couponText; + data['coupon_text_color'] = this.couponTextColor; + data['sale_text_color'] = this.saleTextColor; + data['title_text_color'] = this.titleTextColor; + data['reward_bg_color'] = this.rewardBgColor; + data['reward_text_color'] = this.rewardTextColor; + data['reward_str'] = this.rewardStr; + if (this.platformCss != null) { + data['platform_css'] = this.platformCss.map((v) => v.toJson()).toList(); + } + data['source_list'] = this.sourceList; + + data['current_price'] = this.currentPrice; + data['is_coupon'] = this.isCoupon; + data['market_price'] = this.marketPrice; + data['point'] = this.point; + data['sold_count'] = this.soldCount; data['title'] = this.title; - data['coupon_price'] = this.couponPrice; - data['commission'] = this.commission; + + data['provider'] = this.provider; + data['good_id'] = this.good_id; + + return data; + } +} + +class PlatformCss { + String name; + String type; + String textColor; + String bgColor; + + PlatformCss({this.name, this.type, this.textColor, this.bgColor}); + + PlatformCss.fromJson(Map json) { + name = json['name']; + type = json['type']; + textColor = json['text_color']; + bgColor = json['bg_color']; + } + + Map toJson() { + final Map data = new Map(); + data['name'] = this.name; + data['type'] = this.type; + data['text_color'] = this.textColor; + data['bg_color'] = this.bgColor; return data; } } diff --git a/lib/widgets/goods_details/upgrade_tip/model/upgrade_tip_model.dart b/lib/widgets/goods_details/upgrade_tip/model/upgrade_tip_model.dart index 81473db..a81d023 100644 --- a/lib/widgets/goods_details/upgrade_tip/model/upgrade_tip_model.dart +++ b/lib/widgets/goods_details/upgrade_tip/model/upgrade_tip_model.dart @@ -1,44 +1,132 @@ import 'package:zhiying_comm/zhiying_comm.dart'; -class UpgradeTipModel extends SkipModel { - String bg_color; - String go_text; - String go_text_color; - String icon; - String text; - String text_color; +class UpgradeTipModel { + String url; + String name; + String desc; + String icon; + 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 bulletinText; + String bulletinTextColor; + String goText; + GoSkip goSkip; + UpgradeTipModel({ - this.bg_color, - this.go_text, - this.go_text_color, + this.name, + this.desc, this.icon, - this.text, - this.text_color, + 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.bulletinText, + this.bulletinTextColor, + this.goText, + this.goSkip, this.url, }); UpgradeTipModel.fromJson(Map json) { - super.fromJson(json); - bg_color = json['bg_color']; - go_text = json['go_text']; - go_text_color = json['go_text_color']; + name = json['name']; + desc = json['desc']; icon = json['icon']; - text = json['text']; - text_color = json['text_color']; + 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']; + bulletinText = json['bulletin_text']; + bulletinTextColor = json['bulletin_text_color']; + goText = json['go_text']; + goSkip = + json['go_skip'] != null ? new GoSkip.fromJson(json['go_skip']) : null; + url = json['url']; } Map toJson() { - final Map data = super.toJson(); - data['bg_color'] = this.bg_color; - data['go_text'] = this.go_text; - data['go_text_color'] = this.go_text_color; + final Map data = new Map(); + data['name'] = this.name; + data['desc'] = this.desc; data['icon'] = this.icon; - data['text'] = this.text; - data['text_color'] = this.text_color; + 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['bulletin_text'] = this.bulletinText; + data['bulletin_text_color'] = this.bulletinTextColor; + data['go_text'] = this.goText; + if (this.goSkip != null) { + data['go_skip'] = this.goSkip.toJson(); + } + data['url'] = this.url; return data; } + +} + +class GoSkip extends SkipModel { + String requiredLogin; + String requiredTaobaoAuth; + String isJump; + String skipIdentifier; + + GoSkip({this.requiredLogin, + this.requiredTaobaoAuth, + this.isJump, + this.skipIdentifier}); + + GoSkip.fromJson(Map json) { + super.fromJson(json); + requiredLogin = json['required_login']; + requiredTaobaoAuth = json['required_taobao_auth']; + isJump = json['is_jump']; + skipIdentifier = json['skip_identifier']; + } + + Map toJson() { + final Map data = super.toJson(); + data['required_login'] = this.requiredLogin; + data['required_taobao_auth'] = this.requiredTaobaoAuth; + data['is_jump'] = this.isJump; + data['skip_identifier'] = this.skipIdentifier; + return data; + } } diff --git a/lib/widgets/goods_details/upgrade_tip/upgrade_tip_widget.dart b/lib/widgets/goods_details/upgrade_tip/upgrade_tip_widget.dart index aa6049d..f6e2349 100644 --- a/lib/widgets/goods_details/upgrade_tip/upgrade_tip_widget.dart +++ b/lib/widgets/goods_details/upgrade_tip/upgrade_tip_widget.dart @@ -9,20 +9,21 @@ import 'package:cached_network_image/cached_network_image.dart'; /// 更新提示widget /// class UpgradeTipWidget extends StatelessWidget { - final Map model; - UpgradeTipModel _upgradeTipModel; + final Map data; + UpgradeTipModel _model; - UpgradeTipWidget(this.model, {Key key}) : super(key: key) { + UpgradeTipWidget(this.data, {Key key}) : super(key: key) { try { - _upgradeTipModel = UpgradeTipModel.fromJson(jsonDecode(model['data'])); + _model = UpgradeTipModel.fromJson(jsonDecode(data['data'])); } catch (e) { Logger.log('UpgradeTipWidget e = $e'); } } + /// 点击事件 void _onClickListener(context) { - if (!EmptyUtil.isEmpty(_upgradeTipModel)) { - RouterUtil.route(_upgradeTipModel, _upgradeTipModel.toJson(), context); + if (!EmptyUtil.isEmpty(_model) && !EmptyUtil.isEmpty(_model?.goSkip)) { + RouterUtil.route(_model?.goSkip, _model?.goSkip?.toJson(), context); } } @@ -30,23 +31,32 @@ class UpgradeTipWidget extends StatelessWidget { Widget build(BuildContext context) { return Container( width: double.infinity, - padding: const EdgeInsets.only(left: 12.5, right: 12.5, top: 12.5), - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.only(topLeft: Radius.circular(7.5), topRight: Radius.circular(7.5))), + margin: EdgeInsets.only(top: ParseUtil.stringParseDouble(_model?.topMargin), left: ParseUtil.stringParseDouble(_model?.leftRightMargin), right: ParseUtil.stringParseDouble(_model?.leftRightMargin)), + padding: const EdgeInsets.only(left: 12.5, right: 12.5, top: 6, bottom: 6), + decoration: BoxDecoration( + // color: HexColor.fromHex(_model?.bgColor), + color: Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(ParseUtil.stringParseDouble(_model?.topLeftRadius)), + topRight: Radius.circular(ParseUtil.stringParseDouble(_model?.topLeftRadius)), + bottomRight: Radius.circular(ParseUtil.stringParseDouble(_model?.bottomRightRadius)), + bottomLeft: Radius.circular(ParseUtil.stringParseDouble(_model?.topLeftRadius)), + )), child: GestureDetector( onTap: () => _onClickListener(context), behavior: HitTestBehavior.opaque, child: Container( decoration: BoxDecoration( /// 背景颜色 - color: HexColor.fromHex(_upgradeTipModel?.bg_color ?? '#FFEFDA'), + color: HexColor.fromHex(_model?.bgColor ?? '#FFEFDA'), borderRadius: BorderRadius.circular(30), ), padding: const EdgeInsets.only(left: 10, right: 13, top: 10, bottom: 10), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - _geLeftWidget(_upgradeTipModel), - _getRightWidget(_upgradeTipModel), + _geLeftWidget(_model), + _getRightWidget(_model), ], ), ), @@ -68,14 +78,14 @@ class UpgradeTipWidget extends StatelessWidget { const SizedBox(width: 7.5), /// 文字 - Text(model?.text ?? '下载APP升级运营商,享受更多收益', style: TextStyle(color: HexColor.fromHex(model?.text_color ?? '#C09023'), fontSize: 11)) + Text(model?.bulletinText ?? '下载APP升级运营商,享受更多收益', style: TextStyle(color: HexColor.fromHex(model?.bulletinTextColor ?? '#C09023'), fontSize: 11)) ], ); } /// 右边的视图 Widget _getRightWidget(UpgradeTipModel model) { - return Text(model?.go_text ?? '前往下载', style: TextStyle(color: HexColor.fromHex(model?.go_text_color ?? '#C09023'), fontSize: 11)); + return Text(model?.goText ?? '前往下载', style: TextStyle(color: HexColor.fromHex(model?.bulletinTextColor ?? '#C09023'), fontSize: 11)); // return Row( // children: [ // Text(model?.go_text ??'前往下载', style: TextStyle(color: HexColor.fromHex('#C09023'), fontSize: 11)),