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 ce3c882..5b9fe83 100644 --- a/lib/pages/live/live_stream/live_stream_view_page.dart +++ b/lib/pages/live/live_stream/live_stream_view_page.dart @@ -26,7 +26,6 @@ import 'package:recook/utils/custom_route.dart'; import 'package:recook/utils/share_tool.dart'; import 'package:recook/widgets/bottom_sheet/action_sheet.dart'; import 'package:recook/widgets/custom_image_button.dart'; -import 'package:recook/pages/live/functions/live_function.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'; @@ -895,6 +894,8 @@ class _LiveStreamViewPageState extends State { onLive: true, id: widget.id, models: _streamInfoModel.goodsLists, + player: _livePlayer, + url: _streamInfoModel.playUrl, ); }, ), diff --git a/lib/pages/live/live_stream/show_goods_list.dart b/lib/pages/live/live_stream/show_goods_list.dart index 7362b50..5c20e54 100644 --- a/lib/pages/live/live_stream/show_goods_list.dart +++ b/lib/pages/live/live_stream/show_goods_list.dart @@ -12,10 +12,12 @@ import 'package:recook/pages/home/classify/mvp/goods_detail_model_impl.dart'; import 'package:recook/pages/home/classify/order_preview_page.dart'; import 'package:recook/pages/home/widget/plus_minus_view.dart'; import 'package:recook/pages/live/live_stream/live_sku_widget.dart'; +import 'package:recook/pages/live/live_stream/small_window/small_window_page.dart'; import 'package:recook/pages/live/models/live_stream_info_model.dart' show GoodsLists; import 'package:recook/pages/user/user_page.dart'; import 'package:recook/utils/custom_route.dart'; +import 'package:tencent_live_fluttify/tencent_live_fluttify.dart'; class GoodsListDialog extends StatefulWidget { final List models; @@ -24,6 +26,8 @@ class GoodsListDialog extends StatefulWidget { final Function(int explain) onExplain; final int initExplain; final int id; + final LivePlayer player; + final String url; GoodsListDialog({ Key key, @required this.models, @@ -32,6 +36,8 @@ class GoodsListDialog extends StatefulWidget { this.onLive, this.initExplain, this.id, + this.player, + this.url, }) : super(key: key); @override @@ -113,15 +119,17 @@ class _GoodsListDialogState extends State { _buildGoodsCard(GoodsLists model, int index) { return GestureDetector( - onTap: () { - CRoute.push( + onTap: () async { + widget.player.pausePlay(); + await CRoute.pushReplace( context, - CommodityDetailPage( - arguments: CommodityDetailPage.setArguments(model.id), + SmallWindowPage( liveId: widget.id, - isLive: true, + id: model.id, + url: widget.url, ), ); + widget.player.resumePlay(); }, child: Container( padding: EdgeInsets.all(rSize(15)), @@ -438,6 +446,8 @@ showGoodsListDialog( Function(int onExplain) onExplain, int initExplain, int id, + LivePlayer player, + String url, }) { showModalBottomSheet( context: context, @@ -449,6 +459,8 @@ showGoodsListDialog( initExplain: initExplain, id: id, onLive: onLive, + player: player, + url: url, ); }, ); diff --git a/lib/pages/live/live_stream/small_window/small_window_page.dart b/lib/pages/live/live_stream/small_window/small_window_page.dart new file mode 100644 index 0000000..c475100 --- /dev/null +++ b/lib/pages/live/live_stream/small_window/small_window_page.dart @@ -0,0 +1,39 @@ +import 'package:flutter/material.dart'; +import 'package:recook/pages/home/classify/commodity_detail_page.dart'; +import 'package:recook/pages/live/live_stream/small_window/small_window_widget.dart'; + +class SmallWindowPage extends StatefulWidget { + ///直播ID + final int liveId; + + ///物品ID + final int id; + + ///直播地址 + final String url; + SmallWindowPage({ + Key key, + @required this.liveId, + @required this.id, + this.url, + }) : super(key: key); + + @override + _SmallWindowPageState createState() => _SmallWindowPageState(); +} + +class _SmallWindowPageState extends State { + @override + Widget build(BuildContext context) { + return Stack( + children: [ + CommodityDetailPage( + arguments: CommodityDetailPage.setArguments(widget.id), + liveId: widget.liveId, + isLive: true, + ), + SmallWindowWidget(url: widget.url), + ], + ); + } +} diff --git a/lib/pages/live/live_stream/small_window/small_window_widget.dart b/lib/pages/live/live_stream/small_window/small_window_widget.dart new file mode 100644 index 0000000..ef31527 --- /dev/null +++ b/lib/pages/live/live_stream/small_window/small_window_widget.dart @@ -0,0 +1,119 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:tencent_live_fluttify/tencent_live_fluttify.dart'; + +class SmallWindowWidget extends StatefulWidget { + final String url; + SmallWindowWidget({Key key, @required this.url}) : super(key: key); + + @override + _SmallWindowWidgetState createState() => _SmallWindowWidgetState(); +} + +class _SmallWindowWidgetState extends State { + double _topPos = 0; + double _leftPos = 0; + bool _isMoving = false; + double _width = 90; + double get _subWidth => _width / 2; + double _height = 160; + double get _subHeight => _height / 2; + bool _isHide = false; + + LivePlayer _livePlayer; + @override + void initState() { + super.initState(); + _topPos = ScreenUtil.statusBarHeight + 20; + _leftPos = 20; + } + + @override + void dispose() { + _livePlayer?.stopPlay(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return AnimatedPositioned( + left: _isHide ? -_width : _leftPos, + top: _topPos, + child: Stack( + children: [ + Positioned( + left: 0, + right: 0, + top: 0, + bottom: 0, + child: CloudVideo( + onCloudVideoCreated: (controller) async { + _livePlayer = await LivePlayer.create(); + await _livePlayer.setPlayerView(controller); + _livePlayer.startPlay(widget.url, type: PlayType.RTMP); + }, + ), + ), + GestureDetector( + onTap: () { + Navigator.pop(context); + }, + onPanUpdate: (detail) { + setState(() { + _topPos = detail.globalPosition.dy - _subHeight; + _leftPos = detail.globalPosition.dx - _subWidth; + }); + }, + onPanStart: (detail) { + setState(() { + _isMoving = true; + }); + }, + onPanEnd: (detail) { + _isMoving = false; + if (_leftPos < 20) _leftPos = 20; + if (_topPos < ScreenUtil.statusBarHeight + 20) + _topPos = (20 + ScreenUtil.statusBarHeight); + if ((_leftPos + _width + 20) > ScreenUtil.screenWidthDp) + _leftPos = ScreenUtil.screenWidthDp - 20 - _width; + if ((_topPos + _height + 55 + 20) > ScreenUtil.screenHeightDp) + _topPos = ScreenUtil.screenHeightDp - 20 - _height - 55; + setState(() {}); + }, + child: Container( + height: _height, + width: _width, + color: Colors.transparent, + ), + ), + Positioned( + right: 10, + top: 10, + child: GestureDetector( + onTap: () { + setState(() { + _isHide = true; + }); + }, + child: Container( + height: 20, + width: 20, + child: Icon( + Icons.clear, + size: 16, + color: Colors.black, + ), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10), + ), + ), + ), + ), + ], + ), + curve: Curves.easeInOutCubic, + duration: _isMoving ? Duration.zero : Duration(milliseconds: 300), + ); + } +} diff --git a/pubspec.lock b/pubspec.lock index db48f5f..59c03b9 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1199,7 +1199,7 @@ packages: name: webview_flutter url: "https://pub.flutter-io.cn" source: hosted - version: "0.3.24" + version: "1.0.7" win32: dependency: transitive description: @@ -1229,5 +1229,5 @@ packages: source: hosted version: "2.2.1" sdks: - dart: ">=2.10.0-110 <2.11.0" - flutter: ">=1.20.0 <2.0.0" + dart: ">=2.10.0 <2.11.0" + flutter: ">=1.22.0 <2.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index 9dc44d9..3f9fdf4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -7,7 +7,7 @@ version: 1.3.16+209 # sdk min version to 2.2.2 # to support ... feature environment: - sdk: ">=2.2.2 <3.0.0" + sdk: ">=2.10.0 <3.0.0" module: androidX: true @@ -53,8 +53,8 @@ dependencies: url: https://gitee.com/laiiihz/flutter_qr_reader ref: 3e4824752f4fa50c30ecd415341a3a779db01922 + webview_flutter: ^1.0.7 # 网页组件 - webview_flutter: ^0.3.15+1 # webview_flutter: # git: # url: https://github.com/haysuperman/webview_flutter.git