@@ -602,7 +602,7 @@ | |||||
"languageVersion": "2.1" | "languageVersion": "2.1" | ||||
} | } | ||||
], | ], | ||||
"generated": "2020-09-29T09:19:18.536482Z", | |||||
"generated": "2020-09-29T09:31:08.197502Z", | |||||
"generator": "pub", | "generator": "pub", | ||||
"generatorVersion": "2.7.2" | "generatorVersion": "2.7.2" | ||||
} | } |
@@ -27,8 +27,8 @@ | |||||
// 获取设置 | // 获取设置 | ||||
- (NSDictionary*)getSetting { | - (NSDictionary*)getSetting { | ||||
return @{ | return @{ | ||||
@"domain": @"http://inapi.izhyin.cn" | |||||
//@"domain": @"http://192.168.0.113:5000" | |||||
//@"domain": @"http://inapi.izhyin.cn" | |||||
@"domain": @"http://192.168.0.113:5000" | |||||
}; | }; | ||||
} | } | ||||
@@ -1,15 +1,21 @@ | |||||
import 'dart:async'; | import 'dart:async'; | ||||
import 'package:zhiying_base_widget/pages/goods_share_page/models/goods_share_temp_add_model.dart'; | |||||
import 'package:zhiying_comm/util/base_bloc.dart'; | import 'package:zhiying_comm/util/base_bloc.dart'; | ||||
import 'package:zhiying_comm/zhiying_comm.dart'; | import 'package:zhiying_comm/zhiying_comm.dart'; | ||||
class GoodsShareData { | |||||
List<Map<String, dynamic>> tabs; | |||||
List<GoodsShareTempDataModel> datas; | |||||
} | |||||
class GoodsShareBloc extends BlocBase { | class GoodsShareBloc extends BlocBase { | ||||
List<Map<String, dynamic>> _tabs; | |||||
GoodsShareData _data = GoodsShareData(); | |||||
StreamController<List<Map<String, dynamic>>> _tabController = | |||||
StreamController<List<Map<String, dynamic>>>(); | |||||
StreamController<GoodsShareData> _tabController = | |||||
StreamController<GoodsShareData>(); | |||||
Stream<List<Map<String, dynamic>>> get outData => _tabController.stream; | |||||
Stream<GoodsShareData> get outData => _tabController.stream; | |||||
@override | @override | ||||
void dispose() { | void dispose() { | ||||
@@ -17,23 +23,33 @@ class GoodsShareBloc extends BlocBase { | |||||
_tabController = null; | _tabController = null; | ||||
} | } | ||||
void loadData(String shopType) async { | |||||
void loadData(String shopType, Map<String, dynamic> params) async { | |||||
var json = await NetUtil.post('/api/v1/share/${shopType}', params: params); | |||||
Map<String, dynamic> data = json['data']; | |||||
List shareTemp = data['data_list']; | |||||
_data.datas = shareTemp.map((item) { | |||||
return GoodsShareTempDataModel.fromJson(Map<String, dynamic>.from(item)); | |||||
}).toList(); | |||||
NetUtil.request( | NetUtil.request( | ||||
'/api/v1/mod/pub.flutter.share?share_type=${shopType.toString()}', | |||||
method: NetMethod.GET, onCache: (data) { | |||||
_loadData(data); | |||||
}, onSuccess: (data) { | |||||
_loadData(data); | |||||
}); | |||||
'/api/v1/mod/pub.flutter.share?share_type=${shopType.toString()}', | |||||
method: NetMethod.GET, | |||||
onCache: (data) { | |||||
_loadData(data); | |||||
}, | |||||
onSuccess: (data) { | |||||
_loadData(data); | |||||
}, | |||||
); | |||||
} | } | ||||
void _loadData(dynamic data) { | void _loadData(dynamic data) { | ||||
try { | try { | ||||
List list = Map<String, dynamic>.from(data)['mod_list']; | List list = Map<String, dynamic>.from(data)['mod_list']; | ||||
_tabs = list.map((item) { | |||||
_data.tabs = list.map((item) { | |||||
return Map<String, dynamic>.from(item); | return Map<String, dynamic>.from(item); | ||||
}).toList(); | }).toList(); | ||||
_tabController.add(_tabs); | |||||
_tabController.add(_data); | |||||
} catch (err) { | } catch (err) { | ||||
Logger.error(err); | Logger.error(err); | ||||
} | } | ||||
@@ -1,15 +1,20 @@ | |||||
import 'dart:convert' as convert; | import 'dart:convert' as convert; | ||||
import 'dart:io'; | |||||
import 'dart:typed_data'; | |||||
import 'package:flutter/cupertino.dart'; | import 'package:flutter/cupertino.dart'; | ||||
import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
import 'package:flutter/services.dart'; | |||||
import 'package:fluttertoast/fluttertoast.dart'; | import 'package:fluttertoast/fluttertoast.dart'; | ||||
import 'package:save_image/save_image.dart'; | |||||
import 'package:zhiying_base_widget/pages/goods_share_page/goods_share_editor/goods_share_editor.dart'; | import 'package:zhiying_base_widget/pages/goods_share_page/goods_share_editor/goods_share_editor.dart'; | ||||
import 'package:zhiying_base_widget/pages/goods_share_page/goods_share_image/goods_share_image_model.dart'; | import 'package:zhiying_base_widget/pages/goods_share_page/goods_share_image/goods_share_image_model.dart'; | ||||
import 'package:zhiying_base_widget/pages/goods_share_page/models/goods_share_temp_add_model.dart'; | |||||
import 'package:zhiying_base_widget/pages/goods_share_page/widgets/good_share_msg.dart'; | import 'package:zhiying_base_widget/pages/goods_share_page/widgets/good_share_msg.dart'; | ||||
import 'package:zhiying_base_widget/pages/goods_share_page/widgets/goods_share_alert_content.dart'; | |||||
import 'package:zhiying_base_widget/pages/goods_share_page/widgets/goods_share_edit.dart'; | import 'package:zhiying_base_widget/pages/goods_share_page/widgets/goods_share_edit.dart'; | ||||
import 'package:zhiying_base_widget/pages/goods_share_page/widgets/goods_share_image.dart'; | import 'package:zhiying_base_widget/pages/goods_share_page/widgets/goods_share_image.dart'; | ||||
import 'package:zhiying_base_widget/pages/goods_share_page/widgets/goods_share_item.dart'; | import 'package:zhiying_base_widget/pages/goods_share_page/widgets/goods_share_item.dart'; | ||||
import 'package:zhiying_base_widget/utils/image_download_util/image_download_util.dart'; | |||||
import 'package:zhiying_base_widget/widgets/public/custom_button/custom_bottom.dart'; | import 'package:zhiying_base_widget/widgets/public/custom_button/custom_bottom.dart'; | ||||
import 'package:zhiying_base_widget/widgets/public/custom_button/custom_button_model.dart'; | import 'package:zhiying_base_widget/widgets/public/custom_button/custom_button_model.dart'; | ||||
import 'package:zhiying_base_widget/widgets/share/models/share_data_model.dart'; | import 'package:zhiying_base_widget/widgets/share/models/share_data_model.dart'; | ||||
@@ -17,8 +22,9 @@ import 'package:zhiying_base_widget/widgets/share/share_alert.dart'; | |||||
class GoodsShareImage extends StatefulWidget { | class GoodsShareImage extends StatefulWidget { | ||||
final Map<String, dynamic> model; | final Map<String, dynamic> model; | ||||
final GoodsShareTempDataModel datas; | |||||
const GoodsShareImage(this.model, {Key key}) : super(key: key); | |||||
const GoodsShareImage(this.model, this.datas, {Key key}) : super(key: key); | |||||
@override | @override | ||||
_GoodsShareImageState createState() => _GoodsShareImageState(); | _GoodsShareImageState createState() => _GoodsShareImageState(); | ||||
@@ -28,6 +34,7 @@ class _GoodsShareImageState extends State<GoodsShareImage> { | |||||
GoodsShareImageModel _style; | GoodsShareImageModel _style; | ||||
Map<int, String> _images = Map(); | Map<int, String> _images = Map(); | ||||
List<Widget> widgets = List(); | List<Widget> widgets = List(); | ||||
String _content = ''; | |||||
// 分享数据 | // 分享数据 | ||||
final ShareDataModel _shareModel = ShareDataModel(); | final ShareDataModel _shareModel = ShareDataModel(); | ||||
@@ -37,6 +44,7 @@ class _GoodsShareImageState extends State<GoodsShareImage> { | |||||
String data = widget.model['data']; | String data = widget.model['data']; | ||||
var d = convert.jsonDecode(data); | var d = convert.jsonDecode(data); | ||||
_style = GoodsShareImageModel.fromJson(Map<String, dynamic>.from(d)); | _style = GoodsShareImageModel.fromJson(Map<String, dynamic>.from(d)); | ||||
_content = widget.datas.shareContent; | |||||
super.initState(); | super.initState(); | ||||
} | } | ||||
@@ -48,9 +56,10 @@ class _GoodsShareImageState extends State<GoodsShareImage> { | |||||
imgCheck: _style.cssList.unChooseImage, | imgCheck: _style.cssList.unChooseImage, | ||||
imgCheckSelected: _style.cssList.chooseImage, | imgCheckSelected: _style.cssList.chooseImage, | ||||
child: GoodsShareEdit( | child: GoodsShareEdit( | ||||
_style.content, | |||||
_content, | |||||
onCopyClick: () { | onCopyClick: () { | ||||
Fluttertoast.showToast(msg: '复制成功'); | |||||
Clipboard.setData(ClipboardData(text: _content)); | |||||
Fluttertoast.showToast(msg: '文案已复制'); | |||||
}, | }, | ||||
onEditorClick: () { | onEditorClick: () { | ||||
Fluttertoast.showToast(msg: '正在开发中'); | Fluttertoast.showToast(msg: '正在开发中'); | ||||
@@ -60,7 +69,7 @@ class _GoodsShareImageState extends State<GoodsShareImage> { | |||||
}, | }, | ||||
), | ), | ||||
onSelected: (isSelected) { | onSelected: (isSelected) { | ||||
_shareModel.content = isSelected ? '' : _style.content; | |||||
_shareModel.content = isSelected ? _content : ''; | |||||
}, | }, | ||||
)); | )); | ||||
for (String message in _style.customContent) { | for (String message in _style.customContent) { | ||||
@@ -137,23 +146,34 @@ class _GoodsShareImageState extends State<GoodsShareImage> { | |||||
children: <Widget>[ | children: <Widget>[ | ||||
btnCopy == null | btnCopy == null | ||||
? Container() | ? Container() | ||||
: Container( | |||||
width: 95, | |||||
height: 36, | |||||
decoration: BoxDecoration( | |||||
borderRadius: BorderRadius.circular(18), | |||||
), | |||||
child: CustomButton(btnCopy)), | |||||
: GestureDetector( | |||||
child: Container( | |||||
width: 95, | |||||
height: 36, | |||||
decoration: BoxDecoration( | |||||
borderRadius: BorderRadius.circular(18), | |||||
), | |||||
child: CustomButton(btnCopy)), | |||||
onTap: () { | |||||
Clipboard.setData(ClipboardData(text: _content)); | |||||
Fluttertoast.showToast(msg: '文案已复制'); | |||||
}, | |||||
), | |||||
btnSave == null | btnSave == null | ||||
? Container() | ? Container() | ||||
: Container( | |||||
margin: EdgeInsets.only(left: 5), | |||||
width: 95, | |||||
height: 36, | |||||
decoration: BoxDecoration( | |||||
borderRadius: BorderRadius.circular(18), | |||||
: GestureDetector( | |||||
child: Container( | |||||
margin: EdgeInsets.only(left: 5), | |||||
width: 95, | |||||
height: 36, | |||||
decoration: BoxDecoration( | |||||
borderRadius: BorderRadius.circular(18), | |||||
), | |||||
child: CustomButton(btnSave), | |||||
), | ), | ||||
child: CustomButton(btnSave), | |||||
onTap: () { | |||||
_saveImages(); | |||||
}, | |||||
), | ), | ||||
btnShare == null | btnShare == null | ||||
? Container() | ? Container() | ||||
@@ -168,7 +188,7 @@ class _GoodsShareImageState extends State<GoodsShareImage> { | |||||
), | ), | ||||
child: CustomButton(btnShare)), | child: CustomButton(btnShare)), | ||||
onTap: () { | onTap: () { | ||||
_showShare(); | |||||
_showShareAlert(); | |||||
}, | }, | ||||
), | ), | ||||
), | ), | ||||
@@ -178,21 +198,64 @@ class _GoodsShareImageState extends State<GoodsShareImage> { | |||||
); | ); | ||||
} | } | ||||
void _showShare() async { | |||||
void _saveImages() async { | |||||
List<String> images = List(); | List<String> images = List(); | ||||
for (int index = 0; index < _style.customImage.length; index++) { | for (int index = 0; index < _style.customImage.length; index++) { | ||||
if (_images.containsKey(index)) { | if (_images.containsKey(index)) { | ||||
images.add(_images[index]); | images.add(_images[index]); | ||||
} | } | ||||
} | } | ||||
if (images.length >= 0) { | |||||
if (images.length > 0) { | |||||
_shareModel.image = images; | _shareModel.image = images; | ||||
} else { | |||||
_shareModel.image = null; | |||||
} | } | ||||
if ((_shareModel.image == null || _shareModel.image.length == 0)) { | |||||
Fluttertoast.showToast(msg: '请选择要保存的图片'); | |||||
return; | |||||
} | |||||
List<String> paths = await ImageDownloadUtil.download(images); | |||||
paths.forEach((path) async { | |||||
Uint8List data = File(path).readAsBytesSync(); | |||||
bool isSaveSuccess = await SaveImage.save(imageBytes: data); | |||||
if (!isSaveSuccess) { | |||||
Fluttertoast.showToast(msg: '保存失败'); | |||||
return; | |||||
} | |||||
}); | |||||
Fluttertoast.showToast(msg: '保存成功'); | |||||
} | |||||
// 弹出分享框 | |||||
void _showShareAlert() async { | |||||
List<String> images = List(); | |||||
for (int index = 0; index < _style.customImage.length; index++) { | |||||
if (_images.containsKey(index)) { | |||||
images.add(_images[index]); | |||||
} | |||||
} | |||||
if (images.length > 0) { | |||||
_shareModel.image = images; | |||||
} else { | |||||
_shareModel.image = null; | |||||
} | |||||
if ((_shareModel.title == null || _shareModel.title == '') && | |||||
(_shareModel.image == null || _shareModel.image.length == 0) && | |||||
(_shareModel.content == null || _shareModel.content == '') && | |||||
(_shareModel.url == null || _shareModel.url == '')) { | |||||
Fluttertoast.showToast(msg: '请选择要分享的内容'); | |||||
return; | |||||
} | |||||
showCupertinoModalPopup( | showCupertinoModalPopup( | ||||
context: context, | context: context, | ||||
builder: (context) => ShareAlert( | builder: (context) => ShareAlert( | ||||
_shareModel, | _shareModel, | ||||
child: GoodsShareAlertContent(), | |||||
'pub.flutter.share_icon', | |||||
// child: GoodsShareAlertContent(), | |||||
), | ), | ||||
); | ); | ||||
} | } | ||||
@@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; | |||||
import 'package:fluttertoast/fluttertoast.dart'; | import 'package:fluttertoast/fluttertoast.dart'; | ||||
import 'package:zhiying_base_widget/pages/goods_share_page/goods_share_editor/goods_share_editor.dart'; | import 'package:zhiying_base_widget/pages/goods_share_page/goods_share_editor/goods_share_editor.dart'; | ||||
import 'package:zhiying_base_widget/pages/goods_share_page/goods_share_image/goods_share_image_model.dart'; | import 'package:zhiying_base_widget/pages/goods_share_page/goods_share_image/goods_share_image_model.dart'; | ||||
import 'package:zhiying_base_widget/pages/goods_share_page/models/goods_share_temp_add_model.dart'; | |||||
import 'package:zhiying_base_widget/pages/goods_share_page/widgets/good_share_msg.dart'; | import 'package:zhiying_base_widget/pages/goods_share_page/widgets/good_share_msg.dart'; | ||||
import 'package:zhiying_base_widget/pages/goods_share_page/widgets/goods_share_alert_content.dart'; | import 'package:zhiying_base_widget/pages/goods_share_page/widgets/goods_share_alert_content.dart'; | ||||
import 'package:zhiying_base_widget/pages/goods_share_page/widgets/goods_share_edit.dart'; | import 'package:zhiying_base_widget/pages/goods_share_page/widgets/goods_share_edit.dart'; | ||||
@@ -18,7 +19,9 @@ import 'package:zhiying_base_widget/widgets/share/share_alert.dart'; | |||||
class GoodsShareLink extends StatefulWidget { | class GoodsShareLink extends StatefulWidget { | ||||
final Map<String, dynamic> model; | final Map<String, dynamic> model; | ||||
const GoodsShareLink(this.model, {Key key}) : super(key: key); | |||||
final GoodsShareTempDataModel datas; | |||||
const GoodsShareLink(this.model, this.datas, {Key key}) : super(key: key); | |||||
@override | @override | ||||
_GoodsShareLinkState createState() => _GoodsShareLinkState(); | _GoodsShareLinkState createState() => _GoodsShareLinkState(); | ||||
@@ -172,6 +175,7 @@ class _GoodsShareLinkState extends State<GoodsShareLink> { | |||||
context: context, | context: context, | ||||
builder: (context) => ShareAlert( | builder: (context) => ShareAlert( | ||||
_shareModel, | _shareModel, | ||||
'', | |||||
child: GoodsShareAlertContent(), | child: GoodsShareAlertContent(), | ||||
), | ), | ||||
); | ); | ||||
@@ -1,11 +1,15 @@ | |||||
import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
import 'package:zhiying_base_widget/pages/goods_share_page/models/goods_share_temp_add_model.dart'; | |||||
import 'package:zhiying_base_widget/pages/goods_share_page/widgets/goods_share_item.dart'; | import 'package:zhiying_base_widget/pages/goods_share_page/widgets/goods_share_item.dart'; | ||||
import 'package:zhiying_base_widget/pages/goods_share_page/widgets/goods_share_miniprogram_widget.dart'; | import 'package:zhiying_base_widget/pages/goods_share_page/widgets/goods_share_miniprogram_widget.dart'; | ||||
class GoodsShareMiniprogram extends StatefulWidget { | class GoodsShareMiniprogram extends StatefulWidget { | ||||
final Map<String, dynamic> model; | final Map<String, dynamic> model; | ||||
const GoodsShareMiniprogram(this.model, {Key key}) : super(key: key); | |||||
final GoodsShareTempDataModel datas; | |||||
const GoodsShareMiniprogram(this.model, this.datas, {Key key}) | |||||
: super(key: key); | |||||
@override | @override | ||||
_GoodsShareMiniprogramState createState() => _GoodsShareMiniprogramState(); | _GoodsShareMiniprogramState createState() => _GoodsShareMiniprogramState(); | ||||
@@ -1,9 +1,12 @@ | |||||
import 'dart:convert' as convert; | |||||
import 'package:flutter/cupertino.dart'; | import 'package:flutter/cupertino.dart'; | ||||
import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
import 'package:zhiying_base_widget/pages/goods_share_page/goods_share_bloc.dart'; | import 'package:zhiying_base_widget/pages/goods_share_page/goods_share_bloc.dart'; | ||||
import 'package:zhiying_base_widget/pages/goods_share_page/goods_share_image/goods_share_image.dart'; | import 'package:zhiying_base_widget/pages/goods_share_page/goods_share_image/goods_share_image.dart'; | ||||
import 'package:zhiying_base_widget/pages/goods_share_page/goods_share_link/goods_share_link.dart'; | import 'package:zhiying_base_widget/pages/goods_share_page/goods_share_link/goods_share_link.dart'; | ||||
import 'package:zhiying_base_widget/pages/goods_share_page/goods_share_miniprogram/goods_share_miniprogram.dart'; | import 'package:zhiying_base_widget/pages/goods_share_page/goods_share_miniprogram/goods_share_miniprogram.dart'; | ||||
import 'package:zhiying_base_widget/pages/goods_share_page/models/goods_share_temp_add_model.dart'; | |||||
import 'package:zhiying_comm/util/base_bloc.dart'; | import 'package:zhiying_comm/util/base_bloc.dart'; | ||||
import 'package:zhiying_comm/zhiying_comm.dart'; | import 'package:zhiying_comm/zhiying_comm.dart'; | ||||
@@ -44,8 +47,12 @@ class _GoodsShareContainerState extends State<_GoodsShareContainer> | |||||
@override | @override | ||||
void initState() { | void initState() { | ||||
String d = widget.model['data']; | |||||
Map<String, dynamic> data = | |||||
Map<String, dynamic>.from(convert.jsonDecode(d)); | |||||
Logger.debug(data['share_url_args'].toString()); | |||||
_bloc = BlocProvider.of<GoodsShareBloc>(context); | _bloc = BlocProvider.of<GoodsShareBloc>(context); | ||||
_bloc.loadData('taobao'); | |||||
_bloc.loadData('taobao', data['share_url_args']); | |||||
super.initState(); | super.initState(); | ||||
} | } | ||||
@@ -54,30 +61,37 @@ class _GoodsShareContainerState extends State<_GoodsShareContainer> | |||||
return Scaffold( | return Scaffold( | ||||
backgroundColor: Color(0xfff8f8f8), | backgroundColor: Color(0xfff8f8f8), | ||||
appBar: _createNav(), | appBar: _createNav(), | ||||
body: StreamBuilder<List<Map<String, dynamic>>>( | |||||
body: StreamBuilder<GoodsShareData>( | |||||
stream: _bloc.outData, | stream: _bloc.outData, | ||||
builder: (BuildContext context, AsyncSnapshot snapshot) { | builder: (BuildContext context, AsyncSnapshot snapshot) { | ||||
List<Map<String, dynamic>> list = snapshot.data; | |||||
if (list == null || list.length == 0) { | |||||
GoodsShareData data = snapshot.data; | |||||
List<Map<String, dynamic>> list = data?.tabs; | |||||
List<GoodsShareTempDataModel> datas = data?.datas; | |||||
if (list == null || | |||||
list.length == 0 || | |||||
datas == null || | |||||
datas.length == 0) { | |||||
return Container(); | return Container(); | ||||
} | } | ||||
_tabController = TabController(length: list.length, vsync: this); | _tabController = TabController(length: list.length, vsync: this); | ||||
_tabs.clear(); | _tabs.clear(); | ||||
_contents.clear(); | _contents.clear(); | ||||
list.forEach((item) { | |||||
for (int i = 0; i < list.length && i < datas.length; i++) { | |||||
Map<String, dynamic> item = list[i]; | |||||
GoodsShareTempDataModel model = datas[i]; | |||||
_tabs.add(_createTabItem(item['title'])); | _tabs.add(_createTabItem(item['title'])); | ||||
String mod_name = item['mod_name']; | String mod_name = item['mod_name']; | ||||
if (mod_name == 'share_goods_image.taobao') { | if (mod_name == 'share_goods_image.taobao') { | ||||
_contents.add(GoodsShareImage(item)); | |||||
_contents.add(GoodsShareImage(item, model)); | |||||
} else if (mod_name == 'share_goods_link.taobao') { | } else if (mod_name == 'share_goods_link.taobao') { | ||||
_contents.add(GoodsShareLink(item)); | |||||
_contents.add(GoodsShareLink(item, model)); | |||||
} else if (mod_name == 'share_goods_mini.taobao') { | } else if (mod_name == 'share_goods_mini.taobao') { | ||||
_contents.add(GoodsShareMiniprogram(item)); | |||||
_contents.add(GoodsShareMiniprogram(item, model)); | |||||
} else { | } else { | ||||
_contents.add(Container()); | _contents.add(Container()); | ||||
} | } | ||||
}); | |||||
} | |||||
return Column( | return Column( | ||||
children: <Widget>[ | children: <Widget>[ | ||||
@@ -0,0 +1,62 @@ | |||||
class GoodsShareTempDataModel { | |||||
String shareContent; | |||||
List<GoodsShareTempAddModel> shareTemplate; | |||||
String shareTip; | |||||
String appUrl; | |||||
String miniAppUrl; | |||||
GoodsShareTempDataModel( | |||||
{this.shareContent, | |||||
this.shareTemplate, | |||||
this.shareTip, | |||||
this.appUrl, | |||||
this.miniAppUrl}); | |||||
GoodsShareTempDataModel.fromJson(Map<String, dynamic> json) { | |||||
shareContent = json['share_content']; | |||||
if (json['share_template'] != null) { | |||||
shareTemplate = new List<GoodsShareTempAddModel>(); | |||||
json['share_template'].forEach((v) { | |||||
shareTemplate.add(new GoodsShareTempAddModel.fromJson(v)); | |||||
}); | |||||
} | |||||
shareTip = json['share_tip']; | |||||
appUrl = json['app_url']; | |||||
miniAppUrl = json['mini_app_url']; | |||||
} | |||||
Map<String, dynamic> toJson() { | |||||
final Map<String, dynamic> data = new Map<String, dynamic>(); | |||||
data['share_content'] = this.shareContent; | |||||
if (this.shareTemplate != null) { | |||||
data['share_template'] = | |||||
this.shareTemplate.map((v) => v.toJson()).toList(); | |||||
} | |||||
data['share_tip'] = this.shareTip; | |||||
data['app_url'] = this.appUrl; | |||||
data['mini_app_url'] = this.miniAppUrl; | |||||
return data; | |||||
} | |||||
} | |||||
class GoodsShareTempAddModel { | |||||
String name; | |||||
String val; | |||||
String temp; | |||||
GoodsShareTempAddModel({this.name, this.val, this.temp}); | |||||
GoodsShareTempAddModel.fromJson(Map<String, dynamic> json) { | |||||
name = json['name']; | |||||
val = json['val']; | |||||
temp = json['temp']; | |||||
} | |||||
Map<String, dynamic> toJson() { | |||||
final Map<String, dynamic> data = new Map<String, dynamic>(); | |||||
data['name'] = this.name; | |||||
data['val'] = this.val; | |||||
data['temp'] = this.temp; | |||||
return data; | |||||
} | |||||
} |
@@ -5,6 +5,9 @@ class GoodsShareEdit extends StatelessWidget { | |||||
final VoidCallback onEditorClick; | final VoidCallback onEditorClick; | ||||
final VoidCallback onCopyClick; | final VoidCallback onCopyClick; | ||||
// final String imgCheck; | |||||
// final String imgCheckSelected; | |||||
const GoodsShareEdit(this.message, | const GoodsShareEdit(this.message, | ||||
{Key key, this.onEditorClick, this.onCopyClick}) | {Key key, this.onEditorClick, this.onCopyClick}) | ||||
: super(key: key); | : super(key: key); | ||||
@@ -1,6 +1,12 @@ | |||||
import 'dart:convert'; | |||||
import 'package:cached_network_image/cached_network_image.dart'; | import 'package:cached_network_image/cached_network_image.dart'; | ||||
import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
import 'package:flutter_alibc/alibc_model.dart'; | |||||
import 'package:flutter_alibc/flutter_alibc.dart'; | |||||
import 'package:flutter_bloc/flutter_bloc.dart'; | import 'package:flutter_bloc/flutter_bloc.dart'; | ||||
import 'package:fluttertoast/fluttertoast.dart'; | |||||
import 'package:provider/provider.dart'; | |||||
import 'package:zhiying_base_widget/pages/goods_share_page/goods_share_page.dart'; | import 'package:zhiying_base_widget/pages/goods_share_page/goods_share_page.dart'; | ||||
import 'package:zhiying_base_widget/widgets/goods_details/footer/bloc/goods_details_footer_bloc.dart'; | import 'package:zhiying_base_widget/widgets/goods_details/footer/bloc/goods_details_footer_bloc.dart'; | ||||
import 'package:zhiying_base_widget/widgets/goods_details/footer/bloc/goods_details_footer_repository.dart'; | import 'package:zhiying_base_widget/widgets/goods_details/footer/bloc/goods_details_footer_repository.dart'; | ||||
@@ -25,13 +31,17 @@ class GoodsDetailsFooterWidget extends StatelessWidget { | |||||
create: (_) => | create: (_) => | ||||
GoodsDetailsFooterBloc(repository: GoodsDetailsFooterRepository()) | GoodsDetailsFooterBloc(repository: GoodsDetailsFooterRepository()) | ||||
..add(GoodsDetailsFooterInitEvent(model: model)), | ..add(GoodsDetailsFooterInitEvent(model: model)), | ||||
child: GooddsDetailsFooterContainer(), | |||||
child: GooddsDetailsFooterContainer(model), | |||||
), | ), | ||||
); | ); | ||||
} | } | ||||
} | } | ||||
class GooddsDetailsFooterContainer extends StatefulWidget { | class GooddsDetailsFooterContainer extends StatefulWidget { | ||||
final Map<String, dynamic> model; | |||||
const GooddsDetailsFooterContainer(this.model, {Key key}) : super(key: key); | |||||
@override | @override | ||||
_GooddsDetailsFooterContainerState createState() => | _GooddsDetailsFooterContainerState createState() => | ||||
_GooddsDetailsFooterContainerState(); | _GooddsDetailsFooterContainerState(); | ||||
@@ -39,12 +49,16 @@ class GooddsDetailsFooterContainer extends StatefulWidget { | |||||
class _GooddsDetailsFooterContainerState | class _GooddsDetailsFooterContainerState | ||||
extends State<GooddsDetailsFooterContainer> { | extends State<GooddsDetailsFooterContainer> { | ||||
UserInfoModel _user; | |||||
/// 打开首页 | /// 打开首页 | ||||
void _openHome() { | void _openHome() { | ||||
Navigator.pushAndRemoveUntil( | Navigator.pushAndRemoveUntil( | ||||
context, | context, | ||||
MaterialPageRoute(builder: (BuildContext context) => PageFactory.create('homePage', null)), | |||||
(Route<dynamic> route) => false, | |||||
MaterialPageRoute( | |||||
builder: (BuildContext context) => | |||||
PageFactory.create('homePage', null)), | |||||
(Route<dynamic> route) => false, | |||||
); | ); | ||||
} | } | ||||
@@ -53,15 +67,49 @@ class _GooddsDetailsFooterContainerState | |||||
/// 分享 | /// 分享 | ||||
void _shareOnClick(GoodsDetailsFooterModel model) { | void _shareOnClick(GoodsDetailsFooterModel model) { | ||||
Navigator.of(context).push(MaterialPageRoute( | |||||
builder: (context) => GoodsSharePage(model.toJson()))); | |||||
print(_user?.toString()); | |||||
if (_user?.token == null || _user.token == '') { | |||||
print('need login...'); | |||||
RouterUtil.goLogin(context); | |||||
return; | |||||
} | |||||
Navigator.of(context).push( | |||||
MaterialPageRoute(builder: (context) => GoodsSharePage(widget.model))); | |||||
} | } | ||||
/// 自购省 | /// 自购省 | ||||
void _savemoneyOnClick() {} | |||||
void _savemoneyOnClick(GoodsDetailsFooterModel model) async { | |||||
print(_user?.toString()); | |||||
if (_user?.token == null || _user.token == '') { | |||||
print('need login...'); | |||||
RouterUtil.goLogin(context); | |||||
return; | |||||
} | |||||
String d = widget.model['data']; | |||||
Map<String, dynamic> data = jsonDecode(d); | |||||
Map shareArgs = data['share_url_args'] ?? {}; | |||||
String shopType = shareArgs['type']; | |||||
if (data.containsKey('buy_url')) { | |||||
String url = data['buy_url']; | |||||
if (url == null || url == '') { | |||||
Fluttertoast.showToast(msg: '购买链接不存在'); | |||||
return; | |||||
} | |||||
if (shopType == 'taobao') { | |||||
TradeResult result = await FlutterAlibc.openByUrl(url: url); | |||||
Logger.debug('${result.errorCode} ${result.errorMessage} '); | |||||
} else { | |||||
RouterUtil.openWebview(url, context); | |||||
} | |||||
} | |||||
} | |||||
@override | @override | ||||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
_user = Provider.of<UserInfoNotifier>(context).userInfo; | |||||
return BlocConsumer<GoodsDetailsFooterBloc, GoodsDetailsFooterState>( | return BlocConsumer<GoodsDetailsFooterBloc, GoodsDetailsFooterState>( | ||||
listener: (context, state) {}, | listener: (context, state) {}, | ||||
buildWhen: (prev, current) { | buildWhen: (prev, current) { | ||||
@@ -207,7 +255,7 @@ class _GooddsDetailsFooterContainerState | |||||
Widget _getZgsButton(GoodsDetailsFooterModel model) { | Widget _getZgsButton(GoodsDetailsFooterModel model) { | ||||
return GestureDetector( | return GestureDetector( | ||||
behavior: HitTestBehavior.opaque, | behavior: HitTestBehavior.opaque, | ||||
onTap: () => _savemoneyOnClick(), | |||||
onTap: () => _savemoneyOnClick(model), | |||||
child: Container( | child: Container( | ||||
alignment: Alignment.center, | alignment: Alignment.center, | ||||
// padding: const EdgeInsets.only(left: 30, right: 30, top: 5, bottom: 5), | // padding: const EdgeInsets.only(left: 30, right: 30, top: 5, bottom: 5), | ||||
@@ -2,6 +2,7 @@ import 'dart:convert' as convert; | |||||
import 'package:cached_network_image/cached_network_image.dart'; | import 'package:cached_network_image/cached_network_image.dart'; | ||||
import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
import 'package:provider/provider.dart'; | |||||
import 'package:zhiying_base_widget/widgets/home/home_auth/models/home_auth_model.dart'; | import 'package:zhiying_base_widget/widgets/home/home_auth/models/home_auth_model.dart'; | ||||
import 'package:zhiying_comm/zhiying_comm.dart'; | import 'package:zhiying_comm/zhiying_comm.dart'; | ||||
@@ -9,6 +10,7 @@ class HomeAuth extends StatelessWidget { | |||||
final Map<String, dynamic> data; | final Map<String, dynamic> data; | ||||
Map<String, dynamic> _json; | Map<String, dynamic> _json; | ||||
HomeAuthModel _style; | HomeAuthModel _style; | ||||
UserInfoModel _user; | |||||
HomeAuth(this.data, {Key key}) : super(key: key) { | HomeAuth(this.data, {Key key}) : super(key: key) { | ||||
String d = data['data']; | String d = data['data']; | ||||
@@ -18,6 +20,7 @@ class HomeAuth extends StatelessWidget { | |||||
@override | @override | ||||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
_user = Provider.of<UserInfoNotifier>(context).userInfo; | |||||
return Container( | return Container( | ||||
height: 34, | height: 34, | ||||
width: double.infinity, | width: double.infinity, | ||||
@@ -28,8 +31,9 @@ class HomeAuth extends StatelessWidget { | |||||
boxShadow: [ | boxShadow: [ | ||||
BoxShadow( | BoxShadow( | ||||
offset: Offset(2, 1), //x,y轴 | offset: Offset(2, 1), //x,y轴 | ||||
color: HexColor.fromHex(_style?.taoaboTipShadowColor ?? '767676') | |||||
.withAlpha(70), //投影颜色 | |||||
color: | |||||
HexColor.fromHex(_style?.taoaboTipShadowColor ?? '767676') | |||||
.withAlpha(70), //投影颜色 | |||||
blurRadius: 5 //投影距离 | blurRadius: 5 //投影距离 | ||||
) | ) | ||||
]), | ]), | ||||
@@ -60,17 +64,25 @@ class HomeAuth extends StatelessWidget { | |||||
padding: EdgeInsets.only(left: 12, right: 12, top: 3, bottom: 3), | padding: EdgeInsets.only(left: 12, right: 12, top: 3, bottom: 3), | ||||
margin: EdgeInsets.only(left: 8, right: 8), | margin: EdgeInsets.only(left: 8, right: 8), | ||||
decoration: BoxDecoration( | decoration: BoxDecoration( | ||||
color: HexColor.fromHex(_style?.taoaboTipBtnBgColor ?? 'FF4242'), | |||||
color: | |||||
HexColor.fromHex(_style?.taoaboTipBtnBgColor ?? 'FF4242'), | |||||
borderRadius: BorderRadius.circular(20)), | borderRadius: BorderRadius.circular(20)), | ||||
child: Text( | child: Text( | ||||
_style?.taoaboTipBtnText ?? '', | _style?.taoaboTipBtnText ?? '', | ||||
style: TextStyle( | style: TextStyle( | ||||
fontSize: 12, | fontSize: 12, | ||||
color: HexColor.fromHex(_style?.taoaboTipBtnTextColor ?? 'ffffff'), | |||||
color: HexColor.fromHex( | |||||
_style?.taoaboTipBtnTextColor ?? 'ffffff'), | |||||
), | ), | ||||
), | ), | ||||
), | ), | ||||
onTap: () async { | onTap: () async { | ||||
if (_user?.token == null || _user.token == '') { | |||||
print('need login...'); | |||||
RouterUtil.goLogin(context); | |||||
return; | |||||
} | |||||
bool isAuth = await TaobaoAuth.isAuth(); | bool isAuth = await TaobaoAuth.isAuth(); | ||||
if (!isAuth) { | if (!isAuth) { | ||||
TaobaoAuth.auth(context); | TaobaoAuth.auth(context); | ||||
@@ -1,7 +1,7 @@ | |||||
class ShareDataModel { | class ShareDataModel { | ||||
String title; | String title; | ||||
String content; | String content; | ||||
dynamic image; | |||||
List image; | |||||
String url; | String url; | ||||
ShareDataModel({ | ShareDataModel({ | ||||
@@ -0,0 +1,22 @@ | |||||
// 分享按钮 | |||||
class ShareIconModel { | |||||
String name; | |||||
String type; | |||||
String icon; | |||||
ShareIconModel({this.name, this.type, this.icon}); | |||||
ShareIconModel.fromJson(Map<String, dynamic> json) { | |||||
name = json['name']; | |||||
type = json['type']; | |||||
icon = json['icon']; | |||||
} | |||||
Map<String, dynamic> toJson() { | |||||
final Map<String, dynamic> data = new Map<String, dynamic>(); | |||||
data['name'] = this.name; | |||||
data['type'] = this.type; | |||||
data['icon'] = this.icon; | |||||
return data; | |||||
} | |||||
} |
@@ -1,19 +1,22 @@ | |||||
import 'dart:io'; | |||||
import 'dart:convert'; | |||||
import 'dart:ui'; | import 'dart:ui'; | ||||
import 'package:cached_network_image/cached_network_image.dart'; | |||||
import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
import 'package:share_extend/share_extend.dart'; | |||||
import 'package:sharesdk_plugin/sharesdk_plugin.dart'; | import 'package:sharesdk_plugin/sharesdk_plugin.dart'; | ||||
import 'package:zhiying_base_widget/utils/image_download_util/image_download_util.dart'; | import 'package:zhiying_base_widget/utils/image_download_util/image_download_util.dart'; | ||||
import 'package:zhiying_base_widget/widgets/share/models/share_data_model.dart'; | import 'package:zhiying_base_widget/widgets/share/models/share_data_model.dart'; | ||||
import 'package:zhiying_base_widget/widgets/share/models/share_plateform.dart'; | |||||
import 'package:zhiying_base_widget/widgets/share/models/share_icon_model.dart'; | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | import 'package:zhiying_comm/zhiying_comm.dart'; | ||||
import 'package:share_extend/share_extend.dart'; | |||||
class ShareAlert extends StatelessWidget { | class ShareAlert extends StatelessWidget { | ||||
final String skipIdentifier; | |||||
final Widget child; | final Widget child; | ||||
final ShareDataModel model; | final ShareDataModel model; | ||||
const ShareAlert(this.model, {Key key, this.child}) : super(key: key); // 中间视图 | |||||
const ShareAlert(this.model, this.skipIdentifier, {Key key, this.child}) | |||||
: super(key: key); // 中间视图 | |||||
@override | @override | ||||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
@@ -28,7 +31,7 @@ class ShareAlert extends StatelessWidget { | |||||
Expanded( | Expanded( | ||||
child: Center(child: child ?? Container()), | child: Center(child: child ?? Container()), | ||||
), | ), | ||||
_ShareAlertContent(this.model), | |||||
_ShareAlertContent(this.model, this.skipIdentifier), | |||||
], | ], | ||||
), | ), | ||||
), // 模糊化 | ), // 模糊化 | ||||
@@ -41,10 +44,44 @@ class ShareAlert extends StatelessWidget { | |||||
} | } | ||||
} | } | ||||
class _ShareAlertContent extends StatelessWidget { | |||||
class _ShareAlertContent extends StatefulWidget { | |||||
final ShareDataModel model; | final ShareDataModel model; | ||||
final String skipIdentifier; | |||||
const _ShareAlertContent(this.model, this.skipIdentifier, {Key key}) | |||||
: super(key: key); | |||||
@override | |||||
_ShareAlertContentState createState() => _ShareAlertContentState(); | |||||
} | |||||
const _ShareAlertContent(this.model, {Key key}) : super(key: key); | |||||
class _ShareAlertContentState extends State<_ShareAlertContent> { | |||||
List<ShareIconModel> _icons = []; | |||||
@override | |||||
void initState() { | |||||
NetUtil.request('/api/v1/mod/${widget.skipIdentifier}', | |||||
method: NetMethod.GET, onCache: (data) { | |||||
_parseData(data); | |||||
}, onSuccess: (data) { | |||||
_parseData(data); | |||||
}, onError: (err) {}); | |||||
super.initState(); | |||||
} | |||||
void _parseData(Map<String, dynamic> data) { | |||||
List modList = data['mod_list']; | |||||
Map d = modList.first; | |||||
if (d != null) { | |||||
String dString = d['data']; | |||||
List list = jsonDecode(dString); | |||||
_icons = list.map((item) { | |||||
return ShareIconModel.fromJson(Map<String, dynamic>.from(item)); | |||||
}).toList(); | |||||
setState(() {}); | |||||
} | |||||
} | |||||
@override | @override | ||||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
@@ -80,7 +117,7 @@ class _ShareAlertContent extends StatelessWidget { | |||||
), | ), | ||||
Container( | Container( | ||||
margin: | margin: | ||||
EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10), | |||||
EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10), | |||||
child: _createIcons(), | child: _createIcons(), | ||||
), | ), | ||||
GestureDetector( | GestureDetector( | ||||
@@ -115,13 +152,13 @@ class _ShareAlertContent extends StatelessWidget { | |||||
return Wrap( | return Wrap( | ||||
spacing: 10, | spacing: 10, | ||||
runSpacing: 10, | runSpacing: 10, | ||||
children: List.generate(6, (index) { | |||||
return _createIcon(); | |||||
}), | |||||
children: _icons.map((item) { | |||||
return _createIcon(item); | |||||
}).toList(), | |||||
); | ); | ||||
} | } | ||||
Widget _createIcon() { | |||||
Widget _createIcon(ShareIconModel item) { | |||||
return GestureDetector( | return GestureDetector( | ||||
child: Container( | child: Container( | ||||
width: 60, | width: 60, | ||||
@@ -130,14 +167,15 @@ class _ShareAlertContent extends StatelessWidget { | |||||
Container( | Container( | ||||
width: 40, | width: 40, | ||||
height: 40, | height: 40, | ||||
decoration: BoxDecoration( | |||||
borderRadius: BorderRadius.circular(20), | |||||
color: Colors.redAccent), | |||||
child: CachedNetworkImage( | |||||
imageUrl: item.icon, | |||||
fit: BoxFit.contain, | |||||
), | |||||
), | ), | ||||
Padding( | Padding( | ||||
padding: const EdgeInsets.only(top: 2, bottom: 2), | padding: const EdgeInsets.only(top: 2, bottom: 2), | ||||
child: Text( | child: Text( | ||||
'分享平台', | |||||
item.name, | |||||
style: TextStyle( | style: TextStyle( | ||||
fontSize: 12, | fontSize: 12, | ||||
color: Color(0xff333333), | color: Color(0xff333333), | ||||
@@ -148,67 +186,65 @@ class _ShareAlertContent extends StatelessWidget { | |||||
), | ), | ||||
), | ), | ||||
onTap: () { | onTap: () { | ||||
_shareByMob(SharePlateform.qq); | |||||
if (item.type == 'wx') { | |||||
_shareByMob(ShareSDKPlatforms.wechatSession); | |||||
} else if (item.type == 'pyq') { | |||||
_shareByMob(ShareSDKPlatforms.wechatTimeline); | |||||
} else if (item.type == 'qq') { | |||||
_shareByMob(ShareSDKPlatforms.qq); | |||||
} else if (item.type == 'qq_space') { | |||||
_shareByMob(ShareSDKPlatforms.qZone); | |||||
} else if (item.type == 'weibo') { | |||||
_shareByMob(ShareSDKPlatforms.sina); | |||||
} else if (item.type == 'more_setting') { | |||||
_shareBySystem(); | |||||
} | |||||
}, | }, | ||||
); | ); | ||||
} | } | ||||
void _shareByMob(SharePlateform plateform) async { | |||||
void _shareByMob(ShareSDKPlatform plateform) async { | |||||
// dynamic image; | |||||
if (widget.model.image != null && widget.model.image.length > 1) { | |||||
_shareMultipleImages(); | |||||
return; | |||||
} | |||||
//单独公共分享 | //单独公共分享 | ||||
SSDKMap params = SSDKMap() | SSDKMap params = SSDKMap() | ||||
..setGeneral( | ..setGeneral( | ||||
model.title, | |||||
model.content, | |||||
model.image, | |||||
widget.model.title, | |||||
widget.model.content, | |||||
widget.model.image, | |||||
null, | null, | ||||
null, | null, | ||||
model.url, | |||||
widget.model.url, | |||||
null, | null, | ||||
null, | null, | ||||
null, | null, | ||||
null, | null, | ||||
SSDKContentTypes.auto, | SSDKContentTypes.auto, | ||||
); | ); | ||||
ShareSDKPlatform p = ShareSDKPlatforms.wechatSession; | |||||
switch (plateform) { | |||||
case SharePlateform.wechatSession: | |||||
p = ShareSDKPlatforms.wechatSession; | |||||
break; | |||||
case SharePlateform.wechatTimeline: | |||||
p = ShareSDKPlatforms.wechatTimeline; | |||||
break; | |||||
case SharePlateform.qq: | |||||
p = ShareSDKPlatforms.qq; | |||||
break; | |||||
case SharePlateform.qqZone: | |||||
p = ShareSDKPlatforms.qZone; | |||||
break; | |||||
case SharePlateform.sina: | |||||
p = ShareSDKPlatforms.sina; | |||||
break; | |||||
} | |||||
if (model.image is List && (model.image as List).length > 1) { | |||||
List<String> paths = await ImageDownloadUtil.download(model.image); | |||||
ShareExtend.shareMultiple( | |||||
paths, "image", subject: ""); | |||||
return; | |||||
} | |||||
SharesdkPlugin.share(p, params, (SSDKResponseState state, Map userdata, | |||||
Map contentEntity, SSDKError error) { | |||||
SharesdkPlugin.share(plateform, params, (SSDKResponseState state, | |||||
Map userdata, Map contentEntity, SSDKError error) { | |||||
Logger.debug('${state}, ${error.rawData}'); | Logger.debug('${state}, ${error.rawData}'); | ||||
}); | }); | ||||
} | } | ||||
// 多图分享 | |||||
_shareMultipleImages() async { | |||||
// List<Asset> assetList = await MultiImagePicker.pickImages(maxImages: 5); | |||||
// var imageList = List<String>(); | |||||
// for (var asset in assetList) { | |||||
// String path = | |||||
// await _writeByteToImageFile(await asset.getByteData(quality: 30)); | |||||
// imageList.add(path); | |||||
// } | |||||
// ShareExtend.shareMultiple(imageList, "image", subject: "share muti image"); | |||||
// 系统分享,只能分享图片或者文字,不能组合分享 | |||||
void _shareBySystem() async { | |||||
if (widget.model.image.length >= 1) { | |||||
_shareMultipleImages(); | |||||
return; | |||||
} else { | |||||
ShareExtend.share(widget.model.content, 'text'); | |||||
} | |||||
} | |||||
// 多图分享,调用系统分享 | |||||
void _shareMultipleImages() async { | |||||
List<String> paths = await ImageDownloadUtil.download(widget.model.image); | |||||
ShareExtend.shareMultiple(paths, "image", subject: ""); | |||||
} | } | ||||
} | } |