选择直播商品UI添加历史直播和热门商品

master
laiiihz 5 years ago
parent 93915bdb76
commit c2b96095a7

@ -540,4 +540,7 @@ class LiveAPI {
static const String liveAgree = '/v1/live/live/agree';
static const String recordLive = '/v1/live/live/transcribe';
///
static const String hotGoods = '/v1/live/goods/hot';
}

@ -4,9 +4,9 @@ import 'package:recook/constants/api.dart';
import 'package:recook/constants/header.dart';
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/brand_goods_list_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_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';
import 'package:recook/pages/live/models/goods_window_model.dart';
import 'package:recook/utils/custom_route.dart';
@ -26,17 +26,12 @@ class _LivePickGoodsPageState extends State<LivePickGoodsPage>
with TickerProviderStateMixin {
int _goodsPage = 1;
TabController _tabController;
TabController _parentTabController;
@override
void initState() {
super.initState();
_tabController = TabController(
vsync: this,
length: 2,
);
_parentTabController = TabController(
vsync: this,
length: 2,
length: 3,
);
}
@ -53,14 +48,7 @@ class _LivePickGoodsPageState extends State<LivePickGoodsPage>
appBar: AppBar(
elevation: 0,
backgroundColor: Colors.white,
leading: _parentTabController.index == 0
? RecookBackButton.text()
: RecookBackButton(
onTap: () {
_parentTabController.animateTo(0);
setState(() {});
},
),
leading: RecookBackButton.text(),
leadingWidth: rSize(28 + 30.0),
title: Text(
'选择直播商品',
@ -72,109 +60,103 @@ class _LivePickGoodsPageState extends State<LivePickGoodsPage>
),
centerTitle: true,
),
body: TabBarView(
controller: _parentTabController,
physics: NeverScrollableScrollPhysics(),
children: [
NestedScrollView(
headerSliverBuilder: (context, _) {
return [
SliverToBoxAdapter(
child: CustomImageButton(
padding: EdgeInsets.zero,
onPressed: () {
CRoute.push(context, PickSearchGoodsPage());
},
child: Container(
alignment: Alignment.center,
margin: EdgeInsets.symmetric(horizontal: rSize(15)),
decoration: BoxDecoration(
color: Color(0xFFF5F5F5),
borderRadius: BorderRadius.circular(rSize(15)),
),
height: rSize(30),
child: Row(
children: [
Padding(
padding: EdgeInsets.only(
left: rSize(12),
right: rSize(4),
),
child: Icon(
Icons.search,
color: Color(0xFF999999),
size: rSize(15),
),
),
Text(
'搜索你想要添加的商品',
style: TextStyle(
color: Color(0xFF999999),
fontSize: rSP(13),
),
),
],
),
),
),
),
];
},
body: Column(
children: [
Container(
margin: EdgeInsets.symmetric(
horizontal: rSize(95),
vertical: rSize(15),
),
height: rSize(32),
child: TabBar(
controller: _tabController,
tabs: [
Tab(text: '商品橱窗'),
Tab(text: '品牌'),
],
labelStyle: TextStyle(
fontSize: rSP(13),
fontWeight: FontWeight.bold,
),
labelColor: Color(0xFF333333),
unselectedLabelColor: Color(0xFF333333).withOpacity(0.3),
indicatorSize: TabBarIndicatorSize.label,
indicator: RecookIndicator(
borderSide: BorderSide(
width: rSize(3),
color: Color(0xFFDB2D2D),
)),
body: NestedScrollView(
headerSliverBuilder: (context, _) {
return [
SliverToBoxAdapter(
child: CustomImageButton(
padding: EdgeInsets.zero,
onPressed: () {
CRoute.push(context, PickSearchGoodsPage());
},
child: Container(
alignment: Alignment.center,
margin: EdgeInsets.symmetric(horizontal: rSize(15)),
decoration: BoxDecoration(
color: Color(0xFFF5F5F5),
borderRadius: BorderRadius.circular(rSize(15)),
),
),
Expanded(
child: TabBarView(
controller: _tabController,
height: rSize(30),
child: Row(
children: [
GoodsWindowView(
onPick: () {
setState(() {});
},
Padding(
padding: EdgeInsets.only(
left: rSize(12),
right: rSize(4),
),
child: Icon(
Icons.search,
color: Color(0xFF999999),
size: rSize(15),
),
),
BrandGoodsView(
controller: _parentTabController,
onTapBrand: () {
setState(() {});
},
Text(
'搜索你想要添加的商品',
style: TextStyle(
color: Color(0xFF999999),
fontSize: rSP(13),
),
),
],
),
),
],
),
),
),
BrandGoodsListView(
onPick: () {
setState(() {});
},
),
],
];
},
body: Column(
children: [
Container(
margin: EdgeInsets.symmetric(
vertical: rSize(15),
),
height: rSize(32),
child: TabBar(
controller: _tabController,
isScrollable: true,
tabs: [
Tab(text: '历史直播'),
Tab(text: '热门商品'),
Tab(text: '全部商品'),
],
labelStyle: TextStyle(
fontSize: rSP(13),
fontWeight: FontWeight.bold,
),
labelColor: Color(0xFF333333),
unselectedLabelColor: Color(0xFF333333).withOpacity(0.3),
indicatorSize: TabBarIndicatorSize.label,
indicator: RecookIndicator(
borderSide: BorderSide(
width: rSize(3),
color: Color(0xFFDB2D2D),
)),
),
),
Expanded(
child: TabBarView(
controller: _tabController,
children: [
GoodsWindowView(
onPick: () {
setState(() {});
},
),
HotGoodsView(
onPick: () {
setState(() {});
},
),
BrandGoodsView(
onTapBrand: () {
setState(() {});
},
),
],
),
),
],
),
),
bottomNavigationBar: BottomAppBar(
color: Colors.white,

@ -8,10 +8,8 @@ import 'package:recook/pages/live/models/live_brand_model.dart';
import 'package:recook/widgets/refresh_widget.dart';
class BrandGoodsView extends StatefulWidget {
final TabController controller;
final VoidCallback onTapBrand;
BrandGoodsView({Key key, @required this.controller, this.onTapBrand})
: super(key: key);
BrandGoodsView({Key key, this.onTapBrand}) : super(key: key);
@override
_BrandGoodsViewState createState() => _BrandGoodsViewState();
@ -66,7 +64,6 @@ class _BrandGoodsViewState extends State<BrandGoodsView>
return MaterialButton(
padding: EdgeInsets.zero,
onPressed: () {
widget.controller.animateTo(1);
PickCart.brandModel = model;
widget.onTapBrand();
},

@ -1,8 +1,11 @@
import 'package:flutter/material.dart';
import 'package:recook/constants/api.dart';
import 'package:recook/constants/constants.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 GoodsWindowView extends StatefulWidget {
@ -18,51 +21,100 @@ class _GoodsWindowViewState extends State<GoodsWindowView>
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();
if (mounted) _controller.requestRefresh();
});
}
@override
Widget build(BuildContext context) {
super.build(context);
return RefreshWidget(
controller: _controller,
onRefresh: () {
_page = 1;
getGoodsWindowModels().then((models) {
setState(() {
_goodsModels = models;
});
_controller.refreshCompleted();
});
},
onLoadMore: () {
_page++;
getGoodsWindowModels().then((models) {
setState(() {
_goodsModels.addAll(models);
});
_controller.loadComplete();
});
},
body: ListView.builder(
itemBuilder: (context, index) {
final model = _goodsModels[index];
return LiveGoodsCard(
onPick: () {
setState(() {
widget.onPick();
return Column(
children: [
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();
});
},
model: model,
);
},
itemCount: _goodsModels.length,
),
body: ListView.builder(
itemBuilder: (context, index) {
final model = _goodsModels[index];
return LiveGoodsCard(
onPick: () {
setState(() {
widget.onPick();
});
},
model: model,
);
},
itemCount: _goodsModels.length,
),
),
),
],
);
}
@ -72,7 +124,7 @@ class _GoodsWindowViewState extends State<GoodsWindowView>
'limit': 15,
});
if (resultData?.data['data']['list'] == null)
return null;
return [];
else
return (resultData.data['data']['list'] as List)
.map((e) => GoodsList.fromJson(e))

@ -0,0 +1,136 @@
import 'package:flutter/material.dart';
import 'package:recook/constants/api.dart';
import 'package:recook/constants/constants.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 HotGoodsView extends StatefulWidget {
final VoidCallback onPick;
HotGoodsView({Key key, this.onPick}) : super(key: key);
@override
_HotGoodsViewState createState() => _HotGoodsViewState();
}
class _HotGoodsViewState extends State<HotGoodsView>
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: [
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: 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.hotGoods, {
'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;
}

@ -88,23 +88,6 @@ class _LiveGoodsCardState extends State<LiveGoodsCard> {
Row(
children: [
InkWell(
onTap: () {
PickCart.brandModel = LiveBrandModel(
id: widget.model.brandId,
name: widget.model.brandName,
logoUrl: widget.model.brandImg,
);
CRoute.push(
context,
RecookScaffold(
title: '品牌馆',
whiteBg: true,
body: BrandGoodsListView(
onPick: () {},
),
),
);
},
child: Row(
children: [
FadeInImage.assetNetwork(

Loading…
Cancel
Save