From 9852d4277c969c3837730024f9792382ea77552c Mon Sep 17 00:00:00 2001 From: PH2 <1293456824@qq.com> Date: Thu, 8 Apr 2021 14:17:48 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E4=BF=AE=E6=94=B9=E4=BA=86=E6=88=91?= =?UTF-8?q?=E7=9A=84=E8=AE=A2=E5=8D=95UI=E9=97=AE=E9=A2=98=202=E3=80=81?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E6=90=9C=E7=B4=A2=E6=A1=86=E7=9A=84?= =?UTF-8?q?2=E4=B8=AA=E6=A0=B7=E5=BC=8F=203=E3=80=81=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BA=86=E5=88=86=E4=BA=AB=E5=86=85=E5=AE=B9=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=204=E3=80=81=E4=BF=AE=E6=94=B9=E4=BA=86=E5=88=86=E4=BA=AB?= =?UTF-8?q?=E7=BA=AF=E6=96=87=E5=AD=97=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pages/home_page/home_page.dart | 66 ++++++-- .../views/order_tabbar_widget.dart | 2 +- lib/register.dart | 3 + .../custom/search/custom_search_widget.dart | 115 +++++++------- .../search/model/custom_search_model.dart | 91 +++++++++-- .../bloc/custom_share_content_bloc.dart | 39 +++++ .../bloc/custom_share_content_event.dart | 10 ++ .../bloc/custom_share_content_repository.dart | 42 ++++++ .../bloc/custom_share_content_state.dart | 16 ++ .../model/custom_share_content_model.dart | 139 +++++++++++++++++ .../share_content/share_content_creater.dart | 22 +++ .../share_content/share_content_sk.dart | 8 + .../share_content/share_content_widget.dart | 142 ++++++++++++++++++ lib/widgets/share/share_alert.dart | 4 +- 14 files changed, 612 insertions(+), 87 deletions(-) create mode 100644 lib/widgets/custom/share_content/bloc/custom_share_content_bloc.dart create mode 100644 lib/widgets/custom/share_content/bloc/custom_share_content_event.dart create mode 100644 lib/widgets/custom/share_content/bloc/custom_share_content_repository.dart create mode 100644 lib/widgets/custom/share_content/bloc/custom_share_content_state.dart create mode 100644 lib/widgets/custom/share_content/model/custom_share_content_model.dart create mode 100644 lib/widgets/custom/share_content/share_content_creater.dart create mode 100644 lib/widgets/custom/share_content/share_content_sk.dart create mode 100644 lib/widgets/custom/share_content/share_content_widget.dart diff --git a/lib/pages/home_page/home_page.dart b/lib/pages/home_page/home_page.dart index f7dbbe6..5517733 100644 --- a/lib/pages/home_page/home_page.dart +++ b/lib/pages/home_page/home_page.dart @@ -1,7 +1,5 @@ import 'dart:async'; import 'dart:convert' as convert; -import 'dart:convert'; -import 'dart:io'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/cupertino.dart'; @@ -10,16 +8,10 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'package:moblink/moblink.dart'; -import 'package:mobpush_plugin/mobpush_custom_message.dart'; -import 'package:mobpush_plugin/mobpush_notify_message.dart'; -import 'package:mobpush_plugin/mobpush_plugin.dart'; import 'package:provider/provider.dart'; -import 'package:zhiying_base_widget/dialog/global_dialog/activity_dialog/activity_dialog.dart'; import 'package:zhiying_base_widget/dialog/global_dialog/advertising_dialog/advertising_dialog.dart'; import 'package:zhiying_base_widget/dialog/global_dialog/intellect_search_goods_dialog/intellect_create.dart'; import 'package:zhiying_base_widget/dialog/global_dialog/notification_setting_dialog/notification_setting_dialog.dart'; -import 'package:zhiying_base_widget/dialog/global_dialog/policy_dialog/policy_dialog.dart'; -import 'package:zhiying_base_widget/dialog/tip_dialog/tip_dialog.dart'; import 'package:zhiying_base_widget/models/app_config_model.dart'; import 'package:zhiying_base_widget/pages/custom_page/event/reload_event.dart'; import 'package:zhiying_base_widget/utils/contants.dart'; @@ -35,10 +27,6 @@ import 'package:zhiying_comm/zhiying_comm.dart'; import 'package:zhiying_comm/util/event_util/login_success_event.dart'; import 'package:zhiying_comm/util/event_util/event_util.dart'; import 'package:zhiying_comm/util/event_util/log_out.dart'; -import 'package:zhiying_comm/util/event_util/login_success_event.dart'; -import 'package:zhiying_comm/util/event_util/event_util.dart'; -import 'package:zhiying_comm/util/event_util/log_out.dart'; -import 'package:package_info/package_info.dart'; class HomeCenterPage extends StatefulWidget { @override @@ -291,7 +279,59 @@ class _HomePageState extends LifeState with WidgetsBindingObserver, Ti // Widget createBottomNavigationBarNew(List> tabs) { // - // return ConvexAppBar(items: null, initialActiveIndex: _currentIndex, style: TabStyle.titled,); + // List items = List(); + // for (int i = 0; i < tabs.length; i++) { + // BaseTabModel model = BaseTabModel.fromJson(tabs[i]); + // String icon = ImageUtil.getUrl(model.icon); + // String selectedIcon = ImageUtil.getUrl(model.chooseIcon ?? model.icon); + // String textColor = model.fontColor; + // String chooseColor = model.chooseColor ?? textColor; + // + // if (model.isShow == "1") { + // items.add(TabItem( + // icon: Image.network(icon ?? ''), + // activeIcon: Image.network(selectedIcon ?? ''), + // title: model.name ?? '' + // )); + // } + // } + // + // if (items.length < 2) { + // return Container(); + // } + // String bgColor = '#ffffff'; + // String textColor = '#999999'; + // String activeColor = '#FF4242'; + // if (tabs.first != null) { + // BaseTabModel model = BaseTabModel.fromJson(tabs.first); + // bgColor = model.bgColor ?? bgColor; + // textColor = model?.fontColor ?? textColor; + // activeColor = model?.chooseColor ?? activeColor; + // } + // + // return ConvexAppBar( + // elevation: 0, + // backgroundColor: HexColor.fromHex(bgColor), + // items: items, + // height: 50, + // color: HexColor.fromHex(textColor), + // activeColor: HexColor.fromHex(activeColor), + // initialActiveIndex: _currentIndex, + // style: TabStyle.react, + // onTap: (int index) async { + // BaseTabModel model = BaseTabModel.fromJson(tabs[index]); + // if (await _checkLimit(model)) { + // ///避免同一个页面多次点击多次重绘 + // if (_currentIndex == index) { + // return; + // } else { + // setState(() { + // _currentIndex = index; + // }); + // } + // } + // }, + // ); // } Future _checkLimit(BaseTabModel model) async { diff --git a/lib/pages/orders_page/views/order_tabbar_widget.dart b/lib/pages/orders_page/views/order_tabbar_widget.dart index e50e3e4..7a4296b 100644 --- a/lib/pages/orders_page/views/order_tabbar_widget.dart +++ b/lib/pages/orders_page/views/order_tabbar_widget.dart @@ -29,7 +29,7 @@ class OrderTabbarWidget extends StatelessWidget { Expanded( child: TabBar( controller: controller, - isScrollable: false, + isScrollable: (controller?.length ?? 0) >=4 ? true : false, indicatorSize: TabBarIndicatorSize.label, // tabs: widgets, indicatorColor: diff --git a/lib/register.dart b/lib/register.dart index 310c961..024ee5e 100644 --- a/lib/register.dart +++ b/lib/register.dart @@ -41,6 +41,7 @@ import 'package:zhiying_base_widget/widgets/custom/goods/custom_goods_creater.da 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/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'; import 'package:zhiying_base_widget/widgets/goods_details/footer/goods_details_footer_widget.dart'; import 'package:zhiying_base_widget/widgets/goods_details/price/goods_details_price_widget.dart'; @@ -410,5 +411,7 @@ class BaseWidgetRegister { WidgetFactory.regist('placard', DefaultWidgetCreater((model) => CustomNoticeWidget(model))); // 授权 WidgetFactory.regist('audit_tip', DefaultWidgetCreater((model) => HomeAuth(model))); + // 分享内容组件 + WidgetFactory.regist('share_content', DefaultWidgetCreater((model) => CustomShareContentWidget(model))); } } diff --git a/lib/widgets/custom/search/custom_search_widget.dart b/lib/widgets/custom/search/custom_search_widget.dart index 48c669a..6a672a5 100644 --- a/lib/widgets/custom/search/custom_search_widget.dart +++ b/lib/widgets/custom/search/custom_search_widget.dart @@ -74,11 +74,11 @@ class CustomSearchWidget extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ GestureDetector( - onTap: () => _onClickListener(context, model?.listStyle?.rightCss), + onTap: () => _onClickListener(context, model?.listStyle?.leftCss), child: CachedNetworkImage( width: 30, height: 30, - imageUrl: model?.listStyle?.rightCss?.image ?? '', + imageUrl: model?.listStyle?.leftCss?.image ?? '', )), // 图标1 SizedBox(width: 10), @@ -118,70 +118,63 @@ class CustomSearchWidget extends StatelessWidget { ); } - /// 左1右2图标 - Widget _buildStyle5Widget(BuildContext context) { - return Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - GestureDetector( - onTap: () => _onClickListener(context, model?.listStyle?.rightCss), - child: CachedNetworkImage( - width: 30, - height: 30, - imageUrl: model?.listStyle?.rightCss?.image ?? '', + /// 右按钮 + Widget _buildStyle4Widget(BuildContext context) { + return GestureDetector( + onTap: () => _onClickListener(context, model?.listStyle?.rightBtnCss), + child: Container( + height: 38, + padding: EdgeInsets.only(left: 10.5), + decoration: BoxDecoration( + border: Border.all(color: HexColor.fromHex(model?.listStyle?.searchCss?.borderColor ?? "")), + borderRadius: BorderRadius.only( + bottomRight: Radius.circular(ParseUtil.stringParseDouble(model?.bottomRightRadius)), + bottomLeft: Radius.circular(ParseUtil.stringParseDouble(model?.bottomLeftRadius)), + topLeft: Radius.circular(ParseUtil.stringParseDouble(model?.topLeftRadius)), + topRight: Radius.circular(ParseUtil.stringParseDouble(model?.topRightRadius)), )), - // 图标1 - SizedBox(width: 10), - // 中间 - Expanded( - child: GestureDetector( - onTap: () => _onClickListener(context, model?.listStyle?.searchCss), - behavior: HitTestBehavior.opaque, - child: Container( - // height: 30, - width: double.infinity, - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 9), - decoration: BoxDecoration(borderRadius: BorderRadius.circular(60 / 2), color: HexColor.fromHex(model?.listStyle?.searchCss?.bgColor)), - child: Row( - children: [ - CachedNetworkImage( - width: 15, - height: 15, - imageUrl: model?.listStyle?.searchCss?.image ?? '', - ), - SizedBox(width: 4), - Text(model?.listStyle?.searchCss?.text ?? '输入搜索内容,领券省钱', style: TextStyle(fontSize: 13, color: HexColor.fromHex(model?.listStyle?.searchCss?.textColor??"#FFFFFF"))) - ], - ), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + ///搜索图标 + CachedNetworkImage( + imageUrl: model?.listStyle?.searchCss?.image ?? '', + width: 16, + fit: BoxFit.fitWidth, + ), + SizedBox( + width: 4, + ), + Expanded( + child: TextField( + style: TextStyle(fontSize: 13), + decoration: InputDecoration( + isDense: true, + enabled: false, + border: InputBorder.none, + hintText: model?.listStyle?.searchCss?.text ?? "", + hintStyle: TextStyle(color: HexColor.fromHex(model?.listStyle?.searchCss?.textColor ?? ""))), ), - )), - SizedBox(width: 10), - // 图标2 - GestureDetector( - onTap: () => _onClickListener(context, model?.listStyle?.rightCss), - child: CachedNetworkImage( - width: 30, - height: 30, - imageUrl: model?.listStyle?.rightCss?.image ?? '', - )), - SizedBox(width: 10), - // 图标2 - GestureDetector( - onTap: () => _onClickListener(context, model?.listStyle?.rightCss), - child: CachedNetworkImage( - width: 30, - height: 30, - imageUrl: model?.listStyle?.rightCss?.image ?? '', - )), - ], + ), + Container( + padding: EdgeInsets.only(left: 16, right: 16), + decoration: BoxDecoration( + image: DecorationImage(image: CachedNetworkImageProvider(model?.listStyle?.rightBtnCss?.bgImg ?? ""), fit: BoxFit.fitHeight), + borderRadius: BorderRadius.circular(2)), + height: double.infinity, + child: Center( + child: Text( + model?.listStyle?.rightBtnCss?.text ?? "", + style: TextStyle(color: HexColor.fromHex(model?.listStyle?.rightBtnCss?.textColor ?? "#FFFFFF"), fontWeight: FontWeight.w500, fontSize: 13), + )), + ) + ], + ), + ), ); } - /// 右按钮 - Widget _buildStyle4Widget(BuildContext context) { - return Container(); - } - /// 右1图标 Widget _buildStyle1Widget(BuildContext context) { return Row( diff --git a/lib/widgets/custom/search/model/custom_search_model.dart b/lib/widgets/custom/search/model/custom_search_model.dart index ee3d54a..ef1fa10 100644 --- a/lib/widgets/custom/search/model/custom_search_model.dart +++ b/lib/widgets/custom/search/model/custom_search_model.dart @@ -83,12 +83,16 @@ class CustomSearchModel { class ListStyle { SearchCss searchCss; RightCss rightCss; + RightCss leftCss; + RightBtnCss rightBtnCss; - ListStyle({this.searchCss, this.rightCss}); + ListStyle({this.searchCss, this.rightCss, this.leftCss, this.rightBtnCss}); ListStyle.fromJson(Map json) { searchCss = json['search_css'] != null ? new SearchCss.fromJson(json['search_css']) : null; rightCss = json['right_css'] != null ? new RightCss.fromJson(json['right_css']) : null; + leftCss = json['left_css'] != null ? new RightCss.fromJson(json['left_css']) : null; + rightBtnCss = json['right_btn_css'] != null ? new RightBtnCss.fromJson(json['right_btn_css']) : null; } Map toJson() { @@ -99,6 +103,12 @@ class ListStyle { if (this.rightCss != null) { data['right_css'] = this.rightCss.toJson(); } + if (this.leftCss != null) { + data['left_css'] = this.leftCss.toJson(); + } + if (this.rightBtnCss != null) { + data['right_btn_css'] = this.rightBtnCss.toJson(); + } return data; } } @@ -112,19 +122,21 @@ class SearchCss extends SkipModel { String requiredLogin; String requiredTaobaoAuth; String skipIdentifier; + String borderColor; - SearchCss({this.name, this.text, this.image, this.bgColor, this.textColor, this.requiredLogin, this.requiredTaobaoAuth, this.skipIdentifier}); + SearchCss({this.name, this.text, this.image, this.bgColor, this.textColor, this.requiredLogin, this.requiredTaobaoAuth, this.skipIdentifier, this.borderColor}); SearchCss.fromJson(Map json) { super.fromJson(json); - name = json['name']; - text = json['text']; - image = json['image']; - bgColor = json['bg_color']; - textColor = json['text_color']; - requiredLogin = json['required_login']; - requiredTaobaoAuth = json['required_taobao_auth']; - skipIdentifier = json['skip_identifier']; + name = json['name']?.toString(); + text = json['text']?.toString(); + image = json['image']?.toString(); + bgColor = json['bg_color']?.toString(); + textColor = json['text_color']?.toString(); + requiredLogin = json['required_login']?.toString(); + requiredTaobaoAuth = json['required_taobao_auth']?.toString(); + skipIdentifier = json['skip_identifier']?.toString(); + borderColor = json['border_color']?.toString(); } Map toJson() { @@ -137,6 +149,7 @@ class SearchCss extends SkipModel { data['required_login'] = this.requiredLogin; data['required_taobao_auth'] = this.requiredTaobaoAuth; data['skip_identifier'] = this.skipIdentifier; + data['border_color'] = this.borderColor; return data; } } @@ -175,3 +188,61 @@ class RightCss extends SkipModel { return data; } } + +class RightBtnCss extends SkipModel { + String name; + String text; + String textColor; + String bgImg; + String bgImgUrl; + String skipIdentifier; + String skipName; + String requiredLogin; + String requiredTaobaoAuth; + String isJump; + String cateTag; + + RightBtnCss( + {this.name, + this.text, + this.textColor, + this.bgImg, + this.bgImgUrl, + this.skipIdentifier, + this.skipName, + this.requiredLogin, + this.requiredTaobaoAuth, + this.isJump, + this.cateTag}); + + RightBtnCss.fromJson(Map json) { + super.fromJson(json); + name = json['name']; + text = json['text']; + textColor = json['text_color']; + bgImg = json['bg_img']; + bgImgUrl = json['bg_img_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 = super.toJson(); + data['name'] = this.name; + data['text'] = this.text; + data['text_color'] = this.textColor; + data['bg_img'] = this.bgImg; + data['bg_img_url'] = this.bgImgUrl; + 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/share_content/bloc/custom_share_content_bloc.dart b/lib/widgets/custom/share_content/bloc/custom_share_content_bloc.dart new file mode 100644 index 0000000..ddecf30 --- /dev/null +++ b/lib/widgets/custom/share_content/bloc/custom_share_content_bloc.dart @@ -0,0 +1,39 @@ +import 'dart:async'; + +import 'package:bloc/bloc.dart'; +import 'package:meta/meta.dart'; +import 'package:zhiying_base_widget/widgets/custom/share_content/model/custom_share_content_model.dart'; +import 'package:zhiying_comm/zhiying_comm.dart'; +import 'custom_share_content_repository.dart'; +part 'custom_share_content_event.dart'; +part 'custom_share_content_state.dart'; + +class CustomShareContentBloc extends Bloc { + CustomShareContentBloc({this.repository}) : super(CustomShareContentInitial()); + CustomShareContentRepository repository; + + @override + Stream mapEventToState( + CustomShareContentEvent event, + ) async* { + /// 初始化 + if (event is CustomShareContentInitEvent) { + yield* _mapInitEventToState(event); + } + } + + /// 初始化事件 + Stream _mapInitEventToState(CustomShareContentInitEvent event) async* { + var parentData = await repository.fetchParentStyle(event.model); + if (!EmptyUtil.isEmpty(parentData)) { + yield CustomShareContentLoadedState(model: parentData); + var netData = await repository.fetchNetData(event.model); + if (!EmptyUtil.isEmpty(netData)) { + parentData..text = netData?.toString(); + yield CustomShareContentLoadedState(model: parentData); + } + } else { + yield CustomShareContentErrorState(); + } + } +} diff --git a/lib/widgets/custom/share_content/bloc/custom_share_content_event.dart b/lib/widgets/custom/share_content/bloc/custom_share_content_event.dart new file mode 100644 index 0000000..deeca50 --- /dev/null +++ b/lib/widgets/custom/share_content/bloc/custom_share_content_event.dart @@ -0,0 +1,10 @@ +part of 'custom_share_content_bloc.dart'; + +@immutable +abstract class CustomShareContentEvent {} + +/// 初始化事件 +class CustomShareContentInitEvent extends CustomShareContentEvent { + final Map model; + CustomShareContentInitEvent({this.model}); +} diff --git a/lib/widgets/custom/share_content/bloc/custom_share_content_repository.dart b/lib/widgets/custom/share_content/bloc/custom_share_content_repository.dart new file mode 100644 index 0000000..a2ad2ae --- /dev/null +++ b/lib/widgets/custom/share_content/bloc/custom_share_content_repository.dart @@ -0,0 +1,42 @@ + +import 'dart:convert'; +import 'package:zhiying_base_widget/widgets/custom/share_content/model/custom_share_content_model.dart'; +import 'package:zhiying_comm/zhiying_comm.dart'; + +class CustomShareContentRepository { + + /// + /// 获取缓存的数据 + /// + Future fetchParentStyle(Map model) async { + try { + if (!EmptyUtil.isEmpty(model)) { + return CustomShareContentModel.fromJson(jsonDecode(model['data'])); + } + } catch (e, s) { + Logger.error(e, s); + } + return null; + } + + /// + /// 获取网络的数据 + /// + Future fetchNetData(Map model) async { + try { + if (!EmptyUtil.isEmpty(model)) { + var result = await NetUtil.post('/api/v1/third_party/content/${model['mod_id']?.toString()}', method: NetMethod.GET ); + if (NetUtil.isSuccess(result) && !EmptyUtil.isEmpty(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA])) { + var data = result[GlobalConfig.HTTP_RESPONSE_KEY_DATA]['content']; + if (!EmptyUtil.isEmpty(data)) { + return data; + } + } + } + } catch (e, s) { + Logger.error(e, s); + } + return null; + } + +} \ No newline at end of file diff --git a/lib/widgets/custom/share_content/bloc/custom_share_content_state.dart b/lib/widgets/custom/share_content/bloc/custom_share_content_state.dart new file mode 100644 index 0000000..2d63819 --- /dev/null +++ b/lib/widgets/custom/share_content/bloc/custom_share_content_state.dart @@ -0,0 +1,16 @@ +part of 'custom_share_content_bloc.dart'; + +@immutable +abstract class CustomShareContentState {} + +/// 初始化 +class CustomShareContentInitial extends CustomShareContentState {} + +/// 数据加载成功 +class CustomShareContentLoadedState extends CustomShareContentState { + CustomShareContentModel model; + CustomShareContentLoadedState({this.model}); +} + +/// 数据加载失败 +class CustomShareContentErrorState extends CustomShareContentState {} \ No newline at end of file diff --git a/lib/widgets/custom/share_content/model/custom_share_content_model.dart b/lib/widgets/custom/share_content/model/custom_share_content_model.dart new file mode 100644 index 0000000..3cda492 --- /dev/null +++ b/lib/widgets/custom/share_content/model/custom_share_content_model.dart @@ -0,0 +1,139 @@ +import 'package:zhiying_comm/zhiying_comm.dart'; + +class CustomShareContentModel extends SkipModel{ + String name; + String desc; + String text; + 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 isShowShareFriend; + String bgImage; + String bgImageUrl; + String titleImage; + String titleImageUrl; + String copyImage; + String copyImageUrl; + String copyLongImage; + String copyLongImageUrl; + String shareImage; + String shareImageUrl; + String textColor; + String skipName; + String cateTag; + + CustomShareContentModel( + {this.name, + this.desc, + this.text, + 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.isShowShareFriend, + this.bgImage, + this.bgImageUrl, + this.titleImage, + this.titleImageUrl, + this.copyImage, + this.copyImageUrl, + this.copyLongImage, + this.copyLongImageUrl, + this.shareImage, + this.shareImageUrl, + this.textColor, + this.skipName, + this.cateTag}); + + CustomShareContentModel.fromJson(Map json) { + super.fromJson(json); + name = json['name']; + desc = json['desc']; + text = json['text']; + 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']; + isShowShareFriend = json['is_show_share_friend']; + bgImage = json['bg_image']; + bgImageUrl = json['bg_image_url']; + titleImage = json['title_image']; + titleImageUrl = json['title_image_url']; + copyImage = json['copy_image']; + copyImageUrl = json['copy_image_url']; + copyLongImage = json['copy_long_image']; + copyLongImageUrl = json['copy_long_image_url']; + shareImage = json['share_image']; + shareImageUrl = json['share_image_url']; + textColor = json['text_color']; + 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 = super.toJson(); + data['name'] = this.name; + data['desc'] = this.desc; + data['text'] = this.text; + 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['is_show_share_friend'] = this.isShowShareFriend; + data['bg_image'] = this.bgImage; + data['bg_image_url'] = this.bgImageUrl; + data['title_image'] = this.titleImage; + data['title_image_url'] = this.titleImageUrl; + data['copy_image'] = this.copyImage; + data['copy_image_url'] = this.copyImageUrl; + data['copy_long_image'] = this.copyLongImage; + data['copy_long_image_url'] = this.copyLongImageUrl; + data['share_image'] = this.shareImage; + data['share_image_url'] = this.shareImageUrl; + data['text_color'] = this.textColor; + 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; + } +} \ No newline at end of file diff --git a/lib/widgets/custom/share_content/share_content_creater.dart b/lib/widgets/custom/share_content/share_content_creater.dart new file mode 100644 index 0000000..ebc001d --- /dev/null +++ b/lib/widgets/custom/share_content/share_content_creater.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; +import 'package:zhiying_base_widget/widgets/custom/share_content/share_content_sk.dart'; +import 'package:zhiying_base_widget/widgets/custom/share_content/share_content_widget.dart'; +import 'package:zhiying_comm/zhiying_comm.dart'; + + +/// +/// 可以滚动Banner +/// +class CustomShareContentCreater extends WidgetCreater { + @override + List createSkeleton(Map model) { + return [CustomShareContentSkeleton()]; + } + + @override + List createWidgets(Map model) { + return [ + CustomShareContentWidget(model), + ]; + } +} diff --git a/lib/widgets/custom/share_content/share_content_sk.dart b/lib/widgets/custom/share_content/share_content_sk.dart new file mode 100644 index 0000000..209550b --- /dev/null +++ b/lib/widgets/custom/share_content/share_content_sk.dart @@ -0,0 +1,8 @@ +import 'package:flutter/material.dart'; + +class CustomShareContentSkeleton extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Container(); + } +} diff --git a/lib/widgets/custom/share_content/share_content_widget.dart b/lib/widgets/custom/share_content/share_content_widget.dart new file mode 100644 index 0000000..9646853 --- /dev/null +++ b/lib/widgets/custom/share_content/share_content_widget.dart @@ -0,0 +1,142 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:zhiying_base_widget/widgets/custom/share_content/model/custom_share_content_model.dart'; +import 'package:zhiying_base_widget/widgets/custom/share_content/share_content_sk.dart'; +import 'package:zhiying_base_widget/widgets/share/models/share_alert_model.dart'; +import 'package:zhiying_base_widget/widgets/share/models/share_data_model.dart'; +import 'package:zhiying_base_widget/widgets/share/share_alert.dart'; +import 'package:zhiying_comm/zhiying_comm.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'bloc/custom_share_content_bloc.dart'; +import 'bloc/custom_share_content_repository.dart'; +import 'package:flutter/cupertino.dart'; + +/// +/// 分享内容组件 +/// +class CustomShareContentWidget extends StatelessWidget { + + final Map model; + + const CustomShareContentWidget(this.model, {Key key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (_) => CustomShareContentBloc(repository: CustomShareContentRepository())..add(CustomShareContentInitEvent(model: model)), + child: _CustomShareContentContainerWidget(), + ); + } +} + +class _CustomShareContentContainerWidget extends StatefulWidget { + @override + _CustomShareContentContainerWidgetState createState() => _CustomShareContentContainerWidgetState(); +} + +class _CustomShareContentContainerWidgetState extends State<_CustomShareContentContainerWidget> { + + /// 分享方法 + void _clickShareButton(val) { + showCupertinoModalPopup( + context: context, + builder: (context) => ShareAlert(ShareDataModel(content: val), 'pub.flutter.share_icon', isContentShow: false), + ); + } + + /// 复制方法 + void _clickCopyButton(String val) { + if (!EmptyUtil.isEmpty(val)) { + Clipboard.setData(ClipboardData(text: val)); + Fluttertoast.showToast(msg: '复制成功'); + } + } + + @override + Widget build(BuildContext context) { + return BlocConsumer( + listener: (prev, next) {}, + buildWhen: (context, state) { + return true; + }, + builder: (context, state) { + Logger.log('商品详情刷新了 builder state = ' + state?.toString()); + /// 数据加载完毕 + if (state is CustomShareContentLoadedState) { + return _getMainWidget(state?.model); + } + + /// 异常 + if (state is CustomShareContentErrorState) { + return _errorWidget(); + } + /// 骨架图 + return _getSkeletonWidget(); + }, + ); + } + + /// 主视图 + Widget _getMainWidget(CustomShareContentModel model) { + return Container( + width: double.infinity, + // height: 98, + margin: EdgeInsets.only(top: ParseUtil.stringParseDouble(model?.topMargin), left: ParseUtil.stringParseDouble(model?.leftRightMargin, defVal: 12.5), right: ParseUtil.stringParseDouble(model?.leftRightMargin, defVal: 12.5)), + decoration: BoxDecoration( + // color: Colors.red, + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(ParseUtil.stringParseDouble(model?.bottomLeftRadius)), + bottomRight: Radius.circular(ParseUtil.stringParseDouble(model?.bottomRightRadius)), + topLeft: Radius.circular(ParseUtil.stringParseDouble(model?.topLeftRadius)), + topRight: Radius.circular(ParseUtil.stringParseDouble(model?.topRightRadius)), + )), + child: Container( + padding: const EdgeInsets.only(left: 12, right: 12, top: 12, bottom: 14), + height: 200, + width: double.infinity, + decoration: BoxDecoration( + image: DecorationImage( + image: CachedNetworkImageProvider(model?.bgImageUrl ?? '') + ) + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + // 标题 + CachedNetworkImage(imageUrl: model?.titleImageUrl, width: 90,), + // SizedBox(height: 20), + // 文案 + Text(model?.text?? '', style: TextStyle(color: HexColor.fromHex(model?.textColor), fontSize: 15),), + // SizedBox(height: 22), + // 复制按钮 or 分享 按钮 + Visibility( + visible: (model?.isShowShareFriend ?? '0') == '1', + // 仅仅复制按钮 + replacement: GestureDetector( onTap: () => _clickCopyButton(model?.text) ,child: CachedNetworkImage(imageUrl: model?.copyLongImageUrl ?? '', width: double.infinity)), + child: Row( + children: [ + // 复制按钮 + Flexible(flex: 1, child: GestureDetector(onTap: () => _clickCopyButton(model?.text),child: CachedNetworkImage(imageUrl: model?.copyImageUrl, width: double.infinity,))), + SizedBox(width: 20), + // 分享按钮 + Flexible(flex: 1,child: GestureDetector(onTap: ()=> _clickShareButton(model?.text), child: CachedNetworkImage(imageUrl: model?.shareImageUrl, width: double.infinity,))) + ], + )) + ], + ), + ) + ); + } + + /// 骨架图 + Widget _getSkeletonWidget() { + return CustomShareContentSkeleton(); + } + + /// 无数据视图 or 异常 + Widget _errorWidget() { + return Container(); + } + +} + diff --git a/lib/widgets/share/share_alert.dart b/lib/widgets/share/share_alert.dart index 52dc0f8..327fa31 100644 --- a/lib/widgets/share/share_alert.dart +++ b/lib/widgets/share/share_alert.dart @@ -278,9 +278,9 @@ class _ShareAlertContentState extends State<_ShareAlertContent> { } else { var type = SSDKContentTypes.auto; - if (widget?.model?.image?.length != 0 && widget.model?.url != null) { + if ((widget?.model?.image?.length ?? 0) != 0 && widget.model?.url != null) { type = SSDKContentTypes.webpage; - } else if (widget?.model?.image?.length != 0) { + } else if ((widget?.model?.image?.length ?? 0) != 0) { type = SSDKContentTypes.image; } else if (widget?.model?.title != null || widget.model?.content != null) { type = SSDKContentTypes.text;