From 50a62a59d6f7185bb51c155ca1729bcbf55ac751 Mon Sep 17 00:00:00 2001 From: laiiihz Date: Wed, 14 Oct 2020 15:20:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E6=8E=A5=E8=A7=86=E9=A2=91=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/constants/api.dart | 3 + .../models/activity_video_list_model.dart | 40 ++++++++++ .../user_home/user_playback_view.dart | 62 +++++++++++++-- lib/pages/live/sub_page/user_home_page.dart | 3 +- .../live/widget/user_live_playback_card.dart | 76 ++++++++++++++----- 5 files changed, 155 insertions(+), 29 deletions(-) create mode 100644 lib/pages/live/models/activity_video_list_model.dart diff --git a/lib/constants/api.dart b/lib/constants/api.dart index f92aa7e..cdc82dc 100644 --- a/lib/constants/api.dart +++ b/lib/constants/api.dart @@ -496,4 +496,7 @@ class LiveAPI { ///直播单场详细数据 static const String liveDataDetail = '/v1/live/live/data/info'; + + ///获取动态中直播的列表 + static const String activityVideoList = '/v1/live/user/live/list'; } diff --git a/lib/pages/live/models/activity_video_list_model.dart b/lib/pages/live/models/activity_video_list_model.dart new file mode 100644 index 0000000..3f3e000 --- /dev/null +++ b/lib/pages/live/models/activity_video_list_model.dart @@ -0,0 +1,40 @@ +class ActivityVideoListModel { + int id; + int goodsCount; + String cover; + int look; + String title; + int isLive; + int startAt; + + ActivityVideoListModel( + {this.id, + this.goodsCount, + this.cover, + this.look, + this.title, + this.isLive, + this.startAt}); + + ActivityVideoListModel.fromJson(Map json) { + id = json['id']; + goodsCount = json['goodsCount']; + cover = json['cover']; + look = json['look']; + title = json['title']; + isLive = json['isLive']; + startAt = json['startAt']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['goodsCount'] = this.goodsCount; + data['cover'] = this.cover; + data['look'] = this.look; + data['title'] = this.title; + data['isLive'] = this.isLive; + data['startAt'] = this.startAt; + return data; + } +} diff --git a/lib/pages/live/sub_page/user_home/user_playback_view.dart b/lib/pages/live/sub_page/user_home/user_playback_view.dart index eebd56a..8703921 100644 --- a/lib/pages/live/sub_page/user_home/user_playback_view.dart +++ b/lib/pages/live/sub_page/user_home/user_playback_view.dart @@ -1,16 +1,30 @@ import 'package:flutter/material.dart'; +import 'package:recook/constants/api.dart'; +import 'package:recook/manager/http_manager.dart'; +import 'package:recook/pages/live/models/activity_video_list_model.dart'; import 'package:recook/pages/live/widget/user_live_playback_card.dart'; import 'package:recook/widgets/refresh_widget.dart'; class UserPlaybackView extends StatefulWidget { - UserPlaybackView({Key key}) : super(key: key); + final int userId; + UserPlaybackView({Key key, @required this.userId}) : super(key: key); @override _UserPlaybackViewState createState() => _UserPlaybackViewState(); } -class _UserPlaybackViewState extends State { +class _UserPlaybackViewState extends State + with AutomaticKeepAliveClientMixin { GSRefreshController _controller = GSRefreshController(); + int _page = 1; + List _videoModels = []; + @override + void initState() { + super.initState(); + Future.delayed(Duration(milliseconds: 300), () { + if (mounted) _controller.requestRefresh(); + }); + } @override void dispose() { @@ -20,14 +34,50 @@ class _UserPlaybackViewState extends State { @override Widget build(BuildContext context) { + super.build(context); return RefreshWidget( controller: _controller, onRefresh: () { - _controller.refreshCompleted(); + _page = 1; + getActivityVideoList().then((models) { + setState(() { + _videoModels = models; + }); + _controller.refreshCompleted(); + }); }, - body: ListView.builder(itemBuilder: (context, index) { - return UserPlaybackCard(); - }), + onLoadMore: () { + _page++; + getActivityVideoList().then((models) { + setState(() { + _videoModels.addAll(models) ; + }); + _controller.loadComplete(); + }); + }, + body: ListView.builder( + itemBuilder: (context, index) { + return UserPlaybackCard(model:_videoModels[index]); + }, + itemCount: _videoModels.length, + ), ); } + + Future> getActivityVideoList() async { + ResultData resultData = await HttpManager.post(LiveAPI.activityVideoList, { + 'userId': widget.userId, + 'limit': 10, + 'page': _page, + }); + if (resultData?.data['data']['lists'] == null) + return []; + else + return (resultData?.data['data']['lists'] as List) + .map((e) => ActivityVideoListModel.fromJson(e)) + .toList(); + } + + @override + bool get wantKeepAlive => true; } diff --git a/lib/pages/live/sub_page/user_home_page.dart b/lib/pages/live/sub_page/user_home_page.dart index f4767fc..e326934 100644 --- a/lib/pages/live/sub_page/user_home_page.dart +++ b/lib/pages/live/sub_page/user_home_page.dart @@ -202,8 +202,7 @@ class _UserHomePageState extends State userModel: model, initAttention: selfFlag ? true : widget.initAttention, ), - UserPlaybackView(), - + UserPlaybackView(userId: widget.userId), ], ), ), diff --git a/lib/pages/live/widget/user_live_playback_card.dart b/lib/pages/live/widget/user_live_playback_card.dart index 8604cde..8dea055 100644 --- a/lib/pages/live/widget/user_live_playback_card.dart +++ b/lib/pages/live/widget/user_live_playback_card.dart @@ -1,9 +1,17 @@ import 'package:flutter/material.dart'; +import 'package:recook/constants/api.dart'; import 'package:recook/constants/header.dart'; +import 'package:recook/pages/live/live_stream/live_playback_view_page.dart'; +import 'package:recook/pages/live/live_stream/live_stream_view_page.dart'; +import 'package:recook/pages/live/models/activity_video_list_model.dart'; import 'package:recook/pages/live/widget/user_base_card.dart'; +import 'package:recook/utils/custom_route.dart'; +import 'package:recook/utils/date/recook_date_util.dart'; +import 'package:recook/widgets/custom_image_button.dart'; class UserPlaybackCard extends StatefulWidget { - UserPlaybackCard({Key key}) : super(key: key); + final ActivityVideoListModel model; + UserPlaybackCard({Key key, @required this.model}) : super(key: key); @override _UserPlaybackCardState createState() => _UserPlaybackCardState(); @@ -12,8 +20,10 @@ class UserPlaybackCard extends StatefulWidget { class _UserPlaybackCardState extends State { @override Widget build(BuildContext context) { + final RecookDateUtil dateUtil = + RecookDateUtil.fromMillsecond(widget.model.startAt * 1000); return UserBaseCard( - date: '今天', + date: dateUtil.prefixDay, detailDate: '14:30', children: [ SizedBox(height: rSize(35)), @@ -29,10 +39,12 @@ class _UserPlaybackCardState extends State { child: Row( mainAxisSize: MainAxisSize.min, children: [ - Image.asset(R.ASSETS_LIVE_ON_STREAM_PNG), + Image.asset(widget.model.isLive == 1 + ? R.ASSETS_LIVE_ON_STREAM_PNG + : R.ASSETS_LIVE_STREAM_PLAY_BACK_PNG), SizedBox(width: rSize(5)), Text( - '正在直播中', + widget.model.isLive == 1 ? '正在直播中' : '回放', style: TextStyle( fontSize: rSP(12), height: 1, @@ -46,7 +58,7 @@ class _UserPlaybackCardState extends State { Padding( padding: EdgeInsets.symmetric(vertical: rSize(5)), child: Text( - '一波清仓大福利来袭,请速速收下', + widget.model.title, style: TextStyle( color: Color(0xFF333333), fontSize: rSP(16), @@ -55,7 +67,7 @@ class _UserPlaybackCardState extends State { ), ), Text( - '999人观看 | 24个宝贝', + '${widget.model.look}人观看 | ${widget.model.goodsCount}个宝贝', style: TextStyle( color: Color(0xFF999999), fontSize: rSP(12), @@ -64,23 +76,45 @@ class _UserPlaybackCardState extends State { SizedBox( height: rSize(15), ), - Row( - children: [ - Container( - alignment: Alignment.center, - child: Image.asset( - R.ASSETS_LIVE_VIDEO_PLAY_PNG, - height: rSize(34), - width: rSize(34), + ClipRRect( + borderRadius: BorderRadius.circular(rSize(4)), + child: Stack( + alignment: Alignment.center, + children: [ + FadeInImage.assetNetwork( + placeholder: R.ASSETS_PLACEHOLDER_NEW_1X1_A_PNG, + image: Api.getImgUrl(widget.model.cover), ), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(rSize(4)), - color: Colors.blue, + Positioned( + left: 0, + right: 0, + top: 0, + bottom: 0, + child: Material( + color: Colors.black.withOpacity(0.35), + child: InkWell( + child: Center( + child: Image.asset( + R.ASSETS_LIVE_VIDEO_PLAY_PNG, + height: rSize(34), + width: rSize(34), + ), + ), + onTap: () { + if (widget.model.isLive == 1) + CRoute.push( + context, + LiveStreamViewPage(id: widget.model.id), + ); + else + CRoute.push( + context, LivePlaybackViewPage(id: widget.model.id)); + }, + ), + ), ), - height: rSize(234), - width: rSize(234), - ) - ], + ], + ), ), ], );