添加直播车

首页双11标签
添加添加到直播车 按钮
master
laiiihz 5 years ago
parent effe68b938
commit 12e8ff6bdf

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

@ -543,4 +543,13 @@ class LiveAPI {
///
static const String hotGoods = '/v1/live/goods/hot';
///
static const String cartList = '/v1/live/car/list';
///
static const String addToCart = '/v1/live/car/add';
///
static const String removeFromCart = '/v1/live/car/delete';
}

@ -596,7 +596,7 @@ class _HomePageState extends BaseStoreState<HomePage>
padding: EdgeInsets.only(bottom: 5),
color: AppColor.frenchColor,
child: GoodsItemWidget.rowGoods(
isSingleDayGoods: index < 5,
isSingleDayGoods: true,
onBrandClick: () {
AppRouter.push(context, RouteName.BRANDGOODS_LIST_PAGE,
arguments: BrandGoodsListPage.setArguments(

@ -1,4 +1,5 @@
import 'package:common_utils/common_utils.dart';
import 'package:extended_text/extended_text.dart';
import 'package:flutter/material.dart';
import 'package:oktoast/oktoast.dart';
import 'package:recook/constants/api.dart';
@ -83,16 +84,21 @@ class _ActivityPreviewPageState extends State<ActivityPreviewPage> {
rHBox(11),
ClipRRect(
borderRadius: BorderRadius.circular(rSize(4)),
child: Material(
color: AppColor.frenchColor,
child: FadeInImage.assetNetwork(
placeholder: R.ASSETS_PLACEHOLDER_NEW_1X1_A_PNG,
image: Api.getImgUrl(
widget.model.goods.mainPhotoURL,
child: Column(
children: [
Material(
color: AppColor.frenchColor,
child: FadeInImage.assetNetwork(
placeholder:
R.ASSETS_PLACEHOLDER_NEW_1X1_A_PNG,
image: Api.getImgUrl(
widget.model.goods.mainPhotoURL,
),
width: rSize(100),
height: rSize(100),
),
),
width: rSize(100),
height: rSize(100),
),
],
),
),
rHBox(3),
@ -135,100 +141,98 @@ class _ActivityPreviewPageState extends State<ActivityPreviewPage> {
// rWBox(22),
rWBox(15),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
InkWell(
onTap: () {
CRoute.push(
context,
TopicPage(
topicId: widget.model.topicId,
initAttention: false));
},
child: TextUtil.isEmpty(widget.model.topicName)
? SizedBox()
: Text(
'#${widget.model.topicName}',
style: TextStyle(
color: Color(0xFFEB8A49),
fontSize: rSP(14),
),
),
),
rHBox(4),
Text(
widget.model.content,
style: TextStyle(
color: Color(0xFFE4E4E4),
fontSize: rSP(14),
child: ExtendedText.rich(
TextSpan(
children: [
TextSpan(
text: widget.model.content,
style: TextStyle(
color: Color(0xFFE4E4E4),
fontSize: rSP(14),
),
),
),
rHBox(15),
Row(
children: [
Spacer(),
CustomImageButton(
onPressed: () {
if (UserManager.instance.haveLogin)
showGeneralDialog(
context: context,
barrierDismissible: true,
barrierColor:
Colors.black.withOpacity(0.55),
barrierLabel: '',
transitionBuilder: (context, animation,
secondaryAnimation, child) {
final value = Curves.easeInOutCubic
.transform(animation.value);
return Transform.translate(
offset: Offset(0, (1 - value) * 400),
child: child,
);
},
transitionDuration:
Duration(milliseconds: 300),
pageBuilder: (BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation) {
return ReviewChildCards(
trendId: widget.model.id);
},
);
else {
showToast('未登陆,请先登陆');
CRoute.push(context, UserPage());
}
ExtendedWidgetSpan(
child: InkWell(
onTap: () {
CRoute.push(
context,
TopicPage(
topicId: widget.model.topicId,
initAttention: false));
},
child: Image.asset(
R.ASSETS_LIVE_VIDEO_COMMENT_PNG,
height: rSize(20),
width: rSize(20),
),
child: TextUtil.isEmpty(widget.model.topicName)
? SizedBox()
: Text(
'#${widget.model.topicName}',
style: TextStyle(
color: Color(0xFFEB8A49),
fontSize: rSP(14),
),
),
),
rWBox(22),
RecookLikeButton(
initValue: widget.model.isPraise == 1,
likePath: R.ASSETS_LIVE_VIDEO_LIKE_PNG,
size: rSize(20),
onChange: (oldState) {
if (UserManager.instance.haveLogin)
HttpManager.post(
oldState
? LiveAPI.dislikeActivity
: LiveAPI.likeActivity,
{'trendId': widget.model.id},
);
else {
showToast('未登陆,请先登陆');
CRoute.push(context, UserPage());
}
),
],
),
),
),
Column(
children: [
CustomImageButton(
onPressed: () {
if (UserManager.instance.haveLogin)
showGeneralDialog(
context: context,
barrierDismissible: true,
barrierColor: Colors.black.withOpacity(0.55),
barrierLabel: '',
transitionBuilder: (context, animation,
secondaryAnimation, child) {
final value = Curves.easeInOutCubic
.transform(animation.value);
return Transform.translate(
offset: Offset(0, (1 - value) * 400),
child: child,
);
},
),
],
transitionDuration: Duration(milliseconds: 300),
pageBuilder: (BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation) {
return ReviewChildCards(
trendId: widget.model.id);
},
);
else {
showToast('未登陆,请先登陆');
CRoute.push(context, UserPage());
}
},
child: Image.asset(
R.ASSETS_LIVE_VIDEO_COMMENT_PNG,
height: rSize(20),
width: rSize(20),
),
],
),
),
rHBox(22),
RecookLikeButton(
initValue: widget.model.isPraise == 1,
likePath: R.ASSETS_LIVE_VIDEO_LIKE_PNG,
size: rSize(20),
onChange: (oldState) {
if (UserManager.instance.haveLogin)
HttpManager.post(
oldState
? LiveAPI.dislikeActivity
: LiveAPI.likeActivity,
{'trendId': widget.model.id},
);
else {
showToast('未登陆,请先登陆');
CRoute.push(context, UserPage());
}
},
),
],
),
],
),

@ -6,6 +6,7 @@ import 'package:recook/manager/http_manager.dart';
import 'package:recook/pages/live/live_stream/pick_search_goods_page.dart';
import 'package:recook/pages/live/live_stream/pick_view/all_goods_view.dart';
import 'package:recook/pages/live/live_stream/pick_view/brand_goods_view.dart';
import 'package:recook/pages/live/live_stream/pick_view/goods_cart_view.dart';
import 'package:recook/pages/live/live_stream/pick_view/goods_window_view.dart';
import 'package:recook/pages/live/live_stream/pick_view/hot_goods_view.dart';
import 'package:recook/pages/live/live_stream/pick_view/pick_cart.dart';
@ -32,7 +33,7 @@ class _LivePickGoodsPageState extends State<LivePickGoodsPage>
super.initState();
_tabController = TabController(
vsync: this,
length: 3,
length: 4,
);
}
@ -117,6 +118,7 @@ class _LivePickGoodsPageState extends State<LivePickGoodsPage>
controller: _tabController,
isScrollable: true,
tabs: [
Tab(text: '直播车'),
Tab(text: '热门商品'),
Tab(text: '历史直播'),
Tab(text: '全部商品'),
@ -139,6 +141,11 @@ class _LivePickGoodsPageState extends State<LivePickGoodsPage>
child: TabBarView(
controller: _tabController,
children: [
GoodsCartView(
onPick: () {
setState(() {});
},
),
HotGoodsView(
onPick: () {
setState(() {});

@ -0,0 +1,156 @@
import 'package:flutter/material.dart';
import 'package:recook/constants/api.dart';
import 'package:recook/constants/constants.dart';
import 'package:recook/constants/header.dart';
import 'package:recook/manager/http_manager.dart';
import 'package:recook/pages/live/live_stream/pick_view/live_goods_card.dart';
import 'package:recook/pages/live/live_stream/pick_view/pick_cart.dart';
import 'package:recook/pages/live/models/goods_window_model.dart';
import 'package:recook/pages/user/widget/recook_check_box.dart';
import 'package:recook/widgets/refresh_widget.dart';
class GoodsCartView extends StatefulWidget {
final VoidCallback onPick;
GoodsCartView({Key key, this.onPick}) : super(key: key);
@override
_GoodsCartViewState createState() => _GoodsCartViewState();
}
class _GoodsCartViewState extends State<GoodsCartView>
with AutomaticKeepAliveClientMixin {
GSRefreshController _controller = GSRefreshController();
List<GoodsList> _goodsModels = [];
int _page = 1;
bool get _selectAll {
for (var item in _goodsModels) {
if (PickCart.picked.indexWhere((element) => element.id == item.id) ==
-1) {
return false;
}
}
return true;
}
@override
void initState() {
super.initState();
Future.delayed(Duration(milliseconds: 300), () {
if (mounted) _controller.requestRefresh();
});
}
@override
Widget build(BuildContext context) {
super.build(context);
return Column(
children: [
_goodsModels.isEmpty
? SizedBox()
: MaterialButton(
onPressed: () {
if (_selectAll) {
PickCart.picked.removeWhere((picked) {
return _goodsModels.indexWhere(
(element) => element.id == picked.id) !=
-1;
});
} else
_goodsModels.forEach((element) {
if (PickCart.picked.length < 50) {
PickCart.picked.add(element);
}
});
widget.onPick();
},
child: Row(
children: [
RecookCheckBox(state: _selectAll),
rWBox(10),
Text(
'全选',
style: TextStyle(
color: Color(0xFF333333),
fontSize: rSP(14),
),
),
],
),
),
Expanded(
child: RefreshWidget(
controller: _controller,
onRefresh: () {
_page = 1;
getGoodsWindowModels().then((models) {
setState(() {
_goodsModels = models;
});
_controller.refreshCompleted();
});
},
onLoadMore: () {
_page++;
getGoodsWindowModels().then((models) {
setState(() {
_goodsModels.addAll(models);
});
if (models.isEmpty)
_controller.loadNoData();
else
_controller.loadComplete();
});
},
body: _goodsModels.isEmpty
? Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Image.asset(R.ASSETS_IMG_NO_DATA_PNG),
rHBox(10),
Text(
'您没有历史记录',
style: TextStyle(
color: Color(0xFF333333),
fontSize: rSP(16),
),
),
],
),
)
: ListView.builder(
itemBuilder: (context, index) {
final model = _goodsModels[index];
return LiveGoodsCard(
onPick: () {
setState(() {
widget.onPick();
});
},
model: model,
);
},
itemCount: _goodsModels.length,
),
),
),
],
);
}
Future<List<GoodsList>> getGoodsWindowModels() async {
ResultData resultData = await HttpManager.post(LiveAPI.cartList, {
'page': _page,
'limit': 15,
});
if (resultData?.data['data']['list'] == null)
return [];
else
return (resultData.data['data']['list'] as List)
.map((e) => GoodsList.fromJson(e))
.toList();
}
@override
bool get wantKeepAlive => true;
}

@ -0,0 +1,418 @@
import 'package:extended_image/extended_image.dart';
import 'package:flutter/material.dart';
import 'package:oktoast/oktoast.dart';
import 'package:recook/constants/api.dart';
import 'package:recook/constants/header.dart';
import 'package:recook/manager/http_manager.dart';
import 'package:recook/pages/goods/small_coupon_widget.dart';
import 'package:recook/pages/home/classify/commodity_detail_page.dart';
import 'package:recook/pages/live/models/goods_window_model.dart';
import 'package:recook/pages/user/widget/recook_check_box.dart';
import 'package:recook/widgets/recook/recook_scaffold.dart';
import 'package:recook/widgets/refresh_widget.dart';
class LiveGoodsCartPage extends StatefulWidget {
LiveGoodsCartPage({Key key}) : super(key: key);
@override
_LiveGoodsCartPageState createState() => _LiveGoodsCartPageState();
}
class _LiveGoodsCartPageState extends State<LiveGoodsCartPage> {
List<GoodsWindowModel> models = [];
List<GoodsList> displayModels = [];
List<num> _selectedIds = [];
int page = 1;
bool _isManager = false;
bool _selectAll = false;
GSRefreshController _controller = GSRefreshController();
@override
void initState() {
super.initState();
Future.delayed(Duration(milliseconds: 300), () {
if (mounted) _controller.requestRefresh();
});
}
@override
void dispose() {
_controller?.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return RecookScaffold(
whiteBg: true,
title: '商品橱窗',
body: Column(
children: [
Material(
child: Row(
children: [
rWBox(15),
Text(
'${models.isEmpty ? 0 : models[0].total}个宝贝',
style: TextStyle(
color: Color(0xFF666666),
fontSize: rSP(14),
),
),
Spacer(),
FlatButton(
onPressed: () {
setState(() {
if (_isManager) {
_selectAll = false;
_selectedIds.clear();
}
_isManager = !_isManager;
});
},
padding: EdgeInsets.symmetric(horizontal: rSP(15)),
splashColor: Colors.black26,
child: Text(
_isManager ? '完成' : '管理',
style: TextStyle(
color: Color(0xFF666666),
fontSize: rSP(14),
),
),
),
],
),
),
_isManager
? FlatButton(
padding: EdgeInsets.symmetric(horizontal: rSize(15)),
onPressed: _selectAll
? () {
_selectAll = false;
_selectedIds.clear();
setState(() {});
}
: () {
_selectAll = true;
_selectedIds =
displayModels.map((e) => e.id).toList();
setState(() {});
},
splashColor: Colors.black26,
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
RecookCheckBox(state: _selectAll),
rWBox(10),
Text(
'全选',
style: TextStyle(
color: Color(0xFF666666),
fontSize: rSP(14),
),
),
],
),
)
: SizedBox(),
Expanded(
child: RefreshWidget(
controller: _controller,
onRefresh: () {
page = 1;
getGoodsWindowModels().then((model) {
setState(() {
models = [model];
displayModels = model.list;
});
_controller.refreshCompleted();
}).catchError((_) {
_controller.refreshFailed();
});
},
onLoadMore: () {
page++;
getGoodsWindowModels().then((model) {
setState(() {
models.add(model);
displayModels.addAll(model.list);
});
if (model.list.isEmpty)
_controller.loadNoData();
else
_controller.loadComplete();
}).catchError((_) {
_controller.loadFailed();
});
},
body: ListView.builder(
itemBuilder: (context, index) {
final model = displayModels[index];
return _buildGoodsCard(model);
},
itemCount: displayModels.length,
),
),
),
_isManager
? SafeArea(
bottom: true,
top: false,
child: Row(
children: [
rWBox(15),
Text(
'已选择${_selectedIds.length}/${models.isEmpty ? 0 : models[0].total}',
style: TextStyle(
color: Color(0xFF333333),
fontSize: rSP(14),
),
),
Spacer(),
FlatButton(
splashColor: Colors.black26,
padding: EdgeInsets.symmetric(horizontal: rSize(15)),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Image.asset(
R.ASSETS_LOTTERY_REDEEM_LOTTERY_DELETE_PNG,
height: rSP(16),
width: rSP(16),
),
rWBox(4),
Text(
'删除',
style: TextStyle(
color: Color(0xFFDB2D2D),
fontSize: rSP(14),
),
),
],
),
onPressed: () {
HttpManager.post(LiveAPI.removeFromCart, {
"ids": _selectedIds.map((e) => e.toInt()).toList(),
}).then((resultData) {
_selectedIds.clear();
_selectAll = false;
showToast(resultData.data['msg']);
_controller.requestRefresh();
setState(() {});
});
},
),
],
),
)
: SizedBox(),
],
),
);
}
_buildGoodsCard(GoodsList model) {
return Container(
padding: EdgeInsets.symmetric(vertical: rSize(15 / 2)),
height: rSize(120 + 15.0),
child: FlatButton(
splashColor: Colors.black26,
onPressed: _isManager
? () {
_selectAll = false;
if (_selectedIds.contains(model.id)) {
_selectedIds.remove(model.id);
} else {
_selectedIds.add(model.id);
}
setState(() {});
}
: () {
AppRouter.push(
context,
RouteName.COMMODITY_PAGE,
arguments: CommodityDetailPage.setArguments(model.id),
);
},
child: Row(
children: [
_isManager
? RecookCheckBox(state: _selectedIds.contains(model.id))
: SizedBox(),
_isManager ? rWBox(10) : SizedBox(),
Container(
color: AppColor.frenchColor,
child: FadeInImage.assetNetwork(
placeholder: R.ASSETS_PLACEHOLDER_NEW_1X1_A_PNG,
image: Api.getImgUrl(model.mainPhotoUrl),
height: rSize(120),
width: rSize(120),
),
),
rWBox(10),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
model.goodsName,
maxLines: 2,
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontWeight: FontWeight.bold,
color: Color(0xFF333333),
fontSize: rSP(14),
),
),
Container(
width: double.infinity,
height: 25,
color: Colors.white,
child: Row(
children: <Widget>[
Container(
width: 13 * 1.5,
height: 13 * 1.5,
child: TextUtils.isEmpty(model.brandImg)
? SizedBox()
: ExtendedImage.network(
Api.getImgUrl(model.brandImg),
fit: BoxFit.fill,
),
),
SizedBox(
width: 4,
),
Text(
TextUtils.isEmpty(model.brandName)
? ""
: model.brandName,
style: TextStyle(
color: Color(0xffc70404),
fontSize: ScreenAdapterUtils.setSp(12),
),
),
],
),
),
Container(
child: Stack(
children: <Widget>[
Row(
children: <Widget>[
(model.coupon != null && model.coupon != '0')
? Container(
margin: EdgeInsets.only(right: 5),
child: SmallCouponWidget(
height: 18,
number: num.parse(model.coupon),
),
)
: SizedBox(),
AppConfig.commissionByRoleLevel
? Container(
child: Stack(
alignment: Alignment.center,
children: <Widget>[
Container(
margin:
EdgeInsets.symmetric(vertical: 2),
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius:
BorderRadius.circular(2),
border: Border.all(
color: Color(0xffec294d),
width: 0.5,
)),
padding: EdgeInsets.symmetric(
horizontal: 3),
child: Text(
"" + model.commission,
style: TextStyle(
color: Colors.white.withAlpha(0),
fontSize:
ScreenAdapterUtils.setSp(12),
),
),
),
AppConfig.getShowCommission()
? Container(
alignment: Alignment.center,
child: Text(
"" + model.commission,
style: TextStyle(
color: Color(0xffeb0045),
fontSize: ScreenAdapterUtils
.setSp(12),
),
),
)
: SizedBox(),
],
),
)
: SizedBox(),
Spacer(),
],
),
Positioned(
right: 0,
bottom: 0,
top: 0,
child: Text(
"已售${model.salesVolume}",
style: TextStyle(
color: Color(0xff595757),
fontSize: ScreenAdapterUtils.setSp(12),
),
),
),
],
),
),
Spacer(),
Row(
children: [
Text(
'¥${model.originalPrice}',
style: TextStyle(
color: Color(0xFF333333),
fontSize: rSP(14),
),
),
AppConfig.getShowCommission()
? model.commission == '0'
? SizedBox()
: Text(
'/赚${model.commission}',
style: TextStyle(
color: Color(0xFFC92219),
fontSize: rSP(14),
),
)
: SizedBox(),
],
),
],
),
),
],
),
),
);
}
Future<GoodsWindowModel> getGoodsWindowModels() async {
ResultData resultData = await HttpManager.post(LiveAPI.cartList, {
'page': page,
'limit': 15,
});
if (resultData?.data['data'] == null)
return null;
else
return GoodsWindowModel.fromJson(resultData.data['data']);
}
}

@ -8,6 +8,7 @@ import 'package:recook/pages/live/live_stream/live_page.dart';
import 'package:recook/pages/live/models/live_base_info_model.dart';
import 'package:recook/pages/live/models/live_time_data_model.dart';
import 'package:recook/pages/live/pages/goods_window_page.dart';
import 'package:recook/pages/live/pages/live_goods_cart_page.dart';
import 'package:recook/pages/live/sub_page/data_manager_page.dart';
import 'package:recook/pages/live/sub_page/user_home/user_playback_view.dart';
import 'package:recook/utils/custom_route.dart';
@ -208,6 +209,17 @@ class _LiveHostCenterPageState extends State<LiveHostCenterPage>
CRoute.push(context, GoodsWindowPage());
},
),
_buildListTile(
title: '直播车',
leading: Image.asset(
R.ASSETS_LIVE_LIVE_CART_PNG,
width: rSize(20),
height: rSize(20),
),
onTap: () {
CRoute.push(context, LiveGoodsCartPage());
},
),
],
),
);

@ -1,10 +1,12 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:fluwx/fluwx.dart';
import 'package:oktoast/oktoast.dart';
import 'package:recook/constants/api.dart';
import 'package:recook/constants/app_image_resources.dart';
import 'package:recook/constants/constants.dart';
import 'package:recook/constants/header.dart';
import 'package:recook/manager/http_manager.dart';
import 'package:recook/manager/user_manager.dart';
import 'package:recook/third_party/wechat/wechat_utils.dart';
import 'package:recook/widgets/bottom_sheet/bottom_share_dialog.dart';
@ -262,17 +264,34 @@ class ShareTool {
arguments: ShareGoodsPosterPage.setArguments(goodsId: goodsId));
});
});
PlatformItem addToLiveGoodsCart = PlatformItem(
'加到直播车',
Image.asset(
R.ASSETS_LIVE_LIVE_CART_PNG,
width: 36,
height: 36,
),
itemClick: () {
HttpManager.post(LiveAPI.addToCart, {
'goodsIds': [int.parse(goodsId)],
}).then((result) {
showToast(result.data['msg']);
});
Navigator.pop(context);
},
);
List<PlatformItem> itemList = [
// miniItem,
wechatItem,
// weiboItem,
// qqItem,
copyurl,
qrcode
qrcode,
];
if (ShareTool.qqInstalled) {
itemList.add(qqItem);
}
itemList.add(addToLiveGoodsCart);
// if (ShareTool.weiboInstalled){
// itemList.add(weiboItem);
// }

Loading…
Cancel
Save