From 0c8662ae5d55a8100b81ec2359166931aa67d6ea Mon Sep 17 00:00:00 2001 From: laiiihz Date: Sat, 17 Oct 2020 15:33:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9F=A5=E7=9C=8B=E7=9B=B4?= =?UTF-8?q?=E6=92=AD=E9=97=B4=E7=94=A8=E6=88=B7=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/constants/api.dart | 3 + lib/pages/live/live_stream/live_page.dart | 28 +++++ .../live_stream/live_stream_view_page.dart | 29 ++++- .../live/live_stream/live_users_view.dart | 118 ++++++++++++++++++ lib/pages/live/widget/more_people.dart | 44 ++++--- 5 files changed, 201 insertions(+), 21 deletions(-) create mode 100644 lib/pages/live/live_stream/live_users_view.dart diff --git a/lib/constants/api.dart b/lib/constants/api.dart index 65fe5fe..86b5ddc 100644 --- a/lib/constants/api.dart +++ b/lib/constants/api.dart @@ -517,4 +517,7 @@ class LiveAPI { ///购买通知 static const String buyGoodsInform = '/v1/live/live/im/buy_goods'; + + ///获取直播间用户 + static const String getLiveUsers = '/v1/live/live/user_data'; } diff --git a/lib/pages/live/live_stream/live_page.dart b/lib/pages/live/live_stream/live_page.dart index dbde969..bb66b00 100644 --- a/lib/pages/live/live_stream/live_page.dart +++ b/lib/pages/live/live_stream/live_page.dart @@ -11,6 +11,7 @@ import 'package:recook/manager/http_manager.dart'; import 'package:recook/manager/user_manager.dart'; import 'package:recook/pages/live/live_stream/live_blur_page.dart'; import 'package:recook/pages/live/live_stream/live_pick_goods_page.dart'; +import 'package:recook/pages/live/live_stream/live_users_view.dart'; import 'package:recook/pages/live/live_stream/pick_view/pick_cart.dart'; import 'package:recook/pages/live/live_stream/show_goods_list.dart'; import 'package:recook/pages/live/models/live_exit_model.dart'; @@ -19,9 +20,11 @@ import 'package:recook/pages/live/models/topic_list_model.dart'; import 'package:recook/pages/live/tencent_im/tencent_im_tool.dart'; import 'package:recook/pages/live/video/pick_topic_page.dart'; import 'package:recook/pages/live/widget/live_user_bar.dart'; +import 'package:recook/pages/live/widget/more_people.dart'; import 'package:recook/utils/custom_route.dart'; import 'package:recook/widgets/bottom_sheet/action_sheet.dart'; import 'package:recook/widgets/custom_image_button.dart'; +import 'package:tencent_im_plugin/entity/group_member_entity.dart'; import 'package:tencent_im_plugin/entity/message_entity.dart'; import 'package:tencent_im_plugin/entity/session_entity.dart'; import 'package:tencent_im_plugin/message_node/group_system_message_node.dart'; @@ -50,6 +53,7 @@ class _LivePageState extends State { List chatObjects = []; ScrollController _scrollController = ScrollController(); int nowExplain = 0; + List _groupMembers = []; @override void initState() { @@ -358,6 +362,24 @@ class _LivePageState extends State { Api.getImgUrl(UserManager.instance.user.info.headImgUrl), ), Spacer(), + MorePeople( + onTap: () { + showModalBottomSheet( + context: context, + builder: (context) { + return LiveUsersView( + avatars: _groupMembers + .map((e) => e.userProfile.faceUrl) + .toList(), + usersId: _groupMembers.map((e) => e.user).toList(), + ); + }, + ); + }, + images: + _groupMembers.map((e) => e.userProfile.faceUrl).toList(), + ), + rWBox(10), CustomImageButton( onPressed: () { _livePusher?.stopPush(); @@ -509,6 +531,12 @@ class _LivePageState extends State { break; case ListenerTypeEnum.GroupTips: + TencentImPlugin.getGroupMembers(groupId: _streamInfoModel.groupId) + .then((models) { + setState(() { + _groupMembers = models; + }); + }); if (params is String) { dynamic parseParams = jsonDecode(params); if (parseParams['tipsType'] == 'Join') { diff --git a/lib/pages/live/live_stream/live_stream_view_page.dart b/lib/pages/live/live_stream/live_stream_view_page.dart index 4e5d237..6dd827e 100644 --- a/lib/pages/live/live_stream/live_stream_view_page.dart +++ b/lib/pages/live/live_stream/live_stream_view_page.dart @@ -10,8 +10,8 @@ import 'package:recook/manager/http_manager.dart'; import 'package:recook/manager/user_manager.dart'; import 'package:recook/pages/live/live_stream/live_blur_page.dart'; import 'package:recook/pages/live/live_stream/live_report_view.dart'; +import 'package:recook/pages/live/live_stream/live_users_view.dart'; import 'package:recook/pages/live/live_stream/show_goods_list.dart'; -import 'package:recook/pages/live/models/goods_window_model.dart'; import 'package:recook/pages/live/models/live_stream_info_model.dart'; import 'package:recook/pages/live/sub_page/user_home_page.dart'; import 'package:recook/pages/live/tencent_im/tencent_im_tool.dart'; @@ -20,6 +20,7 @@ import 'package:recook/pages/live/widget/more_people.dart'; import 'package:recook/utils/custom_route.dart'; import 'package:recook/widgets/bottom_sheet/action_sheet.dart'; import 'package:recook/widgets/custom_image_button.dart'; +import 'package:tencent_im_plugin/entity/group_member_entity.dart'; import 'package:tencent_im_plugin/entity/message_entity.dart'; import 'package:tencent_im_plugin/entity/session_entity.dart'; import 'package:tencent_im_plugin/message_node/group_system_message_node.dart'; @@ -52,6 +53,8 @@ class _LiveStreamViewPageState extends State { ///正在讲解的窗口 bool showDetailWindow = true; + List _groupMembers = []; + @override void initState() { super.initState(); @@ -184,6 +187,12 @@ class _LiveStreamViewPageState extends State { } break; case ListenerTypeEnum.GroupTips: + TencentImPlugin.getGroupMembers(groupId: _streamInfoModel.groupId) + .then((models) { + setState(() { + _groupMembers = models; + }); + }); if (params is String) { dynamic parseParams = jsonDecode(params); if (parseParams['tipsType'] == 'Join') { @@ -317,7 +326,23 @@ class _LiveStreamViewPageState extends State { avatar: _streamInfoModel.headImgUrl, ), Spacer(), - MorePeople(), + MorePeople( + onTap: () { + showModalBottomSheet( + context: context, + builder: (context) { + return LiveUsersView( + avatars: _groupMembers.map((e) => e.userProfile.faceUrl).toList(), + usersId: + _groupMembers.map((e) => e.user).toList(), + ); + }, + ); + }, + images: _groupMembers + .map((e) => e.userProfile.faceUrl) + .toList(), + ), SizedBox(width: rSize(54)), ], ), diff --git a/lib/pages/live/live_stream/live_users_view.dart b/lib/pages/live/live_stream/live_users_view.dart new file mode 100644 index 0000000..134a355 --- /dev/null +++ b/lib/pages/live/live_stream/live_users_view.dart @@ -0,0 +1,118 @@ +import 'package:flutter/material.dart'; +import 'package:recook/constants/api.dart'; +import 'package:recook/constants/header.dart'; +import 'package:recook/manager/http_manager.dart'; + +class LiveUsersView extends StatefulWidget { + final List usersId; + final List avatars; + LiveUsersView({Key key, @required this.usersId, @required this.avatars}) + : super(key: key); + + @override + _LiveUsersViewState createState() => _LiveUsersViewState(); +} + +class _LiveUsersViewState extends State { + List users; + + @override + void initState() { + super.initState(); + HttpManager.post( + LiveAPI.getLiveUsers, + {'identifiers': widget.usersId}, + ).then((resultData) { + setState(() { + users = (resultData?.data['data'] as List).map((e) { + return { + 'name': e['identifier'], + 'fans': e['fans'], + 'follow': e['isFollow'], + }; + }).toList(); + }); + }); + } + + @override + Widget build(BuildContext context) { + return DraggableScrollableSheet( + minChildSize: 0.5, + maxChildSize: 0.9, + builder: (context, controller) { + return Material( + color: Colors.black.withOpacity(0.55), + borderRadius: BorderRadius.vertical(top: Radius.circular(rSize(15))), + child: users == null + ? Center( + child: CircularProgressIndicator(), + ) + : Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.all(rSize(15)), + child: Text( + '在线观众', + style: TextStyle( + color: Colors.white, + fontSize: rSP(16), + fontWeight: FontWeight.bold, + ), + ), + ), + Expanded( + child: ListView.builder( + controller: controller, + itemBuilder: (BuildContext context, int index) { + final name = users[index]['name']; + final fans = users[index]['fans']; + return Padding( + padding: EdgeInsets.symmetric( + horizontal: rSize(15), + vertical: rSize(15 / 2), + ), + child: Row( + children: [ + ClipRRect( + borderRadius: + BorderRadius.circular(rSize(34 / 2)), + child: FadeInImage.assetNetwork( + placeholder: + R.ASSETS_PLACEHOLDER_NEW_1X1_A_PNG, + image: widget.avatars[index], + width: rSize(34), + height: rSize(34), + ), + ), + rWBox(10), + Text( + '$name', + style: TextStyle( + color: Colors.white, + fontSize: rSP(14), + ), + ), + rWBox(10), + Text( + '粉丝数$fans', + style: TextStyle( + color: Color(0xFFEEEEEE), + fontSize: rSP(12), + ), + ), + ], + ), + ); + }, + itemCount: users.length, + ), + ), + ], + ), + ); + }, + ); + } +} diff --git a/lib/pages/live/widget/more_people.dart b/lib/pages/live/widget/more_people.dart index 4e02e2f..a57b6cc 100644 --- a/lib/pages/live/widget/more_people.dart +++ b/lib/pages/live/widget/more_people.dart @@ -1,17 +1,17 @@ -import 'dart:math'; - import 'package:flutter/material.dart'; import 'package:recook/constants/header.dart'; class MorePeople extends StatefulWidget { final List images; - MorePeople({Key key, this.images}) : super(key: key); + final VoidCallback onTap; + MorePeople({Key key, this.images, @required this.onTap}) : super(key: key); @override _MorePeopleState createState() => _MorePeopleState(); } class _MorePeopleState extends State { + int get size => widget.images.length; @override void initState() { super.initState(); @@ -19,14 +19,18 @@ class _MorePeopleState extends State { @override Widget build(BuildContext context) { - return Stack( - overflow: Overflow.visible, - children: [ - _buildMore(), - _buildAvatar(1), - _buildAvatar(2), - _buildAvatar(3), - ], + return GestureDetector( + onTap: widget.onTap, + child: Stack( + overflow: Overflow.visible, + children: [ + rWBox(28 * 4 - 15.0), + size >= 4 ? _buildMore() : SizedBox(height: rSize(28)), + size >= 1 ? _buildAvatar(1) : SizedBox(height: rSize(28)), + size >= 2 ? _buildAvatar(2) : SizedBox(height: rSize(28)), + size >= 3 ? _buildAvatar(3) : SizedBox(height: rSize(28)), + ], + ), ); } @@ -34,6 +38,8 @@ class _MorePeopleState extends State { return Container( height: rSize(28), width: rSize(28), + alignment: Alignment.center, + child: Text(widget.images.length.toString()), decoration: BoxDecoration( color: Colors.black.withOpacity(0.1), borderRadius: BorderRadius.circular(rSize(14)), @@ -43,14 +49,14 @@ class _MorePeopleState extends State { _buildAvatar(int index) { return Positioned( - right: rSize(28 * index - 5.0 * index), - child: CircleAvatar( - radius: rSize(14), - backgroundColor: Color.fromRGBO( - Random().nextInt(100), - Random().nextInt(100), - Random().nextInt(100), - 1, + right: rSize(28 * (size >= 3 ? index : index - 1) - 5.0 * index), + child: ClipRRect( + borderRadius: BorderRadius.circular(rSize(14)), + child: FadeInImage.assetNetwork( + placeholder: R.ASSETS_PLACEHOLDER_NEW_1X1_A_PNG, + image: widget.images[index - 1], + height: rSize(28), + width: rSize(28), ), ), );