@@ -30,10 +30,15 @@ class GoodsDetailsPageBloc extends Bloc<GoodsDetailsPageEvent, GoodsDetailsPageS | |||||
} | } | ||||
Stream<GoodsDetailsPageState> _mapInitEventToState(GoodsDetailsPageInitEvent event) async* { | Stream<GoodsDetailsPageState> _mapInitEventToState(GoodsDetailsPageInitEvent event) async* { | ||||
var result = await repository.fetchInitData(event.model); | var result = await repository.fetchInitModData(event.model); | ||||
if (!EmptyUtil.isEmpty(result)) | if (!EmptyUtil.isEmpty(result)) { | ||||
yield GoodsDetailsPageLoadedState(model: result); | yield GoodsDetailsPageLoadedState(model: result); | ||||
else | // var itemModelData = await repository.fetchModData(event.model); | ||||
// if(!EmptyUtil.isEmpty(itemModelData)){ | |||||
// yield GoodsDetailsPageLoadedState(model: itemModelData); | |||||
// } | |||||
} else { | |||||
yield GoodsDetailsPageErrorState(); | yield GoodsDetailsPageErrorState(); | ||||
} | |||||
} | } | ||||
} | } |
@@ -1,40 +1,108 @@ | |||||
import 'dart:convert'; | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | import 'package:zhiying_comm/zhiying_comm.dart'; | ||||
class GoodsDetailsPageRepository { | class GoodsDetailsPageRepository { | ||||
List<Map<String, dynamic>> _pageData = []; | /// 获取数据 | ||||
Future<List<Map<String, dynamic>>> fetchInitModData(final Map<String, dynamic> model) async{ | |||||
/// 初始化 | String provider = model['provider']; | ||||
Future<List<Map<String, dynamic>>> fetchInitData(Map<String, dynamic> model) async { | String goodId = model['good_id']; | ||||
int id = 13; | |||||
var result = await NetUtil.post('/api/v1/mod', | |||||
method: NetMethod.POST, | |||||
params: Map<String, dynamic>.from({ | |||||
'ids': [id] | |||||
})); | |||||
try { | try { | ||||
if(NetUtil.isSuccess(result) && !EmptyUtil.isEmpty(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA])) { | if (!EmptyUtil.isEmpty(provider) && !EmptyUtil.isEmpty(goodId)) { | ||||
return _loadData(id, result[GlobalConfig.HTTP_RESPONSE_KEY_DATA]); | Logger.log('商品类型 = $provider, 商品ID = $goodId'); | ||||
var result = await NetUtil.post('/api/v1/detail/$provider/$goodId', method: NetMethod.GET); | |||||
if (NetUtil.isSuccess(result) && !EmptyUtil.isEmpty(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA])) { | |||||
List<Map<String, dynamic>> _pageData = []; | |||||
/// 合并数据 | |||||
List<dynamic> modLists = result[GlobalConfig.HTTP_RESPONSE_KEY_DATA]['mod_list']; | |||||
for(int i = 0; i < modLists.length; i++){ | |||||
Map<String, dynamic> item = modLists[i]; | |||||
Map<String, dynamic> data = item['data']; | |||||
Map<String, dynamic> style = jsonDecode(item['style']); | |||||
Map<String, dynamic> baseData = {'provider': provider, 'good_id': goodId}; | |||||
style.addAll(baseData); | |||||
if(!EmptyUtil.isEmpty(data)){ | |||||
style.addAll(data); | |||||
item['data'] = jsonEncode(style); | |||||
_pageData.add(item); | |||||
}else{ | |||||
item['data'] = jsonEncode(style); | |||||
_pageData.add(item); | |||||
} | |||||
} | |||||
return _pageData; | |||||
} | |||||
} | } | ||||
} catch (e) { | }catch(e){ | ||||
Logger.log(e); | Logger.log(e); | ||||
} | } | ||||
return null; | return null; | ||||
} | } | ||||
/// 处理数据 | |||||
List<Map<String, dynamic>> _loadData(int id, dynamic data) { | |||||
String key = id.toString(); | |||||
Map<String, dynamic> json = Map<String, dynamic>.from(data); | |||||
if (json.containsKey(key)) { | |||||
List<dynamic> list = json[key]; | |||||
_pageData = list.map((item) { | |||||
return Map<String, dynamic>.from(item); | |||||
}).toList(); | |||||
return _pageData; | |||||
} | |||||
return null; | |||||
} | |||||
/// 获取缓存数据? | ///【弃用】获取mod数据 把子mod数据塞在data中 | ||||
// Future<List<Map<String, dynamic>>> fetchModData(final Map<String, dynamic> model) async{ | |||||
// String provider = model['provider']; | |||||
// String goodId = model['good_id']; | |||||
// try { | |||||
// if (!EmptyUtil.isEmpty(provider) && !EmptyUtil.isEmpty(goodId)) { | |||||
// Logger.log('商品类型 = $provider, 商品ID = $goodId'); | |||||
// var result = await NetUtil.post('/api/v1/detail/$provider/$goodId', method: NetMethod.GET); | |||||
// if(NetUtil.isSuccess(result) && !EmptyUtil.isEmpty(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA])) { | |||||
// for (int i = 0; i < _pageData.length; i++) { | |||||
// //result[GlobalConfig.HTTP_RESPONSE_KEY_DATA]['mod_list'][i]; | |||||
// Map<String, dynamic> resultData = result[GlobalConfig.HTTP_RESPONSE_KEY_DATA]['mod_list'][i]; | |||||
// Map<String, dynamic> data = jsonDecode(_pageData[i]['data']); | |||||
// if(!EmptyUtil.isEmpty(data)){ | |||||
// data.addAll(resultData); | |||||
// _pageData[i]['data'] = jsonEncode(data); | |||||
// }else{ | |||||
// _pageData[i]['data'] = (null != resultData && resultData.length > 0) ? jsonEncode(resultData) : ''; | |||||
// } | |||||
// } | |||||
// return _pageData; | |||||
// } | |||||
// } | |||||
// }catch(e){ | |||||
// Logger.log(e); | |||||
// } | |||||
// return null; | |||||
// } | |||||
// | |||||
// ///【弃用】初始化 | |||||
// Future<List<Map<String, dynamic>>> fetchInitData(Map<String, dynamic> model) async { | |||||
// int id = 13; | |||||
// var result = await NetUtil.post('/api/v1/mod', method: NetMethod.POST, params: {'ids': [id]}); | |||||
// try { | |||||
// if(NetUtil.isSuccess(result) && !EmptyUtil.isEmpty(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA])) { | |||||
// return _loadData(id, result[GlobalConfig.HTTP_RESPONSE_KEY_DATA]); | |||||
// } | |||||
// } catch (e) { | |||||
// Logger.log(e); | |||||
// } | |||||
// return null; | |||||
// } | |||||
// | |||||
// ///【弃用】处理数据 | |||||
// List<Map<String, dynamic>> _loadData(int id, dynamic data) { | |||||
// String key = id.toString(); | |||||
// Map<String, dynamic> json = Map<String, dynamic>.from(data); | |||||
// if (json.containsKey(key)) { | |||||
// List<dynamic> list = json[key]; | |||||
// _pageData = list.map((item) { | |||||
// return Map<String, dynamic>.from(item); | |||||
// }).toList(); | |||||
// return _pageData; | |||||
// } | |||||
// return null; | |||||
// } | |||||
} | } |
@@ -19,6 +19,11 @@ class GoodsDetailsPage extends StatefulWidget { | |||||
} | } | ||||
class _GoodsDetailsPageState extends State<GoodsDetailsPage> { | class _GoodsDetailsPageState extends State<GoodsDetailsPage> { | ||||
@override | |||||
void initState() { | |||||
print("parent data = ${widget.data}"); | |||||
super.initState(); | |||||
} | |||||
@override | @override | ||||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
return Scaffold( | return Scaffold( | ||||
@@ -136,18 +141,18 @@ class _GoodsDetailsContainerState extends State<GoodsDetailsContainer> { | |||||
), | ), | ||||
), | ), | ||||
/// appBar | /// appBar | ||||
Align( | Align(alignment: Alignment.topCenter, child: _getAppBarWidget()), | ||||
alignment: Alignment.topCenter, | |||||
child: _getAppBarWidget()), | |||||
/// 底部 | /// 底部 | ||||
Align(alignment: Alignment.bottomCenter, child: GoodsDetailsFooterWidget(null)) | Align(alignment: Alignment.bottomCenter, child: GoodsDetailsFooterWidget(!EmptyUtil.isEmpty(datas) ? datas[ datas.length-1 ] : null)) | ||||
], | ], | ||||
); | ); | ||||
} | } | ||||
List<Widget> _createContent(BuildContext context, List<Map<String, dynamic>> datas) { | List<Widget> _createContent(BuildContext context, List<Map<String, dynamic>> datas) { | ||||
List<Widget> list = List(); | List<Widget> list = List(); | ||||
for (int i = 0; i < datas.length; i++) { | /// datas.length - 1 为最后一个在底部 | ||||
for (int i = 0; i < datas.length - 1; i++) { | |||||
WidgetModel item = WidgetModel.fromJson(Map<String, dynamic>.from(datas[i])); | WidgetModel item = WidgetModel.fromJson(Map<String, dynamic>.from(datas[i])); | ||||
print('item.modName ${item.modName}'); | print('item.modName ${item.modName}'); | ||||
@@ -0,0 +1,11 @@ | |||||
import 'package:flutter/material.dart'; | |||||
/// | |||||
/// 搜索页 | |||||
/// | |||||
class SreachPage extends StatelessWidget { | |||||
@override | |||||
Widget build(BuildContext context) { | |||||
return Container(); | |||||
} | |||||
} |
@@ -0,0 +1,11 @@ | |||||
import 'package:flutter/material.dart'; | |||||
/// | |||||
/// 搜索结果页面 | |||||
/// | |||||
class SreachResultPage extends StatelessWidget { | |||||
@override | |||||
Widget build(BuildContext context) { | |||||
return Container(); | |||||
} | |||||
} |
@@ -5,6 +5,8 @@ import 'package:zhiying_base_widget/pages/main_page/main_page.dart'; | |||||
import 'package:zhiying_base_widget/pages/mine_detail_page/mine_detail_page.dart'; | import 'package:zhiying_base_widget/pages/mine_detail_page/mine_detail_page.dart'; | ||||
import 'package:zhiying_base_widget/pages/orders_page/orders_page.dart'; | import 'package:zhiying_base_widget/pages/orders_page/orders_page.dart'; | ||||
import 'package:zhiying_base_widget/pages/setting_page/setting_page.dart'; | import 'package:zhiying_base_widget/pages/setting_page/setting_page.dart'; | ||||
import 'package:zhiying_base_widget/pages/sreach_page/sreach_page.dart'; | |||||
import 'package:zhiying_base_widget/pages/sreach_result_page/sreach_result_page.dart'; | |||||
import 'package:zhiying_base_widget/pages/wallet_page/wallet_page.dart'; | import 'package:zhiying_base_widget/pages/wallet_page/wallet_page.dart'; | ||||
import 'package:zhiying_base_widget/widgets/home/home_auth/home_auth_creater.dart'; | import 'package:zhiying_base_widget/widgets/home/home_auth/home_auth_creater.dart'; | ||||
import 'package:zhiying_base_widget/widgets/goods_details/footer/goods_details_footer_widget.dart'; | import 'package:zhiying_base_widget/widgets/goods_details/footer/goods_details_footer_widget.dart'; | ||||
@@ -33,6 +35,7 @@ import 'package:zhiying_comm/util/defalut_widget_creater.dart'; | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | import 'package:zhiying_comm/zhiying_comm.dart'; | ||||
import 'widgets/goods_details/coupon/counpon_widget.dart'; | import 'widgets/goods_details/coupon/counpon_widget.dart'; | ||||
import 'widgets/goods_details/detail_img/goods_details_img.dart'; | |||||
import 'widgets/goods_details/evaluate/goods_details_evaluate_widget.dart'; | import 'widgets/goods_details/evaluate/goods_details_evaluate_widget.dart'; | ||||
import 'widgets/goods_details/title/goods_details_title_widget.dart'; | import 'widgets/goods_details/title/goods_details_title_widget.dart'; | ||||
import 'widgets/home/home_quick_entry/home_quick_entry.dart'; | import 'widgets/home/home_quick_entry/home_quick_entry.dart'; | ||||
@@ -51,6 +54,8 @@ class BaseWidgetRegister { | |||||
PageFactory.regist('profile', (model) => MainPage(model)); | PageFactory.regist('profile', (model) => MainPage(model)); | ||||
PageFactory.regist('category', (model) => WalletPage()); | PageFactory.regist('category', (model) => WalletPage()); | ||||
PageFactory.regist('goods_details', (model) => GoodsDetailsPage(model)); | PageFactory.regist('goods_details', (model) => GoodsDetailsPage(model)); | ||||
PageFactory.regist('sreach', (model) => SreachPage() ); | |||||
PageFactory.regist('sreach_result', (model) => SreachResultPage() ); | |||||
// PageFactory.regist('login', (model) => LoginPage(model)); | // PageFactory.regist('login', (model) => LoginPage(model)); | ||||
// PageFactory.regist('login_quick', (model) => LoginQuickPage(model)); | // PageFactory.regist('login_quick', (model) => LoginQuickPage(model)); | ||||
// PageFactory.regist('login_account', (model) => LoginAccountPage(model)); | // PageFactory.regist('login_account', (model) => LoginAccountPage(model)); | ||||
@@ -73,7 +78,7 @@ class BaseWidgetRegister { | |||||
// WidgetFactory.regist('index_title', NormalNavCreater()); | // WidgetFactory.regist('index_title', NormalNavCreater()); | ||||
/// 首页搜索栏 | /// 首页搜索栏 | ||||
// WidgetFactory.regist('index_search', HomeSreachCreater()); | // WidgetFactory.regist('index_search', HomeSreachCreater()); | ||||
// WidgetFactory.regist('index_search', DefaultWidgetCreater((model) => HomeSreachWidget(model))); | WidgetFactory.regist('index_search', DefaultWidgetCreater((model) => HomeSreachWidget(model))); | ||||
/// 可滚动banner | /// 可滚动banner | ||||
WidgetFactory.regist('index_carousel', HomeSlideBannerCreater()); | WidgetFactory.regist('index_carousel', HomeSlideBannerCreater()); | ||||
WidgetFactory.regist('index_recommend_list', GoodsListCreater()); | WidgetFactory.regist('index_recommend_list', GoodsListCreater()); | ||||
@@ -89,6 +94,12 @@ class BaseWidgetRegister { | |||||
WidgetFactory.regist('index_banner_two', HomeBannerCreater()); | WidgetFactory.regist('index_banner_two', HomeBannerCreater()); | ||||
WidgetFactory.regist('index_taobao_auth_tip', HomeAuthCreater()); | WidgetFactory.regist('index_taobao_auth_tip', HomeAuthCreater()); | ||||
/// ==================== 搜索页 ==================== /// | |||||
/// ==================== 搜索结果页 ==================== /// | |||||
/// ==================== 商品详情 ==================== /// | /// ==================== 商品详情 ==================== /// | ||||
// 商品详情轮播图 | // 商品详情轮播图 | ||||
WidgetFactory.regist('product_detail_carousel', DefaultWidgetCreater((model) => GoodsDetailsSlideBannerWidget(model))); | WidgetFactory.regist('product_detail_carousel', DefaultWidgetCreater((model) => GoodsDetailsSlideBannerWidget(model))); | ||||
@@ -105,9 +116,10 @@ class BaseWidgetRegister { | |||||
// 商品详情宝贝评价 | // 商品详情宝贝评价 | ||||
WidgetFactory.regist('product_detail_comment', DefaultWidgetCreater((model) => GoodsDetailsEvaluateWidget(model))); | WidgetFactory.regist('product_detail_comment', DefaultWidgetCreater((model) => GoodsDetailsEvaluateWidget(model))); | ||||
// 商品详情图片 | // 商品详情图片 | ||||
// WidgetFactory.regist('product_detail_img_list', MineNavCreater()); | WidgetFactory.regist('product_detail_img_list', DefaultWidgetCreater((model) => GoodsDetailsImgWidget(model))); | ||||
// 商品详情底部推荐列表 | // 商品详情底部推荐列表 | ||||
// WidgetFactory.regist('product_detail_bottom_rec', DefaultWidgetCreater((model) => GoodsDetailsEvaluateWidget(model))); | // WidgetFactory.regist('product_detail_bottom_rec', DefaultWidgetCreater((model) => GoodsListCreater(model))); | ||||
WidgetFactory.regist('product_detail_bottom_rec', GoodsListCreater()); | |||||
// 商品详情底部 | // 商品详情底部 | ||||
WidgetFactory.regist('product_detail_bottom', DefaultWidgetCreater((model) => GoodsDetailsFooterWidget(model))); | WidgetFactory.regist('product_detail_bottom', DefaultWidgetCreater((model) => GoodsDetailsFooterWidget(model))); | ||||
@@ -1,9 +1,9 @@ | |||||
import 'dart:async'; | import 'dart:async'; | ||||
import 'dart:math'; | |||||
import 'package:bloc/bloc.dart'; | import 'package:bloc/bloc.dart'; | ||||
import 'package:zhiying_base_widget/widgets/goods_details/coupon/bloc/counpon_repository.dart'; | import 'package:zhiying_base_widget/widgets/goods_details/coupon/bloc/counpon_repository.dart'; | ||||
import 'bloc.dart'; | import 'bloc.dart'; | ||||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||||
class CounponBloc extends Bloc<CounponEvent, CounponState> { | class CounponBloc extends Bloc<CounponEvent, CounponState> { | ||||
@override | @override | ||||
@@ -25,6 +25,10 @@ class CounponBloc extends Bloc<CounponEvent, CounponState> { | |||||
/// 获取数据 | /// 获取数据 | ||||
Stream<CounponState> _mapInitEnvetTostate(CounponInitEvent event) async* { | Stream<CounponState> _mapInitEnvetTostate(CounponInitEvent event) async* { | ||||
var result = await repository.fetchParentData(event); | var result = await repository.fetchParentData(event); | ||||
yield CounponLoadedState(model: result); | if(!EmptyUtil.isEmpty(result)) { | ||||
yield CounponLoadedState(model: result); | |||||
}else { | |||||
yield CounponErrorState(); | |||||
} | |||||
} | } | ||||
} | } |
@@ -1,10 +1,18 @@ | |||||
import 'dart:convert'; | |||||
import 'package:zhiying_base_widget/widgets/goods_details/coupon/bloc/bloc.dart'; | import 'package:zhiying_base_widget/widgets/goods_details/coupon/bloc/bloc.dart'; | ||||
import 'package:zhiying_base_widget/widgets/goods_details/coupon/model/counpon_model.dart'; | import 'package:zhiying_base_widget/widgets/goods_details/coupon/model/counpon_model.dart'; | ||||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||||
class CounponRepository { | class CounponRepository { | ||||
/// 获取父页面传进来的数据 | /// 获取父页面传进来的数据 | ||||
Future<CounponModel> fetchParentData(CounponInitEvent event) async{ | Future<CounponModel> fetchParentData(CounponInitEvent event) async{ | ||||
try{ | |||||
return CounponModel.fromJson(json.decode(event.model['data'])); | |||||
}catch(e){ | |||||
Logger.log('CounponRepository e = $e'); | |||||
} | |||||
return null; | return null; | ||||
} | } | ||||
@@ -5,11 +5,13 @@ abstract class CounponState extends Equatable { | |||||
const CounponState(); | const CounponState(); | ||||
} | } | ||||
/// 初始化 | |||||
class CounponInitial extends CounponState { | class CounponInitial extends CounponState { | ||||
@override | @override | ||||
List<Object> get props => []; | List<Object> get props => []; | ||||
} | } | ||||
/// 数据加载成功 | |||||
class CounponLoadedState extends CounponState { | class CounponLoadedState extends CounponState { | ||||
CounponModel model; | CounponModel model; | ||||
@@ -19,6 +21,7 @@ class CounponLoadedState extends CounponState { | |||||
List<Object> get props => [this.model]; | List<Object> get props => [this.model]; | ||||
} | } | ||||
/// 数据加载失败 | |||||
class CounponErrorState extends CounponState { | class CounponErrorState extends CounponState { | ||||
@override | @override | ||||
List<Object> get props => []; | List<Object> get props => []; | ||||
@@ -5,7 +5,7 @@ class CounponSkeleton extends StatelessWidget { | |||||
@override | @override | ||||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
return Container( | return Container( | ||||
margin: const EdgeInsets.only(left: 12.5, right: 12.5), | margin: const EdgeInsets.only(left: 12.5, right: 12.5, top: 12), | ||||
width: double.infinity, | width: double.infinity, | ||||
height: 70, | height: 70, | ||||
child: _shimmerWidget(width: double.infinity, height: 65, radius: 7.5), | child: _shimmerWidget(width: double.infinity, height: 65, radius: 7.5), | ||||
@@ -5,6 +5,7 @@ import 'package:zhiying_base_widget/widgets/goods_details/coupon/counpon_sk.dart | |||||
import 'package:zhiying_base_widget/widgets/goods_details/coupon/model/counpon_model.dart'; | import 'package:zhiying_base_widget/widgets/goods_details/coupon/model/counpon_model.dart'; | ||||
import 'package:zhiying_comm/zhiying_comm.dart'; | import 'package:zhiying_comm/zhiying_comm.dart'; | ||||
import 'package:flutter_bloc/flutter_bloc.dart'; | import 'package:flutter_bloc/flutter_bloc.dart'; | ||||
import 'package:cached_network_image/cached_network_image.dart'; | |||||
/// | /// | ||||
/// 优惠券widget | /// 优惠券widget | ||||
@@ -16,26 +17,26 @@ class CounponWidget extends StatelessWidget { | |||||
@override | @override | ||||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
return Container(); | // return Container(); | ||||
// return BlocProvider<CounponBloc>( | return BlocProvider<CounponBloc>( | ||||
// create: (_) => CounponBloc(repository: CounponRepository())..add(CounponInitEvent(model: model)), | create: (_) => CounponBloc(repository: CounponRepository())..add(CounponInitEvent(model: model)), | ||||
// child: CounponContainer(), | child: CounponWidgetContainer(), | ||||
// ); | ); | ||||
} | } | ||||
} | } | ||||
class CounponContainer extends StatefulWidget { | class CounponWidgetContainer extends StatefulWidget { | ||||
@override | @override | ||||
_CounponContainerState createState() => _CounponContainerState(); | _CounponWidgetContainerState createState() => _CounponWidgetContainerState(); | ||||
} | } | ||||
class _CounponContainerState extends State<CounponContainer> { | class _CounponWidgetContainerState extends State<CounponWidgetContainer> { | ||||
/// 点击领取 | /// 点击领取 | ||||
void _onJump(CounponModel model) {} | void _onJump(CounponModel model) {} | ||||
@override | @override | ||||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
BlocConsumer<CounponBloc, CounponState>( | return BlocConsumer<CounponBloc, CounponState>( | ||||
listener: (context, state) {}, | listener: (context, state) {}, | ||||
buildWhen: (prev, current) { | buildWhen: (prev, current) { | ||||
if (current is CounponErrorState) { | if (current is CounponErrorState) { | ||||
@@ -45,10 +46,9 @@ class _CounponContainerState extends State<CounponContainer> { | |||||
}, | }, | ||||
builder: (context, state) { | builder: (context, state) { | ||||
if (state is CounponLoadedState) { | if (state is CounponLoadedState) { | ||||
// return _getMainWdiget(state.model); | return _getMainWdiget(state.model); | ||||
} | } | ||||
// return CounponSkeleton(); | return CounponSkeleton(); | ||||
return Container(); | |||||
}, | }, | ||||
); | ); | ||||
} | } | ||||
@@ -60,17 +60,30 @@ class _CounponContainerState extends State<CounponContainer> { | |||||
behavior: HitTestBehavior.opaque, | behavior: HitTestBehavior.opaque, | ||||
child: Container( | child: Container( | ||||
width: double.infinity, | width: double.infinity, | ||||
margin: const EdgeInsets.only(left: 12.5, right: 12.5), | color: Colors.white, | ||||
padding: const EdgeInsets.only(left: 18.5), | padding: const EdgeInsets.only(left: 12.5, right: 12.5, top: 12), | ||||
alignment: Alignment.centerLeft, | child: Container( | ||||
child: Row( | // color: Colors.red, | ||||
children: <Widget>[ | width: double.infinity, | ||||
/// 价格 | padding: const EdgeInsets.only(left: 18.5, top: 12, bottom: 14), | ||||
_getPriceWidget(model), | decoration: BoxDecoration( | ||||
const SizedBox(width: 7.5), | image: DecorationImage( | ||||
/// 有效期 | image: CachedNetworkImageProvider( | ||||
_getTimeWidget(model) | model?.bg_img ??'', | ||||
], | ), | ||||
fit: BoxFit.fill | |||||
) | |||||
), | |||||
alignment: Alignment.centerLeft, | |||||
child: Row( | |||||
children: <Widget>[ | |||||
/// 价格 | |||||
_getPriceWidget(model), | |||||
const SizedBox(width: 7.5), | |||||
/// 有效期 | |||||
_getTimeWidget(model) | |||||
], | |||||
), | |||||
), | ), | ||||
), | ), | ||||
); | ); | ||||
@@ -79,12 +92,14 @@ class _CounponContainerState extends State<CounponContainer> { | |||||
/// 价格 | /// 价格 | ||||
Widget _getPriceWidget(CounponModel model) { | Widget _getPriceWidget(CounponModel model) { | ||||
return Row( | return Row( | ||||
crossAxisAlignment: CrossAxisAlignment.center, | |||||
mainAxisAlignment: MainAxisAlignment.center, | |||||
children: <Widget>[ | children: <Widget>[ | ||||
/// 价格类型 | /// 价格类型 | ||||
Text('¥', style: TextStyle(fontSize: 15, color: HexColor.fromHex('#FFFFFF'))), | Text(model?.price_type ?? '¥ ', style: TextStyle(fontSize: 15, color: HexColor.fromHex(model?.price_type_color ?? '#FFFFFF'))), | ||||
/// 价格 | /// 价格 | ||||
Text('100', style: TextStyle(fontSize: 30, color: HexColor.fromHex('#FFFFFF'))), | Text(model?.coupon_price ??'100', style: TextStyle(fontSize: 30, color: HexColor.fromHex(model?.coupon_price_color ?? '#FFFFFF'), fontFamily: 'Din', package: 'zhiying_base_widget')), | ||||
], | ], | ||||
); | ); | ||||
} | } | ||||
@@ -92,12 +107,13 @@ class _CounponContainerState extends State<CounponContainer> { | |||||
/// 名称与有效期 | /// 名称与有效期 | ||||
Widget _getTimeWidget(CounponModel model) { | Widget _getTimeWidget(CounponModel model) { | ||||
return Column( | return Column( | ||||
crossAxisAlignment: CrossAxisAlignment.start, | |||||
children: <Widget>[ | children: <Widget>[ | ||||
/// 标题 | /// 标题 | ||||
Text('优惠券', style: TextStyle(fontSize: 17, color: HexColor.fromHex('#FFFFFF'))), | Text(model?.coupon_title ?? '优惠券', style: TextStyle(fontSize: 17, color: HexColor.fromHex( model?.coupon_title_color ?? '#FFFFFF'))), | ||||
/// 到期时间 | /// 到期时间 | ||||
Text('有效期至2020-10-01', style: TextStyle(fontSize: 10, color: HexColor.fromHex('#FFFFFF'))) | Text(model?.coupon_endtime ?? '有效期至2020-10-01', style: TextStyle(fontSize: 10, color: HexColor.fromHex(model?.coupon_time_color ?? '#FFFFFF'))) | ||||
], | ], | ||||
); | ); | ||||
} | } | ||||
@@ -1,2 +1,54 @@ | |||||
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; | |||||
class CounponModel{} | CounponModel( | ||||
{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}); | |||||
factory CounponModel.fromJson(Map<String, dynamic> json) { | |||||
return CounponModel( | |||||
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'], | |||||
); | |||||
} | |||||
Map<String, dynamic> toJson() { | |||||
final Map<String, dynamic> data = new Map<String, dynamic>(); | |||||
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; | |||||
return data; | |||||
} | |||||
} |
@@ -0,0 +1,54 @@ | |||||
import 'dart:async'; | |||||
import 'package:bloc/bloc.dart'; | |||||
import 'package:equatable/equatable.dart'; | |||||
import 'package:flutter/cupertino.dart'; | |||||
import 'package:zhiying_base_widget/widgets/goods_details/detail_img/bloc/goods_details_img_repository.dart'; | |||||
import 'package:zhiying_comm/util/empty_util.dart'; | |||||
import 'package:zhiying_base_widget/widgets/goods_details/detail_img/model/goods_details_img_model.dart'; | |||||
import 'package:zhiying_comm/util/global_config.dart'; | |||||
part 'goods_details_img_event.dart'; | |||||
part 'goods_details_img_state.dart'; | |||||
class GoodsDetailsImgBloc extends Bloc<GoodsDetailsImgEvent, GoodsDetailsImgState> { | |||||
GoodsDetailsImgBloc({this.repository}); | |||||
GoodsDetailsImgRepository repository; | |||||
@override | |||||
GoodsDetailsImgState get initialState => GoodsDetailsImgInitial(); | |||||
@override | |||||
Stream<GoodsDetailsImgState> mapEventToState( | |||||
GoodsDetailsImgEvent event, | |||||
) async* { | |||||
/// 初始化事件 | |||||
if (event is GoodsDetailsImgInitEvent) { | |||||
yield* _mapInitEventToState(event); | |||||
} | |||||
} | |||||
/// 初始化方法 | |||||
Stream<GoodsDetailsImgState> _mapInitEventToState(GoodsDetailsImgInitEvent event) async* { | |||||
var parentData = await repository.fetchParentData(event.model); | |||||
if (!EmptyUtil.isEmpty(parentData)) { | |||||
yield GoodsDetailsImgLoadedState(model: parentData); | |||||
/// 如果等于淘宝类型,就前端去抓去商品详情图片 | |||||
if (parentData.provider == GlobalConfig.PROVIDER_TB || parentData.provider == GlobalConfig.PROVIDER_TM) { | |||||
/// 进行网络访问 | |||||
var netData = await repository.fetchNetData(event.model); | |||||
if (!EmptyUtil.isEmpty(netData)) { | |||||
// yield Good; | |||||
yield GoodsDetailsImgLoadedState(model: netData); | |||||
} else { | |||||
yield GoodsDetailsImgErrorState(); | |||||
} | |||||
} | |||||
} else { | |||||
yield GoodsDetailsImgErrorState(); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,18 @@ | |||||
part of 'goods_details_img_bloc.dart'; | |||||
abstract class GoodsDetailsImgEvent extends Equatable { | |||||
const GoodsDetailsImgEvent(); | |||||
@override | |||||
List<Object> get props => []; | |||||
} | |||||
/// 初始化数据 | |||||
class GoodsDetailsImgInitEvent extends GoodsDetailsImgEvent { | |||||
final Map<String, dynamic> model; | |||||
const GoodsDetailsImgInitEvent({@required this.model}); | |||||
@override | |||||
List<Object> get props => [this.model]; | |||||
} |
@@ -0,0 +1,35 @@ | |||||
import 'dart:convert'; | |||||
import 'package:zhiying_base_widget/widgets/goods_details/detail_img/model/goods_details_img_model.dart'; | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||||
import 'package:zhiying_comm/util/taobao/taobao_loader.dart'; | |||||
class GoodsDetailsImgRepository { | |||||
GoodsDetailsImgModel _model; | |||||
/// 获取父数据 | |||||
Future<GoodsDetailsImgModel> fetchParentData(final Map<String, dynamic> model) async { | |||||
try { | |||||
_model = GoodsDetailsImgModel.fromJson(jsonDecode(model['data'])); | |||||
if(!EmptyUtil.isEmpty(_model)) { | |||||
return _model; | |||||
} | |||||
} catch (e) { | |||||
Logger.log('GoodsDetailsImgRepository e = $e'); | |||||
} | |||||
return null; | |||||
} | |||||
/// 获取网络的数据 | |||||
Future<GoodsDetailsImgModel> fetchNetData(final Map<String, dynamic> model) async { | |||||
try { | |||||
if(!EmptyUtil.isEmpty(_model)) { | |||||
List<String> imgs = await TaobaoLoader.loadImages(_model.good_id); | |||||
_model.image_detail_list = imgs; | |||||
return _model; | |||||
} | |||||
}catch(e){ | |||||
} | |||||
return null; | |||||
} | |||||
} |
@@ -0,0 +1,30 @@ | |||||
part of 'goods_details_img_bloc.dart'; | |||||
abstract class GoodsDetailsImgState extends Equatable { | |||||
const GoodsDetailsImgState(); | |||||
@override | |||||
List<Object> get props => []; | |||||
} | |||||
class GoodsDetailsImgInitial extends GoodsDetailsImgState { | |||||
@override | |||||
List<Object> get props => []; | |||||
} | |||||
/// 数据加载成功 | |||||
class GoodsDetailsImgLoadedState extends GoodsDetailsImgState { | |||||
GoodsDetailsImgModel model; | |||||
GoodsDetailsImgLoadedState({this.model}); | |||||
GoodsDetailsImgLoadedState copyWith({@required GoodsDetailsImgModel newData}) { | |||||
return GoodsDetailsImgLoadedState(model: newData ?? model); | |||||
} | |||||
@override | |||||
List<Object> get props => [this.model]; | |||||
} | |||||
/// 数据加载失败 | |||||
class GoodsDetailsImgErrorState extends GoodsDetailsImgState {} |
@@ -0,0 +1,110 @@ | |||||
import 'package:flutter/material.dart'; | |||||
import 'package:flutter_bloc/flutter_bloc.dart'; | |||||
import 'package:zhiying_base_widget/widgets/goods_details/detail_img/bloc/goods_details_img_bloc.dart'; | |||||
import 'package:zhiying_base_widget/widgets/goods_details/detail_img/goods_details_img_sk.dart'; | |||||
import 'package:zhiying_base_widget/widgets/goods_details/detail_img/model/goods_details_img_model.dart'; | |||||
import 'package:zhiying_base_widget/widgets/home/home_quick_entry/cached_network_image_util.dart'; | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||||
import 'package:cached_network_image/cached_network_image.dart'; | |||||
import 'package:zhiying_base_widget/widgets/goods_details/detail_img/bloc/goods_details_img_repository.dart'; | |||||
/// | |||||
/// 商品详情图片 | |||||
/// | |||||
class GoodsDetailsImgWidget extends StatelessWidget { | |||||
final Map<String, dynamic> model; | |||||
const GoodsDetailsImgWidget(this.model); | |||||
@override | |||||
Widget build(BuildContext context) { | |||||
return BlocProvider<GoodsDetailsImgBloc>( | |||||
create: (_) => GoodsDetailsImgBloc(repository: GoodsDetailsImgRepository())..add(GoodsDetailsImgInitEvent(model: model)), | |||||
child: GoodsDetailsImgWidgetContainer(), | |||||
); | |||||
} | |||||
} | |||||
class GoodsDetailsImgWidgetContainer extends StatefulWidget { | |||||
@override | |||||
_GoodsDetailsImgWidgetContainerState createState() => _GoodsDetailsImgWidgetContainerState(); | |||||
} | |||||
class _GoodsDetailsImgWidgetContainerState extends State<GoodsDetailsImgWidgetContainer> { | |||||
@override | |||||
Widget build(BuildContext context) { | |||||
return BlocConsumer<GoodsDetailsImgBloc, GoodsDetailsImgState>( | |||||
listener: (BuildContext context, GoodsDetailsImgState state) { | |||||
if (state is GoodsDetailsImgErrorState) { | |||||
print('数据加载出错'); | |||||
} | |||||
}, | |||||
buildWhen: (previous, current) { | |||||
/// 数据加载出错不进行build | |||||
if (current is GoodsDetailsImgErrorState) { | |||||
return false; | |||||
} | |||||
return true; | |||||
}, | |||||
builder: (context, state) { | |||||
print('currente state = $state'); | |||||
if (state is GoodsDetailsImgLoadedState) { | |||||
if (!EmptyUtil.isEmpty(state.model)) { | |||||
return _getMainWidget(state.model); | |||||
} | |||||
} | |||||
// 骨架屏 | |||||
return GoodsDetailsImgSkeleton(); | |||||
}, | |||||
); | |||||
} | |||||
/// | |||||
Widget _getMainWidget(GoodsDetailsImgModel model) { | |||||
return Column( | |||||
children: <Widget>[ | |||||
/// 标题 | |||||
_getTitleWidget(model), | |||||
/// 图片列表 | |||||
_getImgListWidget(model), | |||||
], | |||||
); | |||||
} | |||||
/// 图片列表 | |||||
Widget _getImgListWidget(GoodsDetailsImgModel model){ | |||||
return Column( | |||||
children: model.image_detail_list.map((item){ | |||||
return CachedNetworkImage( | |||||
imageUrl: item ?? '', | |||||
fit: BoxFit.fitWidth, | |||||
); | |||||
}).toList(), | |||||
); | |||||
} | |||||
/// 标题Widget | |||||
Widget _getTitleWidget(GoodsDetailsImgModel model) { | |||||
return Container( | |||||
color: Colors.white, | |||||
margin: const EdgeInsets.only(top: 6), | |||||
width: double.infinity, | |||||
padding: const EdgeInsets.only(top: 15, bottom: 15, left: 12.5, right: 12.5), | |||||
child: _getLeftWidget(model), | |||||
); | |||||
} | |||||
/// 左边图标加文字 | |||||
Widget _getLeftWidget(GoodsDetailsImgModel model) { | |||||
return Row( | |||||
children: <Widget>[ | |||||
CachedNetworkImage( | |||||
imageUrl: model?.icon ?? '', | |||||
width: 12, | |||||
), | |||||
const SizedBox(width: 2.5), | |||||
Text(model?.title ?? '商品详情', style: TextStyle(color: HexColor.fromHex(model?.title_color ?? '#333333'), fontSize: 12)), | |||||
], | |||||
); | |||||
} | |||||
} |
@@ -0,0 +1,11 @@ | |||||
import 'package:flutter/material.dart'; | |||||
/// | |||||
/// 商品详情骨架图 | |||||
/// | |||||
class GoodsDetailsImgSkeleton extends StatelessWidget { | |||||
@override | |||||
Widget build(BuildContext context) { | |||||
return Container(); | |||||
} | |||||
} |
@@ -0,0 +1,41 @@ | |||||
class GoodsDetailsImgModel { | |||||
List<String> image_detail_list; | |||||
String title; | |||||
String title_color; | |||||
String provider; | |||||
String good_id; | |||||
String icon; | |||||
GoodsDetailsImgModel({ | |||||
this.image_detail_list, | |||||
this.title, | |||||
this.title_color, | |||||
this.provider, | |||||
this.good_id, | |||||
this.icon | |||||
}); | |||||
factory GoodsDetailsImgModel.fromJson(Map<String, dynamic> json) { | |||||
return GoodsDetailsImgModel( | |||||
image_detail_list: json['image_detail_list'] != null ? new List<String>.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'] | |||||
); | |||||
} | |||||
Map<String, dynamic> toJson() { | |||||
final Map<String, dynamic> data = new Map<String, dynamic>(); | |||||
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['icon'] = this.icon; | |||||
return data; | |||||
} | |||||
} |
@@ -1,4 +1,8 @@ | |||||
import 'dart:convert'; | |||||
import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
import 'package:zhiying_base_widget/widgets/goods_details/evaluate/model/goods_details_evaluate_model.dart'; | |||||
import 'package:cached_network_image/cached_network_image.dart'; | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | import 'package:zhiying_comm/zhiying_comm.dart'; | ||||
/// | /// | ||||
@@ -6,8 +10,15 @@ import 'package:zhiying_comm/zhiying_comm.dart'; | |||||
/// | /// | ||||
class GoodsDetailsEvaluateWidget extends StatelessWidget { | class GoodsDetailsEvaluateWidget extends StatelessWidget { | ||||
final Map<String, dynamic> model; | final Map<String, dynamic> model; | ||||
GoodsDetailsEvaluateModel _modell; | |||||
const GoodsDetailsEvaluateWidget(this.model); | GoodsDetailsEvaluateWidget(this.model, {Key key}) : super(key: key) { | ||||
try { | |||||
_modell = GoodsDetailsEvaluateModel.fromJson(jsonDecode(model['data'])); | |||||
} catch (e) { | |||||
Logger.log('GoodsDetailsEvaluateWidget e = $e}'); | |||||
} | |||||
} | |||||
/// 点击查看更多 | /// 点击查看更多 | ||||
void _openLookMore() {} | void _openLookMore() {} | ||||
@@ -18,21 +29,39 @@ class GoodsDetailsEvaluateWidget extends StatelessWidget { | |||||
onTap: () => _openLookMore(), | onTap: () => _openLookMore(), | ||||
behavior: HitTestBehavior.opaque, | behavior: HitTestBehavior.opaque, | ||||
child: Container( | child: Container( | ||||
color: Colors.white, | |||||
margin: const EdgeInsets.only(top: 6), | |||||
width: double.infinity, | width: double.infinity, | ||||
padding: const EdgeInsets.only(top: 15, bottom: 15, left: 12.5, right: 12.5), | padding: const EdgeInsets.only(top: 15, bottom: 15, left: 12.5, right: 12.5), | ||||
child: getMainWidget(), | child: getMainWidget(_modell), | ||||
), | ), | ||||
); | ); | ||||
} | } | ||||
/// 评价以及查看更多 | /// 评价以及查看更多 | ||||
Widget getMainWidget() { | Widget getMainWidget(GoodsDetailsEvaluateModel model) { | ||||
return Row( | return Row( | ||||
mainAxisAlignment: MainAxisAlignment.spaceBetween, | mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||
children: <Widget>[ | children: <Widget>[ | ||||
Text('宝贝评价', style: TextStyle(color: HexColor.fromHex('#333333'), fontSize: 12)), | getLeftWidget(model), | ||||
Text('查看更多 >', style: TextStyle(color: HexColor.fromHex('#999999'), fontSize: 11)), | Text(model?.more ?? '查看更多 >', style: TextStyle(color: HexColor.fromHex(model?.more_color ?? '#999999'), fontSize: 11)), | ||||
], | |||||
); | |||||
} | |||||
/// 左边图标加文字 | |||||
Widget getLeftWidget(GoodsDetailsEvaluateModel model){ | |||||
return Row( | |||||
children: <Widget>[ | |||||
CachedNetworkImage( | |||||
imageUrl: model?.icon ?? '', | |||||
width: 12, | |||||
), | |||||
const SizedBox(width: 2.5), | |||||
Text(model?.title ?? '宝贝评价', style: TextStyle(color: HexColor.fromHex(model?.title_color ?? '#333333'), fontSize: 12)), | |||||
], | ], | ||||
); | ); | ||||
} | } | ||||
} | } |
@@ -0,0 +1,39 @@ | |||||
class GoodsDetailsEvaluateModel { | |||||
String comment_url; | |||||
String more; | |||||
String more_color; | |||||
String title; | |||||
String title_color; | |||||
String icon; | |||||
GoodsDetailsEvaluateModel({ | |||||
this.comment_url, | |||||
this.more, | |||||
this.more_color, | |||||
this.title, | |||||
this.title_color, | |||||
this.icon, | |||||
}); | |||||
factory GoodsDetailsEvaluateModel.fromJson(Map<String, dynamic> 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'], | |||||
); | |||||
} | |||||
Map<String, dynamic> toJson() { | |||||
final Map<String, dynamic> data = new Map<String, dynamic>(); | |||||
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; | |||||
return data; | |||||
} | |||||
} |
@@ -0,0 +1,51 @@ | |||||
import 'dart:async'; | |||||
import 'package:bloc/bloc.dart'; | |||||
import 'package:equatable/equatable.dart'; | |||||
import 'package:flutter/cupertino.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/model/goods_details_footer_model.dart'; | |||||
import 'package:zhiying_comm/util/empty_util.dart'; | |||||
part 'goods_details_footer_event.dart'; | |||||
part 'goods_details_footer_state.dart'; | |||||
class GoodsDetailsFooterBloc extends Bloc<GoodsDetailsFooterEvent, GoodsDetailsFooterState> { | |||||
GoodsDetailsFooterBloc({this.repository}); | |||||
GoodsDetailsFooterRepository repository; | |||||
@override | |||||
GoodsDetailsFooterState get initialState => GoodsDetailsFooterInitial(); | |||||
@override | |||||
Stream<GoodsDetailsFooterState> mapEventToState( | |||||
GoodsDetailsFooterEvent event, | |||||
) async* { | |||||
/// 初始化 | |||||
if (event is GoodsDetailsFooterInitEvent) { | |||||
yield* _mapInitEventToState(event); | |||||
} | |||||
} | |||||
/// 初始化 | |||||
Stream<GoodsDetailsFooterState> _mapInitEventToState(GoodsDetailsFooterInitEvent event) async* { | |||||
var result = await repository.fetchParentData(event.model); | |||||
if (!EmptyUtil.isEmpty(result)) { | |||||
print('result = ${result.toString()}'); | |||||
yield GoodsDetailsFooterLoadedState(model: result); | |||||
} else { | |||||
yield GoodsDetailsFooterErrorState(); | |||||
} | |||||
} | |||||
/// 点击收藏 | |||||
Stream<GoodsDetailsFooterState> _mapCollectEventToState(GoodsDetailsFooterCollectEvent event) async* { | |||||
var result = await repository.fetchCollect(); | |||||
if (!EmptyUtil.isEmpty(result)) | |||||
yield GoodsDetailsFooterLoadedState(model: result); | |||||
else | |||||
yield GoodsDetailsFooterErrorState(); | |||||
} | |||||
} |
@@ -0,0 +1,23 @@ | |||||
part of 'goods_details_footer_bloc.dart'; | |||||
abstract class GoodsDetailsFooterEvent extends Equatable { | |||||
const GoodsDetailsFooterEvent(); | |||||
@override | |||||
List<Object> get props => []; | |||||
} | |||||
/// 初始化事件 | |||||
class GoodsDetailsFooterInitEvent extends GoodsDetailsFooterEvent { | |||||
final Map<String, dynamic> model; | |||||
const GoodsDetailsFooterInitEvent({@required this.model}); | |||||
@override | |||||
List<Object> get props => [this.model]; | |||||
} | |||||
/// 点击收藏 | |||||
class GoodsDetailsFooterCollectEvent extends GoodsDetailsFooterEvent { | |||||
} |
@@ -0,0 +1,25 @@ | |||||
import 'dart:convert'; | |||||
import 'package:zhiying_base_widget/widgets/goods_details/footer/model/goods_details_footer_model.dart'; | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||||
class GoodsDetailsFooterRepository { | |||||
/// 初始化数据 | |||||
Future<GoodsDetailsFooterModel> fetchParentData(final Map<String, dynamic> model) async { | |||||
try { | |||||
return GoodsDetailsFooterModel.fromJson(jsonDecode(model['data'])); | |||||
} catch (e) { | |||||
Logger.log('GoodsDetailsFooterRepository e = $e'); | |||||
} | |||||
return null; | |||||
} | |||||
/// 点击收藏 | |||||
Future<GoodsDetailsFooterModel> fetchCollect() async{ | |||||
return null; | |||||
} | |||||
/// 跳转购买 | |||||
/// 分享 | |||||
} |
@@ -0,0 +1,29 @@ | |||||
part of 'goods_details_footer_bloc.dart'; | |||||
abstract class GoodsDetailsFooterState extends Equatable { | |||||
const GoodsDetailsFooterState(); | |||||
@override | |||||
List<Object> get props => []; | |||||
} | |||||
class GoodsDetailsFooterInitial extends GoodsDetailsFooterState { | |||||
@override | |||||
List<Object> get props => []; | |||||
} | |||||
/// 数据加载完毕 | |||||
class GoodsDetailsFooterLoadedState extends GoodsDetailsFooterState { | |||||
GoodsDetailsFooterModel model; | |||||
GoodsDetailsFooterLoadedState({@required this.model}); | |||||
@override | |||||
List<Object> get props => [this.model]; | |||||
} | |||||
/// 数据加载出错 | |||||
class GoodsDetailsFooterErrorState extends GoodsDetailsFooterState { | |||||
@override | |||||
List<Object> get props => []; | |||||
} |
@@ -6,6 +6,7 @@ class GoodsDetailsFooterSkeleton extends StatelessWidget { | |||||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
return Container( | return Container( | ||||
width: double.infinity, | width: double.infinity, | ||||
color: Colors.white, | |||||
padding: const EdgeInsets.only(left: 21, right: 12.5, top: 12.5, bottom: 12.5), | padding: const EdgeInsets.only(left: 21, right: 12.5, top: 12.5, bottom: 12.5), | ||||
child: Row( | child: Row( | ||||
mainAxisAlignment: MainAxisAlignment.spaceBetween, | mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||
@@ -18,7 +19,7 @@ class GoodsDetailsFooterSkeleton extends StatelessWidget { | |||||
], | ], | ||||
), | ), | ||||
_shimmerWidget( height: 44, width: 230, radius: 22), | _shimmerWidget( height: 44, width: 180, radius: 22), | ||||
], | ], | ||||
), | ), | ||||
); | ); | ||||
@@ -1,18 +1,30 @@ | |||||
import 'package:flutter/material.dart'; | import 'package:flutter/material.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/goods_details_footer_sk.dart'; | |||||
import 'package:zhiying_base_widget/widgets/goods_details/footer/model/goods_details_footer_model.dart'; | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | import 'package:zhiying_comm/zhiying_comm.dart'; | ||||
import 'package:flutter_bloc/flutter_bloc.dart'; | |||||
import 'package:cached_network_image/cached_network_image.dart'; | |||||
/// | /// | ||||
/// 商品详情底部Widget | /// 商品详情底部Widget | ||||
/// | /// | ||||
class GoodsDetailsFooterWidget extends StatelessWidget { | class GoodsDetailsFooterWidget extends StatelessWidget { | ||||
final Map<String, dynamic> model; | final Map<String, dynamic> model; | ||||
const GoodsDetailsFooterWidget(this.model); | const GoodsDetailsFooterWidget(this.model); | ||||
@override | @override | ||||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
return GooddsDetailsFooterContainer(); | return Visibility( | ||||
visible: !EmptyUtil.isEmpty(model), | |||||
replacement: GoodsDetailsFooterSkeleton(), | |||||
child: BlocProvider<GoodsDetailsFooterBloc>( | |||||
create: (_) => GoodsDetailsFooterBloc(repository: GoodsDetailsFooterRepository())..add(GoodsDetailsFooterInitEvent(model: model)), | |||||
child: GooddsDetailsFooterContainer(), | |||||
), | |||||
); | |||||
} | } | ||||
} | } | ||||
@@ -36,38 +48,57 @@ class _GooddsDetailsFooterContainerState extends State<GooddsDetailsFooterContai | |||||
@override | @override | ||||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
return BlocConsumer<GoodsDetailsFooterBloc, GoodsDetailsFooterState>( | |||||
listener: (context, state) {}, | |||||
buildWhen: (prev, current) { | |||||
if (current is GoodsDetailsFooterErrorState) { | |||||
return false; | |||||
} | |||||
return true; | |||||
}, | |||||
builder: (context, state) { | |||||
print('GoodsDetailsFooterWidget state = $state'); | |||||
if (state is GoodsDetailsFooterLoadedState) { | |||||
return _getMainWidget(state.model); | |||||
} | |||||
return GoodsDetailsFooterSkeleton(); | |||||
}, | |||||
); | |||||
} | |||||
Widget _getMainWidget(GoodsDetailsFooterModel model) { | |||||
return Container( | return Container( | ||||
height: 70, | height: 70, | ||||
width: double.infinity, | width: double.infinity, | ||||
padding: const EdgeInsets.only(bottom: 10, top: 12.5, left: 21, right: 12.5), | padding: const EdgeInsets.only(bottom: 10, top: 12.5, left: 21, right: 12.5), | ||||
decoration: BoxDecoration( | decoration: BoxDecoration( | ||||
boxShadow:[ | // boxShadow: [ | ||||
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), blurRadius: 5.0, spreadRadius: 2.0), | ||||
BoxShadow(color: Colors.grey[300], offset: Offset(0.0, 0.0)), | // BoxShadow(color: Colors.grey[300], offset: Offset(0.0, 0.0)), | ||||
], | // ], | ||||
color: Colors.white | color: Colors.white, | ||||
), | ), | ||||
child: _getMainWidet(), | child: _getMainWidet(model), | ||||
); | ); | ||||
} | } | ||||
/// 主Widget | /// 主Widget | ||||
Widget _getMainWidet() { | Widget _getMainWidet(GoodsDetailsFooterModel model) { | ||||
return Row( | return Row( | ||||
mainAxisAlignment: MainAxisAlignment.spaceBetween, | mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||
crossAxisAlignment: CrossAxisAlignment.center, | crossAxisAlignment: CrossAxisAlignment.center, | ||||
children: <Widget>[ | children: <Widget>[ | ||||
/// 首页与收藏 | /// 首页与收藏 | ||||
_getLeftWidget(), | _getLeftWidget(model), | ||||
/// 分享赚与自购省 | /// 分享赚与自购省 | ||||
_getRightWidget(), | _getRightWidget(model), | ||||
], | ], | ||||
); | ); | ||||
} | } | ||||
/// 首页 和 收藏 | /// 首页 和 收藏 | ||||
Widget _getLeftWidget() { | Widget _getLeftWidget(GoodsDetailsFooterModel model) { | ||||
return Row( | return Row( | ||||
crossAxisAlignment: CrossAxisAlignment.center, | crossAxisAlignment: CrossAxisAlignment.center, | ||||
mainAxisAlignment: MainAxisAlignment.start, | mainAxisAlignment: MainAxisAlignment.start, | ||||
@@ -77,47 +108,43 @@ class _GooddsDetailsFooterContainerState extends State<GooddsDetailsFooterContai | |||||
onTap: () => _openHome(), | onTap: () => _openHome(), | ||||
child: Padding( | child: Padding( | ||||
padding: const EdgeInsets.only(right: 35), | padding: const EdgeInsets.only(right: 35), | ||||
child: _getCustomWidget('首页', '999999', null), | child: _getCustomWidget(model?.home ?? '首页', model?.home_color ?? '999999', model?.home_icon ?? ''), | ||||
)), | )), | ||||
GestureDetector( | GestureDetector( | ||||
behavior: HitTestBehavior.opaque, | behavior: HitTestBehavior.opaque, | ||||
onTap: () => _collectOnClick(), | onTap: () => _collectOnClick(), | ||||
child: Padding(padding: const EdgeInsets.only(right: 0), child: _getCustomWidget('收藏', '999999', null))) | child: Padding(padding: const EdgeInsets.only(right: 0), child: _getCustomWidget(model?.collect ?? '收藏', model?.collect_color ?? '999999', model?.collect_icon ?? ''))) | ||||
], | ], | ||||
); | ); | ||||
} | } | ||||
/// 分享赚与自购省 | /// 分享赚与自购省 | ||||
Widget _getRightWidget() { | Widget _getRightWidget(GoodsDetailsFooterModel model) { | ||||
return Row( | return Row( | ||||
mainAxisAlignment: MainAxisAlignment.end, | mainAxisAlignment: MainAxisAlignment.end, | ||||
crossAxisAlignment: CrossAxisAlignment.center, | crossAxisAlignment: CrossAxisAlignment.center, | ||||
children: <Widget>[_getFxzButton(), _getZgsButton()], | children: <Widget>[_getFxzButton(model), _getZgsButton(model)], | ||||
); | ); | ||||
} | } | ||||
/// 分享赚, | /// 分享赚, | ||||
Widget _getFxzButton() { | Widget _getFxzButton(GoodsDetailsFooterModel model) { | ||||
return GestureDetector( | return GestureDetector( | ||||
onTap: () => _shareOnClick(), | onTap: () => _shareOnClick(), | ||||
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), | ||||
decoration: BoxDecoration( | decoration: BoxDecoration( | ||||
gradient: LinearGradient(colors: [HexColor.fromHex('#FFCA66'), HexColor.fromHex('#FFD961')], begin: Alignment.centerLeft, end: Alignment.centerRight), | gradient: LinearGradient(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( | borderRadius: BorderRadius.only(bottomLeft: Radius.circular(25), topLeft: Radius.circular(25))), | ||||
bottomLeft: Radius.circular(25), | |||||
topLeft: Radius.circular(25) | |||||
) | |||||
), | |||||
child: Column( | child: Column( | ||||
children: <Widget>[ | children: <Widget>[ | ||||
RichText( | RichText( | ||||
text: TextSpan(text: '¥', style: TextStyle(fontSize: 12, color: HexColor.fromHex('FFFFFF')), children: [ | text: TextSpan(text: '¥ ', style: TextStyle(fontSize: 12, color: HexColor.fromHex(model?.share_earn_val_color ?? 'FFFFFF')), children: [ | ||||
TextSpan(text: '3.10', style: TextStyle(fontSize: 15, color: HexColor.fromHex('#FFFFFF'))), | TextSpan(text: model?.share_value ?? '0.0', style: TextStyle(fontSize: 15, color: HexColor.fromHex(model?.share_earn_color ?? '#FFFFFF'), fontFamily: 'Din', package: 'zhiying_base_widget')), | ||||
]), | ]), | ||||
), | ), | ||||
Text('分享赚', style: TextStyle(color: HexColor.fromHex('#FFFFFF'), fontSize: 15)) | Text(model?.share_earn ?? '分享赚', style: TextStyle(color: HexColor.fromHex(model?.share_earn_color ?? '#FFFFFF'), fontSize: 15)) | ||||
], | ], | ||||
), | ), | ||||
), | ), | ||||
@@ -125,7 +152,7 @@ class _GooddsDetailsFooterContainerState extends State<GooddsDetailsFooterContai | |||||
} | } | ||||
/// 自购省 | /// 自购省 | ||||
Widget _getZgsButton() { | Widget _getZgsButton(GoodsDetailsFooterModel model) { | ||||
return GestureDetector( | return GestureDetector( | ||||
behavior: HitTestBehavior.opaque, | behavior: HitTestBehavior.opaque, | ||||
onTap: () => _savemoneyOnClick(), | onTap: () => _savemoneyOnClick(), | ||||
@@ -133,20 +160,23 @@ class _GooddsDetailsFooterContainerState extends State<GooddsDetailsFooterContai | |||||
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), | ||||
decoration: BoxDecoration( | decoration: BoxDecoration( | ||||
gradient: LinearGradient(colors: [HexColor.fromHex('#FF6969'), HexColor.fromHex('#FF4646')], begin: Alignment.centerLeft, end: Alignment.centerRight), | gradient: LinearGradient(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( | borderRadius: BorderRadius.only(bottomRight: Radius.circular(25), topRight: Radius.circular(25))), | ||||
bottomRight: Radius.circular(25), | |||||
topRight: Radius.circular(25) | |||||
) | |||||
), | |||||
child: Column( | child: Column( | ||||
children: <Widget>[ | children: <Widget>[ | ||||
RichText( | RichText( | ||||
text: TextSpan(text: '¥', style: TextStyle(fontSize: 12, color: HexColor.fromHex('FFFFFF')), children: [ | text: TextSpan(text: '¥ ', style: TextStyle(fontSize: 12, color: HexColor.fromHex(model?.save_earn_val_color ?? 'FFFFFF')), children: [ | ||||
TextSpan(text: '23.10', style: TextStyle(fontSize: 15, color: HexColor.fromHex('#FFFFFF'))), | TextSpan( | ||||
text: model?.slef_buy_value ??'0.0', | |||||
style: TextStyle( | |||||
fontSize: 15, | |||||
color: HexColor.fromHex(model?.save_earn_val_color ?? '#FFFFFF'), | |||||
fontFamily: 'Din', | |||||
package: 'zhiying_base_widget', | |||||
)), | |||||
]), | ]), | ||||
), | ), | ||||
Text('自购省', style: TextStyle(color: HexColor.fromHex('#FFFFFF'), fontSize: 15)) | Text(model?.save_earn ?? '自购省', style: TextStyle(color: HexColor.fromHex(model?.save_earn_color ?? '#FFFFFF'), fontSize: 15)) | ||||
], | ], | ||||
), | ), | ||||
), | ), | ||||
@@ -159,8 +189,14 @@ class _GooddsDetailsFooterContainerState extends State<GooddsDetailsFooterContai | |||||
mainAxisAlignment: MainAxisAlignment.end, | mainAxisAlignment: MainAxisAlignment.end, | ||||
children: <Widget>[ | children: <Widget>[ | ||||
/// 图标 | /// 图标 | ||||
Container(height: 25, width: 25, color: Colors.red, margin: const EdgeInsets.only(bottom: 3)), | CachedNetworkImage( | ||||
imageUrl: icon, | |||||
fit: BoxFit.fill, | |||||
width: 25, | |||||
height: 25, | |||||
), | |||||
// Container( width: 25, margin: const EdgeInsets.only(bottom: 3), child: CachedNetworkImage(imageUrl: icon, fit: BoxFit.fill, width: 25,),), | |||||
const SizedBox(height: 3), | |||||
/// 图片 | /// 图片 | ||||
Text(text, style: TextStyle(color: HexColor.fromHex(textColor), fontSize: 11)) | Text(text, style: TextStyle(color: HexColor.fromHex(textColor), fontSize: 11)) | ||||
], | ], | ||||
@@ -0,0 +1,69 @@ | |||||
class GoodsDetailsFooterModel { | |||||
String collect; | |||||
String collect_color; | |||||
String collect_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 share_value; | |||||
String slef_buy_value; | |||||
GoodsDetailsFooterModel({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.slef_buy_value}); | |||||
factory GoodsDetailsFooterModel.fromJson(Map<String, dynamic> json) { | |||||
return GoodsDetailsFooterModel( | |||||
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'], | |||||
slef_buy_value: json['slef_buy_value'], | |||||
); | |||||
} | |||||
Map<String, dynamic> toJson() { | |||||
final Map<String, dynamic> data = new Map<String, dynamic>(); | |||||
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['slef_buy_value'] = this.slef_buy_value; | |||||
return data; | |||||
} | |||||
} |
@@ -1,4 +1,7 @@ | |||||
import 'dart:convert'; | |||||
import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
import 'package:zhiying_base_widget/widgets/goods_details/price/model/goods_details_price_model.dart'; | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | import 'package:zhiying_comm/zhiying_comm.dart'; | ||||
/// | /// | ||||
@@ -6,78 +9,91 @@ import 'package:zhiying_comm/zhiying_comm.dart'; | |||||
/// | /// | ||||
class GoodsDetailsPriceWidget extends StatelessWidget { | class GoodsDetailsPriceWidget extends StatelessWidget { | ||||
final Map<String, dynamic> model; | final Map<String, dynamic> model; | ||||
GoodsDetailsPriceModel _model; | |||||
const GoodsDetailsPriceWidget(this.model); | GoodsDetailsPriceWidget(this.model, {Key key}) : super(key: key){ | ||||
try{ | |||||
_model = GoodsDetailsPriceModel.fromJson(jsonDecode(model['data'])); | |||||
}catch(e){ | |||||
Logger.log('GoodsDetailsPriceWidget e = $e'); | |||||
} | |||||
} | |||||
@override | @override | ||||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
return Container(margin: const EdgeInsets.symmetric(horizontal: 12.5), child: _getMainWidget()); | return Container( | ||||
width: double.infinity, | |||||
color: Colors.white, | |||||
padding: const EdgeInsets.only(left: 12.5, right: 12.5, top: 7.5), | |||||
child: _getMainWidget(_model), | |||||
); | |||||
} | } | ||||
/// 主体视图 | /// 主体视图 | ||||
Widget _getMainWidget() { | Widget _getMainWidget(GoodsDetailsPriceModel model) { | ||||
return Row( | return Row( | ||||
mainAxisAlignment: MainAxisAlignment.spaceBetween, | mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||
children: <Widget>[ | children: <Widget>[ | ||||
_getLeftWidget(), | _getLeftWidget(model), | ||||
/// 右边widget | /// 右边widget | ||||
_getBuyNumberWidget(), | _getBuyNumberWidget(model), | ||||
], | ], | ||||
); | ); | ||||
} | } | ||||
/// 左边的wiget 包括价格等 | /// 左边的wiget 包括价格等 | ||||
Widget _getLeftWidget() { | Widget _getLeftWidget(GoodsDetailsPriceModel model) { | ||||
return Row( | return Row( | ||||
mainAxisAlignment: MainAxisAlignment.start, | mainAxisAlignment: MainAxisAlignment.start, | ||||
crossAxisAlignment: CrossAxisAlignment.center, | crossAxisAlignment: CrossAxisAlignment.center, | ||||
children: <Widget>[ | children: <Widget>[ | ||||
/// 价格 | /// 价格 | ||||
_getPriceWidget(), | _getPriceWidget(model), | ||||
const SizedBox(width: 5), | const SizedBox(width: 5), | ||||
/// 券后 | /// 券后 | ||||
_getQhPriceWidget(), | _getQhPriceWidget(model), | ||||
const SizedBox(width: 5), | const SizedBox(width: 5), | ||||
/// 积分 | /// 积分 | ||||
_getPointsWidget() | Visibility( | ||||
visible: !EmptyUtil.isEmpty(model?.point), | |||||
child: _getPointsWidget(model)) | |||||
], | ], | ||||
); | ); | ||||
} | } | ||||
/// 价格 | /// 价格 | ||||
Widget _getPriceWidget() { | Widget _getPriceWidget(GoodsDetailsPriceModel model) { | ||||
return Row( | return Row( | ||||
children: <Widget>[ | children: <Widget>[ | ||||
Text('¥', style: TextStyle(color: HexColor.fromHex('#FF4242'), fontSize: 15)), | Text(model?.symbol ?? '¥ ', style: TextStyle(color: HexColor.fromHex( model?.price_color ??'#FF4242'), fontSize: 15)), | ||||
Text('99', style: TextStyle(color: HexColor.fromHex('#FF4242'), fontSize: 30)), | Text(model?.current_price ?? '0', style: TextStyle(color: HexColor.fromHex(model?.price_color ?? '#FF4242'), fontSize: 30, fontFamily: 'Din', package: 'zhiying_base_widget')), | ||||
], | ], | ||||
); | ); | ||||
} | } | ||||
/// 积分 | /// 积分 | ||||
Widget _getPointsWidget() { | Widget _getPointsWidget(GoodsDetailsPriceModel model) { | ||||
return Container( | return Container( | ||||
decoration: BoxDecoration(color: HexColor.fromHex('#FFEFDA'), borderRadius: BorderRadius.circular(5)), | decoration: BoxDecoration(color: HexColor.fromHex(model?.points_bg_color ?? '#FFEFDA'), borderRadius: BorderRadius.circular(5)), | ||||
padding: const EdgeInsets.only(left: 4, right: 7.5, top: 4, bottom: 4), | padding: const EdgeInsets.only(left: 4, right: 7.5, top: 4, bottom: 4), | ||||
child: Text('', style: TextStyle(color: HexColor.fromHex('#B78107'), fontSize: 9)), | child: Text(model?.point ?? '+ 0.00 积分', style: TextStyle(color: HexColor.fromHex( model?.points_color ?? '#B78107'), fontSize: 9, fontFamily: 'Din', package: 'zhiying_base_widget')), | ||||
); | ); | ||||
} | } | ||||
/// 券后价格 | /// 券后价格 | ||||
Widget _getQhPriceWidget() { | Widget _getQhPriceWidget(GoodsDetailsPriceModel model) { | ||||
return Column( | return Column( | ||||
children: <Widget>[ | children: <Widget>[ | ||||
Text('券后', style: TextStyle(color: HexColor.fromHex('#FF4242'), fontSize: 11)), | Text(model?.ticket ?? '券后', style: TextStyle(color: HexColor.fromHex(model?.ticket_color ?? '#FF4242'), fontSize: 11)), | ||||
Text('¥ 199', style: TextStyle(color: HexColor.fromHex('#FF4242'), fontSize: 10)), | Text('${model?.symbol}${model?.market_price}' ?? '¥ 199', style: TextStyle(color: HexColor.fromHex(model?.ticket_price_color ?? '#FF4242'), fontSize: 10, fontFamily: 'Din', package: 'zhiying_base_widget', decoration: TextDecoration.lineThrough)), | ||||
], | ], | ||||
); | ); | ||||
} | } | ||||
/// 购买人数 | /// 购买人数 | ||||
Widget _getBuyNumberWidget() { | Widget _getBuyNumberWidget(GoodsDetailsPriceModel model) { | ||||
return Text('99999人已购买', style: TextStyle(color: HexColor.fromHex('#999999'), fontSize: 12.5)); | return Text('${model?.sold_count}${model?.buy_text}' ?? '99999人已购买', style: TextStyle(color: HexColor.fromHex(model?.buy_color ?? '#999999'), fontSize: 12.5)); | ||||
} | } | ||||
} | } |
@@ -0,0 +1,71 @@ | |||||
class GoodsDetailsPriceModel { | |||||
String buy_color; | |||||
String buy_text; | |||||
String current_price; | |||||
String good_id; | |||||
String market_price; | |||||
String point; | |||||
String points_bg_color; | |||||
String points_color; | |||||
String sold_count; | |||||
String ticket; | |||||
String ticket_color; | |||||
String ticket_price_color; | |||||
String price_color; | |||||
String symbol; | |||||
GoodsDetailsPriceModel( | |||||
{this.buy_color, | |||||
this.buy_text, | |||||
this.current_price, | |||||
this.good_id, | |||||
this.market_price, | |||||
this.point, | |||||
this.points_bg_color, | |||||
this.points_color, | |||||
this.sold_count, | |||||
this.ticket, | |||||
this.ticket_color, | |||||
this.ticket_price_color, | |||||
this.price_color, | |||||
this.symbol}); | |||||
factory GoodsDetailsPriceModel.fromJson(Map<String, dynamic> json) { | |||||
return GoodsDetailsPriceModel( | |||||
buy_color: json['buy_color'], | |||||
buy_text: json['buy_text'], | |||||
current_price: json['current_price'], | |||||
good_id: json['good_id'], | |||||
market_price: json['market_price'], | |||||
point: json['point'], | |||||
points_bg_color: json['points_bg_color'], | |||||
points_color: json['points_color'], | |||||
sold_count: json['sold_count'], | |||||
ticket: json['ticket'], | |||||
ticket_color: json['ticket_color'], | |||||
ticket_price_color: json['ticket_price_color'], | |||||
price_color: json['price_color'], | |||||
symbol: json['symbol'], | |||||
); | |||||
} | |||||
Map<String, dynamic> toJson() { | |||||
final Map<String, dynamic> data = new Map<String, dynamic>(); | |||||
data['buy_color'] = this.buy_color; | |||||
data['buy_text'] = this.buy_text; | |||||
data['current_price'] = this.current_price; | |||||
data['good_id'] = this.good_id; | |||||
data['market_price'] = this.market_price; | |||||
data['point'] = this.point; | |||||
data['points_bg_color'] = this.points_bg_color; | |||||
data['points_color'] = this.points_color; | |||||
data['sold_count'] = this.sold_count; | |||||
data['ticket'] = this.ticket; | |||||
data['ticket_color'] = this.ticket_color; | |||||
data['ticket_price_color'] = this.ticket_price_color; | |||||
data['price_color'] = this.price_color; | |||||
data['symbol'] = this.symbol; | |||||
return data; | |||||
} | |||||
} |
@@ -35,12 +35,13 @@ class GoodsDetailsSlideBannerBloc extends Bloc<GoodsDetailsSlideBannerEvent, Goo | |||||
var parentData = await repository.fetchParentData(event.model); | var parentData = await repository.fetchParentData(event.model); | ||||
if (!EmptyUtil.isEmpty(parentData)) { | if (!EmptyUtil.isEmpty(parentData)) { | ||||
yield GoodsDetailsSlideBannerLoadedState(model: parentData); | yield GoodsDetailsSlideBannerLoadedState(model: parentData); | ||||
return; | }else{ | ||||
} | |||||
var netData = await repository.fetchNetData(event.model); | |||||
if (!EmptyUtil.isEmpty(netData)) | |||||
yield GoodsDetailsSlideBannerLoadedState(model: parentData); | |||||
else | |||||
yield GoodsDetailsSlideBannerErrorState(); | yield GoodsDetailsSlideBannerErrorState(); | ||||
} | |||||
// var netData = await repository.fetchNetData(event.model); | |||||
// if (!EmptyUtil.isEmpty(netData)) | |||||
// yield GoodsDetailsSlideBannerLoadedState(model: parentData); | |||||
// else | |||||
// yield GoodsDetailsSlideBannerErrorState(); | |||||
} | } | ||||
} | } |
@@ -1,3 +1,5 @@ | |||||
import 'dart:convert'; | |||||
import 'package:zhiying_base_widget/widgets/goods_details/slide_banner/model/goods_details_silde_banner_model.dart'; | import 'package:zhiying_base_widget/widgets/goods_details/slide_banner/model/goods_details_silde_banner_model.dart'; | ||||
import 'package:zhiying_comm/zhiying_comm.dart'; | import 'package:zhiying_comm/zhiying_comm.dart'; | ||||
@@ -6,9 +8,9 @@ class GoodsDetailsSlideBannerRepository { | |||||
Future<GoodsDetailsSlideBannerModel> fetchParentData(final Map<String, dynamic> model) async { | Future<GoodsDetailsSlideBannerModel> fetchParentData(final Map<String, dynamic> model) async { | ||||
if (!EmptyUtil.isEmpty(model)) { | if (!EmptyUtil.isEmpty(model)) { | ||||
try { | try { | ||||
return GoodsDetailsSlideBannerModel.fromJson(model['data']); | return GoodsDetailsSlideBannerModel.fromJson(jsonDecode(model['data'])); | ||||
} catch (e) { | } catch (e) { | ||||
Logger.log(e); | Logger.log('GoodsDetailsSlideBannerRepository = $e'); | ||||
} | } | ||||
} | } | ||||
return null; | return null; | ||||
@@ -36,7 +36,7 @@ class GoodsDetailsSlideBannerContainer extends StatefulWidget { | |||||
class _GoodsDetailsSlideBannerContainerState extends State<GoodsDetailsSlideBannerContainer> { | class _GoodsDetailsSlideBannerContainerState extends State<GoodsDetailsSlideBannerContainer> { | ||||
/// 子元素点击事件 | /// 子元素点击事件 | ||||
void _itemOnClick(IndexCarousel model) { | void _itemOnClick(String model) { | ||||
print('点击了 $model'); | print('点击了 $model'); | ||||
} | } | ||||
@@ -58,7 +58,7 @@ class _GoodsDetailsSlideBannerContainerState extends State<GoodsDetailsSlideBann | |||||
builder: (context, state) { | builder: (context, state) { | ||||
print('currente state = $state'); | print('currente state = $state'); | ||||
if (state is GoodsDetailsSlideBannerLoadedState) { | if (state is GoodsDetailsSlideBannerLoadedState) { | ||||
if (!EmptyUtil.isEmpty(state.model) && !EmptyUtil.isEmpty(state.model.index_carousel_list)) { | if (!EmptyUtil.isEmpty(state.model) && !EmptyUtil.isEmpty(state.model.image_list)) { | ||||
return _getMainWidget(state.model); | return _getMainWidget(state.model); | ||||
} | } | ||||
} | } | ||||
@@ -75,17 +75,17 @@ class _GoodsDetailsSlideBannerContainerState extends State<GoodsDetailsSlideBann | |||||
height: 375, | height: 375, | ||||
child: Swiper( | child: Swiper( | ||||
itemBuilder: (BuildContext context, int index) { | itemBuilder: (BuildContext context, int index) { | ||||
IndexCarousel items = datas.index_carousel_list[index]; | String items = datas.image_list[index]; | ||||
return Container( | return Container( | ||||
width: double.infinity, | width: double.infinity, | ||||
child: CachedNetworkImage(imageUrl: items?.img ?? '', fit: BoxFit.cover), | child: CachedNetworkImage(imageUrl: items ?? '', fit: BoxFit.cover), | ||||
); | ); | ||||
}, | }, | ||||
itemCount: datas?.index_carousel_list?.length ?? 0, | itemCount: datas?.image_list?.length ?? 0, | ||||
loop: true, | loop: true, | ||||
autoplay: true, | autoplay: true, | ||||
onTap: (index) => _itemOnClick(datas.index_carousel_list[index]), | onTap: (index) => _itemOnClick(datas.image_list[index]), | ||||
pagination: _getSwiperStyleByType(datas, datas?.index_carousel_list?.length ?? 0), | pagination: _getSwiperStyleByType(datas, datas?.image_list?.length ?? 0), | ||||
), | ), | ||||
); | ); | ||||
} | } | ||||
@@ -1,61 +1,36 @@ | |||||
class GoodsDetailsSlideBannerModel { | class GoodsDetailsSlideBannerModel { | ||||
String pagination; | List<String> image_list; | ||||
String pagination_open; | String pagination; | ||||
List<String> pagination_options; | String pagination_open; | ||||
List<IndexCarousel> index_carousel_list; | List<String> pagination_options; | ||||
String pagination_select_color; | String pagination_select_color; | ||||
String pagination_unselect_color; | String pagination_unselect_color; | ||||
GoodsDetailsSlideBannerModel({this.image_list, this.pagination, this.pagination_open, this.pagination_options, this.pagination_select_color, this.pagination_unselect_color}); | |||||
GoodsDetailsSlideBannerModel({this.pagination, this.pagination_open, this.pagination_options, this.pagination_select_color, this.pagination_unselect_color, this.index_carousel_list}); | factory GoodsDetailsSlideBannerModel.fromJson(Map<String, dynamic> json) { | ||||
return GoodsDetailsSlideBannerModel( | |||||
factory GoodsDetailsSlideBannerModel.fromJson(Map<String, dynamic> json) { | image_list: json['image_list'] != null ? new List<String>.from(json['image_list']) : null, | ||||
return GoodsDetailsSlideBannerModel( | pagination: json['pagination'], | ||||
pagination: json['pagination'], | pagination_open: json['pagination_open'], | ||||
pagination_open: json['pagination_open'], | pagination_options: json['pagination_options'] != null ? new List<String>.from(json['pagination_options']) : null, | ||||
pagination_options: json['pagination_options'] != null ? new List<String>.from(json['pagination_options']) : null, | pagination_select_color: json['pagination_select_color'], | ||||
index_carousel_list: json['index_carousel_list'] != null ? (json['index_carousel_list'] as List).map((i) => IndexCarousel.fromJson(i)).toList() : null, | pagination_unselect_color: json['pagination_unselect_color'], | ||||
pagination_select_color: json['pagination_select_color'], | ); | ||||
pagination_unselect_color: json['pagination_unselect_color'], | |||||
); | |||||
} | |||||
Map<String, dynamic> toJson() { | |||||
final Map<String, dynamic> data = new Map<String, dynamic>(); | |||||
data['pagination'] = this.pagination; | |||||
data['pagination_open'] = this.pagination_open; | |||||
data['pagination_select_color'] = this.pagination_select_color; | |||||
data['pagination_unselect_color'] = this.pagination_unselect_color; | |||||
if (this.pagination_options != null) { | |||||
data['pagination_options'] = this.pagination_options; | |||||
} | } | ||||
if (this.index_carousel_list != null) { | |||||
data['index_carousel_list'] = this.index_carousel_list.map((v) => v.toJson()).toList(); | |||||
} | |||||
return data; | |||||
} | |||||
} | |||||
class IndexCarousel { | |||||
String img; | |||||
String skip_identifier; | |||||
IndexCarousel({this.img, this.skip_identifier}); | Map<String, dynamic> toJson() { | ||||
final Map<String, dynamic> data = new Map<String, dynamic>(); | |||||
factory IndexCarousel.fromJson(Map<String, dynamic> json) { | data['pagination'] = this.pagination; | ||||
return IndexCarousel( | data['pagination_open'] = this.pagination_open; | ||||
img: json['img'], | data['pagination_select_color'] = this.pagination_select_color; | ||||
skip_identifier: json['skip_identifier'], | data['pagination_unselect_color'] = this.pagination_unselect_color; | ||||
); | if (this.image_list != null) { | ||||
} | data['image_list'] = this.image_list; | ||||
} | |||||
Map<String, dynamic> toJson() { | if (this.pagination_options != null) { | ||||
final Map<String, dynamic> data = new Map<String, dynamic>(); | data['pagination_options'] = this.pagination_options; | ||||
data['img'] = this.img; | } | ||||
data['skip_identifier'] = this.skip_identifier; | return data; | ||||
return data; | } | ||||
} | |||||
} | } |
@@ -1,8 +1,7 @@ | |||||
import 'dart:async'; | import 'dart:async'; | ||||
import 'package:bloc/bloc.dart'; | import 'package:bloc/bloc.dart'; | ||||
import 'package:zhiying_base_widget/widgets/goods_details/store/bloc/store_repository.dart'; | import 'package:zhiying_base_widget/widgets/goods_details/store/bloc/store_repository.dart'; | ||||
import 'package:zhiying_comm/util/empty_util.dart' | import 'package:zhiying_comm/util/empty_util.dart'; | ||||
''; | |||||
import 'bloc.dart'; | import 'bloc.dart'; | ||||
@@ -29,15 +28,21 @@ class StoreBloc extends Bloc<StoreEvent, StoreState> { | |||||
/// 获取数据 | /// 获取数据 | ||||
Stream<StoreState> _mapInitEventToState(StoreInitEvent event) async*{ | Stream<StoreState> _mapInitEventToState(StoreInitEvent event) async*{ | ||||
var result = await repository.fetchParentData(event); | var result = await repository.fetchParentData(event); | ||||
if(!EmptyUtil.isEmpty(result)){ | if(!EmptyUtil.isEmpty(result)) { | ||||
yield StoreLoadedState(model: result); | yield StoreLoadedState(model: result); | ||||
return; | }else{ | ||||
} | |||||
var net = await repository.fetchNetData(event); | |||||
if(!EmptyUtil.isEmpty(net)) | |||||
yield StoreLoadedState(model: result); | |||||
else | |||||
yield StoreErrorState(); | yield StoreErrorState(); | ||||
} | |||||
// if(!EmptyUtil.isEmpty(result)){ | |||||
// yield StoreLoadedState(model: result); | |||||
// return; | |||||
// } | |||||
// var net = await repository.fetchNetData(event); | |||||
// if(!EmptyUtil.isEmpty(net)) | |||||
// yield StoreLoadedState(model: result); | |||||
// else | |||||
// yield StoreErrorState(); | |||||
} | } | ||||
} | } |
@@ -1,4 +1,5 @@ | |||||
import 'package:equatable/equatable.dart'; | import 'package:equatable/equatable.dart'; | ||||
import 'package:flutter/cupertino.dart'; | |||||
abstract class StoreEvent extends Equatable { | abstract class StoreEvent extends Equatable { | ||||
const StoreEvent(); | const StoreEvent(); | ||||
@@ -6,6 +7,10 @@ abstract class StoreEvent extends Equatable { | |||||
/// 初始化事件 | /// 初始化事件 | ||||
class StoreInitEvent extends StoreEvent { | class StoreInitEvent extends StoreEvent { | ||||
final Map<String, dynamic> model; | |||||
const StoreInitEvent({@required this.model}); | |||||
@override | @override | ||||
List<Object> get props => []; | List<Object> get props => [this.model]; | ||||
} | } |
@@ -1,9 +1,18 @@ | |||||
import 'dart:convert'; | |||||
import 'package:zhiying_base_widget/widgets/goods_details/store/bloc/bloc.dart'; | import 'package:zhiying_base_widget/widgets/goods_details/store/bloc/bloc.dart'; | ||||
import 'package:zhiying_base_widget/widgets/goods_details/store/model/store_model.dart'; | import 'package:zhiying_base_widget/widgets/goods_details/store/model/store_model.dart'; | ||||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||||
class StoreRepository { | class StoreRepository { | ||||
/// 获取上级数据 | /// 获取上级数据 | ||||
Future<StoreModel> fetchParentData(StoreInitEvent event) async {} | Future<StoreModel> fetchParentData(StoreInitEvent event) async { | ||||
try { | |||||
return StoreModel.fromJson(json.decode(event.model['data'])); | |||||
} catch (e) { | |||||
Logger.log('StoreRepository e= $e'); | |||||
} | |||||
} | |||||
/// 网络数据 | /// 网络数据 | ||||
Future<StoreModel> fetchNetData(StoreInitEvent event) async {} | Future<StoreModel> fetchNetData(StoreInitEvent event) async {} | ||||
@@ -1,3 +1,54 @@ | |||||
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; | |||||
class StoreModel{} | 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}); | ||||
factory StoreModel.fromJson(Map<String, dynamic> 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'], | |||||
); | |||||
} | |||||
Map<String, dynamic> toJson() { | |||||
final Map<String, dynamic> data = new Map<String, dynamic>(); | |||||
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; | |||||
return data; | |||||
} | |||||
} |
@@ -6,6 +6,7 @@ class StoreSkeleton extends StatelessWidget { | |||||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
return Container( | return Container( | ||||
height: 50, | height: 50, | ||||
margin: const EdgeInsets.only(left: 12.5, right: 12.5, top: 20), | |||||
width: double.infinity, | width: double.infinity, | ||||
child: Row( | child: Row( | ||||
mainAxisAlignment: MainAxisAlignment.start, | mainAxisAlignment: MainAxisAlignment.start, | ||||
@@ -14,9 +15,11 @@ class StoreSkeleton extends StatelessWidget { | |||||
/// 图片 | /// 图片 | ||||
_shimmerWidget(width: 50, height: 50), | _shimmerWidget(width: 50, height: 50), | ||||
const SizedBox(width: 10), | |||||
/// | /// | ||||
Column( | Column( | ||||
mainAxisAlignment: MainAxisAlignment.spaceBetween, | mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||
crossAxisAlignment: CrossAxisAlignment.start, | |||||
children: <Widget>[ | children: <Widget>[ | ||||
_shimmerWidget(width: 150, height: 20), | _shimmerWidget(width: 150, height: 20), | ||||
@@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; | |||||
import 'package:zhiying_base_widget/widgets/goods_details/store/bloc/bloc.dart'; | import 'package:zhiying_base_widget/widgets/goods_details/store/bloc/bloc.dart'; | ||||
import 'package:zhiying_base_widget/widgets/goods_details/store/bloc/store_repository.dart'; | import 'package:zhiying_base_widget/widgets/goods_details/store/bloc/store_repository.dart'; | ||||
import 'package:zhiying_base_widget/widgets/goods_details/store/model/store_model.dart'; | import 'package:zhiying_base_widget/widgets/goods_details/store/model/store_model.dart'; | ||||
import 'package:cached_network_image/cached_network_image.dart'; | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | import 'package:zhiying_comm/zhiying_comm.dart'; | ||||
import 'package:flutter_bloc/flutter_bloc.dart'; | import 'package:flutter_bloc/flutter_bloc.dart'; | ||||
@@ -18,7 +19,7 @@ class StoreWidget extends StatelessWidget { | |||||
@override | @override | ||||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
return BlocProvider<StoreBloc>( | return BlocProvider<StoreBloc>( | ||||
create: (_) => StoreBloc(repository: StoreRepository())..add(StoreInitEvent()), | create: (_) => StoreBloc(repository: StoreRepository())..add(StoreInitEvent(model: model)), | ||||
child: StoreContainer(), | child: StoreContainer(), | ||||
); | ); | ||||
} | } | ||||
@@ -30,16 +31,11 @@ class StoreContainer extends StatefulWidget { | |||||
} | } | ||||
class _StoreContainerState extends State<StoreContainer> { | class _StoreContainerState extends State<StoreContainer> { | ||||
/// 点击更多 | /// 点击更多 | ||||
void _onMoreClick(){ | void _onMoreClick() {} | ||||
} | |||||
/// 点击商家 | /// 点击商家 | ||||
void _onStoreClick(){ | void _onStoreClick() {} | ||||
} | |||||
@override | @override | ||||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
@@ -63,14 +59,18 @@ class _StoreContainerState extends State<StoreContainer> { | |||||
/// 主视图 | /// 主视图 | ||||
Widget _getMianWidget(StoreModel model) { | Widget _getMianWidget(StoreModel model) { | ||||
return Container( | return Container( | ||||
margin: const EdgeInsets.only(left: 12.5, right: 12.5), | 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), | |||||
child: Row( | child: Row( | ||||
children: <Widget>[ | children: <Widget>[ | ||||
/// 商家图片 | /// 商家图片 | ||||
_getStoreImgWidget(model), | _getStoreImgWidget(model), | ||||
const SizedBox(width: 7.5), | |||||
Expanded( | Expanded( | ||||
child: Column( | child: Column( | ||||
crossAxisAlignment: CrossAxisAlignment.start, | |||||
mainAxisAlignment: MainAxisAlignment.spaceBetween, | mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||
children: <Widget>[ | children: <Widget>[ | ||||
/// 商店名称与更多 | /// 商店名称与更多 | ||||
@@ -98,19 +98,14 @@ class _StoreContainerState extends State<StoreContainer> { | |||||
/// 商店名称 | /// 商店名称 | ||||
Widget _getStoreNameWidget(StoreModel model) { | Widget _getStoreNameWidget(StoreModel model) { | ||||
return Row( | return Row( | ||||
crossAxisAlignment: CrossAxisAlignment.start, | |||||
mainAxisAlignment: MainAxisAlignment.spaceBetween, | mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||
children: <Widget>[ | children: <Widget>[ | ||||
/// 商店名称 | /// 商店名称 | ||||
Text( | Text(model?.shop_name ?? '品胜京东自营旗舰店', style: TextStyle(color: HexColor.fromHex(model?.shop_name_color ?? '#333333'), fontSize: 13, fontWeight: FontWeight.bold)), | ||||
'品胜京东自营旗舰店', | |||||
style: TextStyle(color: HexColor.fromHex('#333333'), fontSize: 13), | |||||
), | |||||
/// 更多 | /// 更多 | ||||
Text( | Text(model?.more ?? '更多店铺优惠 >', style: TextStyle(color: HexColor.fromHex('#FF4242'), fontSize: 11)), | ||||
'更多店铺优惠 >', | |||||
style: TextStyle(color: HexColor.fromHex('#FF4242'), fontSize: 11), | |||||
), | |||||
], | ], | ||||
); | ); | ||||
} | } | ||||
@@ -121,13 +116,13 @@ class _StoreContainerState extends State<StoreContainer> { | |||||
mainAxisAlignment: MainAxisAlignment.spaceBetween, | mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||
children: <Widget>[ | children: <Widget>[ | ||||
/// 宝贝描述 5.0 | /// 宝贝描述 5.0 | ||||
_getCoustomWidet('宝贝描述 5.0', '#999999', ''), | _getCoustomWidet(model?.description ?? '宝贝描述 5.0',model?.description_color ?? '#999999', model?.description_leve_icon ?? ''), | ||||
/// 物流服务 5.0 | /// 物流服务 5.0 | ||||
_getCoustomWidet('宝贝描述 5.0', '#999999', ''), | _getCoustomWidet(model?.logistics ?? '宝贝描述 5.0', model?.logistics_color ?? '#999999', model?.logistics_leve_icon ?? ''), | ||||
/// 服务态度 1.0 | /// 服务态度 1.0 | ||||
_getCoustomWidet('宝贝描述 5.0', '#999999', ''), | _getCoustomWidet(model?.service ?? '宝贝描述 5.0', model?.service_color ?? '#999999', model?.service_leve_icon ?? ''), | ||||
], | ], | ||||
); | ); | ||||
} | } | ||||
@@ -136,10 +131,15 @@ class _StoreContainerState extends State<StoreContainer> { | |||||
return Row( | return Row( | ||||
children: <Widget>[ | children: <Widget>[ | ||||
Text(text, style: TextStyle(fontSize: 11, color: HexColor.fromHex(textColor))), | Text(text, style: TextStyle(fontSize: 11, color: HexColor.fromHex(textColor))), | ||||
const SizedBox(width: 3), | |||||
Container( | Container( | ||||
width: 12, | width: 12, | ||||
height: 12, | height: 12, | ||||
color: Colors.red, | // color: Colors.red, | ||||
child: CachedNetworkImage( | |||||
imageUrl: icon ?? '', | |||||
), | |||||
), | ), | ||||
], | ], | ||||
); | ); | ||||
@@ -1,4 +1,7 @@ | |||||
import 'dart:convert'; | |||||
import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
import 'package:zhiying_base_widget/widgets/goods_details/title/model/goods_details_title_model.dart'; | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | import 'package:zhiying_comm/zhiying_comm.dart'; | ||||
/// | /// | ||||
@@ -6,43 +9,92 @@ import 'package:zhiying_comm/zhiying_comm.dart'; | |||||
/// | /// | ||||
class GoodsDetailsTitleWidget extends StatelessWidget { | class GoodsDetailsTitleWidget extends StatelessWidget { | ||||
final Map<String, dynamic> model; | final Map<String, dynamic> model; | ||||
GoodsDetailsTitleModel _model; | |||||
const GoodsDetailsTitleWidget(this.model); | GoodsDetailsTitleWidget(this.model, {Key key}) : super(key: key) { | ||||
try { | |||||
_model = GoodsDetailsTitleModel.fromJson(jsonDecode(model['data'])); | |||||
} catch (e) { | |||||
Logger.log('GoodsDetailsTitleWidget e = $e'); | |||||
} | |||||
} | |||||
@override | @override | ||||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
return Container( | return Container( | ||||
width: double.infinity, | width: double.infinity, | ||||
margin: const EdgeInsets.only(left: 12.5, right: 12.5), | color: Colors.white, | ||||
child: _getMaiWidget(), | padding: const EdgeInsets.only(left: 12.5, right: 12.5, top: 6.5), | ||||
child: _getMaiWidget(_model), | |||||
); | ); | ||||
} | } | ||||
/// 主widget | /// 主widget | ||||
Widget _getMaiWidget() { | Widget _getMaiWidget(GoodsDetailsTitleModel model) { | ||||
return RichText( | return Column( | ||||
maxLines: 2, | children: <Widget>[ | ||||
overflow: TextOverflow.ellipsis, | RichText( | ||||
text: TextSpan(children: [ | maxLines: 2, | ||||
WidgetSpan( | overflow: TextOverflow.ellipsis, | ||||
child: _getGoodsTypeIcon(), | text: TextSpan(children: [ | ||||
WidgetSpan( | |||||
child: _getGoodsTypeIcon(model), | |||||
), | |||||
_getGoodsTitle(model), | |||||
]), | |||||
), | ), | ||||
_getGoodsTitle(), | /// 优惠卷说明 | ||||
]), | Padding(padding: const EdgeInsets.only(top: 12.5), child: _getCounponDestrWidget(model)), | ||||
], | |||||
); | ); | ||||
} | } | ||||
/// 商品类型图标 | /// 商品类型图标 | ||||
Widget _getGoodsTypeIcon() { | Widget _getGoodsTypeIcon(GoodsDetailsTitleModel model) { | ||||
return Container( | return Container( | ||||
height: 15, | // height: 15, | ||||
width: 32, | // width: 32, | ||||
color: Colors.red, | 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, style: TextStyle(color: HexColor.fromHex(model?.provider_name_color), fontSize: 9)), | |||||
); | ); | ||||
} | } | ||||
/// 商品标题 | /// 商品标题 | ||||
InlineSpan _getGoodsTitle() { | InlineSpan _getGoodsTitle(GoodsDetailsTitleModel model) { | ||||
return TextSpan(text: '品胜(PISEN)苹果数据线1.5米 适用于苹果手机所有机型 MFI认证安全稳定一年换新1.5米2米', style: TextStyle(fontSize: 14, color: HexColor.fromHex('#FF333333'))); | return TextSpan( | ||||
text: model?.title ?? '品胜(PISEN)苹果数据线1.5米 适用于苹果手机所有机型 MFI认证安全稳定一年换新1.5米2米', | |||||
style: TextStyle( | |||||
fontWeight: FontWeight.bold, | |||||
fontSize: 14, | |||||
color: HexColor.fromHex(model?.good_title_color ?? '#FF333333'), | |||||
)); | |||||
} | |||||
/// 优惠卷说明 | |||||
Widget _getCounponDestrWidget(GoodsDetailsTitleModel model) { | |||||
return Row( | |||||
mainAxisAlignment: MainAxisAlignment.start, | |||||
children: <Widget>[ | |||||
/// 领券立减100元 widget | |||||
_getCoumstonButtomWidget(model?.coupon_text, model?.coupon_text_color, model?.coupon_bg_color), | |||||
const SizedBox(width: 5), | |||||
/// 收货后返现5.5元 | |||||
_getCoumstonButtomWidget(model?.commission_text, model?.commission_text_color, model?.commission_bg_color), | |||||
], | |||||
); | |||||
} | |||||
Widget _getCoumstonButtomWidget(String text, String textColor, String bg) { | |||||
return Container( | |||||
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), | |||||
), | |||||
); | |||||
} | } | ||||
} | } |
@@ -0,0 +1,58 @@ | |||||
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 title; | |||||
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}); | |||||
factory GoodsDetailsTitleModel.fromJson(Map<String, dynamic> 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'], | |||||
); | |||||
} | |||||
Map<String, dynamic> toJson() { | |||||
final Map<String, dynamic> data = new Map<String, dynamic>(); | |||||
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['title'] = this.title; | |||||
return data; | |||||
} | |||||
} |
@@ -1,3 +1,36 @@ | |||||
class UpgradeTipModel{} | class UpgradeTipModel { | ||||
String bg_color; | |||||
String go_text; | |||||
String go_text_color; | |||||
String icon; | |||||
String text; | |||||
String text_color; | |||||
String url; | |||||
UpgradeTipModel({this.bg_color, this.go_text, this.go_text_color, this.icon, this.text, this.text_color, this.url}); | |||||
factory UpgradeTipModel.fromJson(Map<String, dynamic> json) { | |||||
return UpgradeTipModel( | |||||
bg_color: json['bg_color'], | |||||
go_text: json['go_text'], | |||||
go_text_color: json['go_text_color'], | |||||
icon: json['icon'], | |||||
text: json['text'], | |||||
text_color: json['text_color'], | |||||
url: json['url'], | |||||
); | |||||
} | |||||
Map<String, dynamic> toJson() { | |||||
final Map<String, dynamic> data = new Map<String, dynamic>(); | |||||
data['bg_color'] = this.bg_color; | |||||
data['go_text'] = this.go_text; | |||||
data['go_text_color'] = this.go_text_color; | |||||
data['icon'] = this.icon; | |||||
data['text'] = this.text; | |||||
data['text_color'] = this.text_color; | |||||
data['url'] = this.url; | |||||
return data; | |||||
} | |||||
} |
@@ -1,30 +1,47 @@ | |||||
import 'dart:convert'; | |||||
import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
import 'package:zhiying_base_widget/widgets/goods_details/upgrade_tip/model/upgrade_tip_model.dart'; | import 'package:zhiying_base_widget/widgets/goods_details/upgrade_tip/model/upgrade_tip_model.dart'; | ||||
import 'package:zhiying_comm/zhiying_comm.dart'; | import 'package:zhiying_comm/zhiying_comm.dart'; | ||||
import 'package:cached_network_image/cached_network_image.dart'; | |||||
/// | /// | ||||
/// 更新提示widget | /// 更新提示widget | ||||
/// | /// | ||||
class UpgradeTipWidget extends StatelessWidget { | class UpgradeTipWidget extends StatelessWidget { | ||||
final Map<String, dynamic> model; | final Map<String, dynamic> model; | ||||
UpgradeTipModel _upgradeTipModel; | |||||
const UpgradeTipWidget(this.model); | UpgradeTipWidget(this.model, {Key key}) : super(key: key){ | ||||
try{ | |||||
_upgradeTipModel = UpgradeTipModel.fromJson(jsonDecode(model['data'])); | |||||
}catch(e){ | |||||
Logger.log('UpgradeTipWidget e = $e'); | |||||
} | |||||
} | |||||
@override | @override | ||||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
return Container( | return Container( | ||||
width: double.infinity, | |||||
padding: const EdgeInsets.only(left: 12.5, right: 12.5, top: 12.5), | |||||
decoration: BoxDecoration( | decoration: BoxDecoration( | ||||
color: HexColor.fromHex('#FFEFDA'), | color: Colors.white, | ||||
borderRadius: BorderRadius.circular(30), | borderRadius: BorderRadius.only(topLeft: Radius.circular(7.5), topRight: Radius.circular(7.5)) | ||||
), | ), | ||||
padding: const EdgeInsets.only(left: 10, right: 13, top: 10, bottom: 10), | child: Container( | ||||
margin: const EdgeInsets.symmetric(horizontal: 12.5), | decoration: BoxDecoration( | ||||
child: Row( | /// 背景颜色 | ||||
mainAxisAlignment: MainAxisAlignment.spaceBetween, | color: HexColor.fromHex(_upgradeTipModel?.bg_color ?? '#FFEFDA'), | ||||
children: <Widget>[ | borderRadius: BorderRadius.circular(30), | ||||
_geLeftWidget(null), | ), | ||||
_getRightWidget(null), | padding: const EdgeInsets.only(left: 10, right: 13, top: 10, bottom: 10), | ||||
], | child: Row( | ||||
mainAxisAlignment: MainAxisAlignment.spaceBetween, | |||||
children: <Widget>[ | |||||
_geLeftWidget(_upgradeTipModel), | |||||
_getRightWidget(_upgradeTipModel), | |||||
], | |||||
), | |||||
), | ), | ||||
); | ); | ||||
} | } | ||||
@@ -34,24 +51,26 @@ class UpgradeTipWidget extends StatelessWidget { | |||||
return Row( | return Row( | ||||
children: <Widget>[ | children: <Widget>[ | ||||
/// 图标 | /// 图标 | ||||
Container(width: 15, height: 15, color: Colors.red), | // Container(width: 15, height: 15, child: ,), | ||||
CachedNetworkImage(imageUrl: model?.icon ?? '', width: 15,), | |||||
const SizedBox(width: 7.5), | const SizedBox(width: 7.5), | ||||
/// 文字 | /// 文字 | ||||
Text('下载APP升级运营商,享受更多收益', style: TextStyle(color: HexColor.fromHex('#C09023'), fontSize: 11)) | Text(model?.text ?? '下载APP升级运营商,享受更多收益', style: TextStyle(color: HexColor.fromHex( model?.text_color ?? '#C09023'), fontSize: 11)) | ||||
], | ], | ||||
); | ); | ||||
} | } | ||||
/// 右边的视图 | /// 右边的视图 | ||||
Widget _getRightWidget(UpgradeTipModel model) { | Widget _getRightWidget(UpgradeTipModel model) { | ||||
return Row( | return Text(model?.go_text ??'前往下载', style: TextStyle(color: HexColor.fromHex(model?.go_text_color ?? '#C09023'), fontSize: 11)); | ||||
children: <Widget>[ | // return Row( | ||||
Text('前往下载', style: TextStyle(color: HexColor.fromHex('#C09023'), fontSize: 11)), | // children: <Widget>[ | ||||
const SizedBox(width: 4), | // Text(model?.go_text ??'前往下载', style: TextStyle(color: HexColor.fromHex('#C09023'), fontSize: 11)), | ||||
Text('》', style: TextStyle(color: HexColor.fromHex('#C09023'), fontSize: 11)) | // const SizedBox(width: 4), | ||||
], | // Text('》', style: TextStyle(color: HexColor.fromHex('#C09023'), fontSize: 11)) | ||||
); | // ], | ||||
// ); | |||||
} | } | ||||
} | } |
@@ -2,6 +2,7 @@ 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:zhiying_base_widget/pages/goods_details_page/goods_details_page.dart'; | |||||
import 'package:zhiying_base_widget/widgets/home/home_goods/models/home_goods_model.dart'; | import 'package:zhiying_base_widget/widgets/home/home_goods/models/home_goods_model.dart'; | ||||
import 'package:zhiying_base_widget/widgets/home/home_goods/models/home_goods_style_model.dart'; | import 'package:zhiying_base_widget/widgets/home/home_goods/models/home_goods_style_model.dart'; | ||||
import 'package:zhiying_comm/zhiying_comm.dart'; | import 'package:zhiying_comm/zhiying_comm.dart'; | ||||
@@ -21,49 +22,59 @@ class HomeGoodsItem extends StatelessWidget { | |||||
} | } | ||||
} | } | ||||
/// 跳到商品详情 | |||||
void _onJumpGoodsDetails(BuildContext context,HomeGoodsModel goods){ | |||||
Navigator.push(context, MaterialPageRoute( | |||||
builder: (_)=> GoodsDetailsPage(goods.toJson()) | |||||
)); | |||||
} | |||||
@override | @override | ||||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
return Container( | return GestureDetector( | ||||
margin: EdgeInsets.only(left: 12.5, right: 12.5, top: 4, bottom: 4), | onTap: ()=> _onJumpGoodsDetails(context, goods), | ||||
padding: EdgeInsets.all(7.5), | child: Container( | ||||
decoration: BoxDecoration( | margin: EdgeInsets.only(left: 12.5, right: 12.5, top: 4, bottom: 4), | ||||
color: Colors.white, | padding: EdgeInsets.all(7.5), | ||||
borderRadius: BorderRadius.all(Radius.circular(7.5))), | decoration: BoxDecoration( | ||||
child: Row( | color: Colors.white, | ||||
crossAxisAlignment: CrossAxisAlignment.start, | borderRadius: BorderRadius.all(Radius.circular(7.5))), | ||||
children: <Widget>[ | child: Row( | ||||
Container( | crossAxisAlignment: CrossAxisAlignment.start, | ||||
width: 126, | children: <Widget>[ | ||||
height: 126, | Container( | ||||
margin: EdgeInsets.only(right: 10), | width: 126, | ||||
child: ClipRRect( | |||||
borderRadius: BorderRadius.circular(7.5), | |||||
child: CachedNetworkImage( | |||||
imageUrl: goods.goodImage, | |||||
fit: BoxFit.fitHeight, | |||||
), | |||||
), | |||||
), | |||||
Expanded( | |||||
child: Container( | |||||
height: 126, | height: 126, | ||||
width: double.infinity, | margin: EdgeInsets.only(right: 10), | ||||
child: Column( | child: ClipRRect( | ||||
crossAxisAlignment: CrossAxisAlignment.start, | borderRadius: BorderRadius.circular(7.5), | ||||
children: <Widget>[ | child: CachedNetworkImage( | ||||
Container( | imageUrl: goods.goodImage, | ||||
width: double.infinity, | fit: BoxFit.fitHeight, | ||||
child: _createTitle(), | ), | ||||
), | |||||
_createShop(), | |||||
_createCupone(), | |||||
Expanded(child: Container()), | |||||
_createBottom(), | |||||
], | |||||
), | ), | ||||
), | ), | ||||
) | Expanded( | ||||
], | child: Container( | ||||
height: 126, | |||||
width: double.infinity, | |||||
child: Column( | |||||
crossAxisAlignment: CrossAxisAlignment.start, | |||||
children: <Widget>[ | |||||
Container( | |||||
width: double.infinity, | |||||
child: _createTitle(), | |||||
), | |||||
_createShop(), | |||||
_createCupone(), | |||||
Expanded(child: Container()), | |||||
_createBottom(), | |||||
], | |||||
), | |||||
), | |||||
) | |||||
], | |||||
), | |||||
), | ), | ||||
); | ); | ||||
} | } | ||||
@@ -4,6 +4,9 @@ part 'home_goods_model.g.dart'; | |||||
@JsonSerializable() | @JsonSerializable() | ||||
class HomeGoodsModel extends Object { | class HomeGoodsModel extends Object { | ||||
@JsonKey(name: 'provider') | |||||
String provider; | |||||
@JsonKey(name: 'provider_name') | @JsonKey(name: 'provider_name') | ||||
String providerName; | String providerName; | ||||
@@ -35,6 +38,7 @@ class HomeGoodsModel extends Object { | |||||
String inorderCount; | String inorderCount; | ||||
HomeGoodsModel( | HomeGoodsModel( | ||||
this.provider, | |||||
this.providerName, | this.providerName, | ||||
this.goodId, | this.goodId, | ||||
this.goodImage, | this.goodImage, | ||||
@@ -8,6 +8,7 @@ part of 'home_goods_model.dart'; | |||||
HomeGoodsModel _$HomeGoodsModelFromJson(Map<String, dynamic> json) { | HomeGoodsModel _$HomeGoodsModelFromJson(Map<String, dynamic> json) { | ||||
return HomeGoodsModel( | return HomeGoodsModel( | ||||
json['provider'] as String, | |||||
json['provider_name'] as String, | json['provider_name'] as String, | ||||
json['good_id'] as String, | json['good_id'] as String, | ||||
json['good_image'] as String, | json['good_image'] as String, | ||||
@@ -23,6 +24,7 @@ HomeGoodsModel _$HomeGoodsModelFromJson(Map<String, dynamic> json) { | |||||
Map<String, dynamic> _$HomeGoodsModelToJson(HomeGoodsModel instance) => | Map<String, dynamic> _$HomeGoodsModelToJson(HomeGoodsModel instance) => | ||||
<String, dynamic>{ | <String, dynamic>{ | ||||
'provider': instance.provider, | |||||
'provider_name': instance.providerName, | 'provider_name': instance.providerName, | ||||
'good_id': instance.goodId, | 'good_id': instance.goodId, | ||||
'good_image': instance.goodImage, | 'good_image': instance.goodImage, | ||||
@@ -44,10 +44,10 @@ class _HomeSlideBannerContainerState extends State<HomeSlideBannerContainer> { | |||||
/// 子元素点击事件 | /// 子元素点击事件 | ||||
void _itemOnClick(IndexCarousel model) { | void _itemOnClick(IndexCarousel model) { | ||||
print('点击了 $model'); | print('点击了 $model'); | ||||
// RouterUtil.route(model.toJson(), context); | RouterUtil.route(model.toJson(), context); | ||||
Navigator.push(context, MaterialPageRoute( | // Navigator.push(context, MaterialPageRoute( | ||||
builder: (_) => PageFactory.create('goods_details', null) | // builder: (_) => PageFactory.create('goods_details', null) | ||||
)); | // )); | ||||
} | } | ||||
@override | @override | ||||