diff --git a/lib/common/widgets/pendant_avatar.dart b/lib/common/widgets/pendant_avatar.dart index 316f5d8c..0092706f 100644 --- a/lib/common/widgets/pendant_avatar.dart +++ b/lib/common/widgets/pendant_avatar.dart @@ -3,10 +3,10 @@ import 'package:PiliPlus/models/common/avatar_badge_type.dart'; import 'package:PiliPlus/models/common/image_type.dart'; import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/image_util.dart'; +import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; class PendantAvatar extends StatelessWidget { final BadgeType _badgeType; @@ -14,7 +14,7 @@ class PendantAvatar extends StatelessWidget { final double size; final double badgeSize; final String? garbPendantImage; - final dynamic roomId; + final int? roomId; final VoidCallback? onTap; const PendantAvatar({ @@ -71,7 +71,7 @@ class PendantAvatar extends StatelessWidget { Positioned( bottom: 0, child: InkWell( - onTap: () => Get.toNamed('/liveRoom?roomid=$roomId'), + onTap: () => PageUtils.toLiveRoom(roomId), child: Container( padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 1), decoration: BoxDecoration( diff --git a/lib/common/widgets/video_card/video_card_h.dart b/lib/common/widgets/video_card/video_card_h.dart index 2587cbb0..17023e2e 100644 --- a/lib/common/widgets/video_card/video_card_h.dart +++ b/lib/common/widgets/video_card/video_card_h.dart @@ -16,7 +16,6 @@ import 'package:PiliPlus/utils/duration_util.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; -import 'package:get/get.dart'; // 视频卡片 - 水平布局 class VideoCardH extends StatelessWidget { @@ -81,7 +80,7 @@ class VideoCardH extends StatelessWidget { if (videoItem case SearchVideoItemModel item) { int? roomId = item.id; if (roomId != null) { - Get.toNamed('/liveRoom?roomid=$roomId'); + PageUtils.toLiveRoom(roomId); } } else { SmartDialog.showToast( @@ -96,6 +95,7 @@ class VideoCardH extends StatelessWidget { return; } } + try { final int? cid = videoItem.cid ?? diff --git a/lib/pages/dynamics/widgets/live_panel.dart b/lib/pages/dynamics/widgets/live_panel.dart index 459bb424..b7686636 100644 --- a/lib/pages/dynamics/widgets/live_panel.dart +++ b/lib/pages/dynamics/widgets/live_panel.dart @@ -1,8 +1,8 @@ import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/models/dynamics/result.dart'; +import 'package:PiliPlus/utils/page_utils.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; Widget livePanel( ThemeData theme, @@ -20,7 +20,7 @@ Widget livePanel( children: [ GestureDetector( behavior: HitTestBehavior.opaque, - onTap: () => Get.toNamed('/liveRoom?roomid=${content.live?.id}'), + onTap: () => PageUtils.toLiveRoom(content.live?.id), onLongPress: () { Feedback.forLongPress(context); imageSaveDialog( diff --git a/lib/pages/dynamics/widgets/live_panel_sub.dart b/lib/pages/dynamics/widgets/live_panel_sub.dart index ec962c56..5d89926a 100644 --- a/lib/pages/dynamics/widgets/live_panel_sub.dart +++ b/lib/pages/dynamics/widgets/live_panel_sub.dart @@ -3,8 +3,8 @@ import 'package:PiliPlus/common/widgets/badge.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/models/common/badge_type.dart'; import 'package:PiliPlus/models/dynamics/result.dart'; +import 'package:PiliPlus/utils/page_utils.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; Widget livePanelSub( ThemeData theme, @@ -24,7 +24,7 @@ Widget livePanelSub( Padding( padding: const EdgeInsets.symmetric(horizontal: StyleString.safeSpace), child: GestureDetector( - onTap: () => Get.toNamed('/liveRoom?roomid=${content.roomId}'), + onTap: () => PageUtils.toLiveRoom(content.roomId), child: LayoutBuilder( builder: (context, box) { double width = box.maxWidth; diff --git a/lib/pages/dynamics/widgets/up_panel.dart b/lib/pages/dynamics/widgets/up_panel.dart index 37683b5a..c1bb9876 100644 --- a/lib/pages/dynamics/widgets/up_panel.dart +++ b/lib/pages/dynamics/widgets/up_panel.dart @@ -5,6 +5,7 @@ import 'package:PiliPlus/models/dynamics/up.dart'; import 'package:PiliPlus/pages/dynamics/controller.dart'; import 'package:PiliPlus/pages/live_follow/view.dart'; import 'package:PiliPlus/utils/feed_back.dart'; +import 'package:PiliPlus/utils/page_utils.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -144,7 +145,7 @@ class _UpPanelState extends State { feedBack(); switch (data) { case LiveUserItem(): - Get.toNamed('/liveRoom?roomid=${data.roomId}'); + PageUtils.toLiveRoom(data.roomId); case UpItem(): _onSelect(data); break; diff --git a/lib/pages/history/widgets/item.dart b/lib/pages/history/widgets/item.dart index 5642ea2f..4a90c00e 100644 --- a/lib/pages/history/widgets/item.dart +++ b/lib/pages/history/widgets/item.dart @@ -56,7 +56,7 @@ class HistoryItem extends StatelessWidget { ); } else if (item.history.business == 'live') { if (item.liveStatus == 1) { - Get.toNamed('/liveRoom?roomid=${item.history.oid}'); + PageUtils.toLiveRoom(item.history.oid); } else { SmartDialog.showToast('直播未开播'); } diff --git a/lib/pages/live/view.dart b/lib/pages/live/view.dart index e98b0e82..a1047b5b 100644 --- a/lib/pages/live/view.dart +++ b/lib/pages/live/view.dart @@ -17,6 +17,7 @@ import 'package:PiliPlus/pages/live_area/view.dart'; import 'package:PiliPlus/pages/live_follow/view.dart'; import 'package:PiliPlus/pages/search/widgets/search_text.dart'; import 'package:PiliPlus/utils/grid.dart'; +import 'package:PiliPlus/utils/page_utils.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -292,7 +293,7 @@ class _LivePageState extends CommonPageState return SizedBox( width: 65, child: GestureDetector( - onTap: () => Get.toNamed('/liveRoom?roomid=${item.roomid}'), + onTap: () => PageUtils.toLiveRoom(item.roomid), onLongPress: () { Feedback.forLongPress(context); Get.toNamed('/member?mid=${item.uid}'); diff --git a/lib/pages/live/widgets/live_item_app.dart b/lib/pages/live/widgets/live_item_app.dart index 7e0e93fd..f232de64 100644 --- a/lib/pages/live/widgets/live_item_app.dart +++ b/lib/pages/live/widgets/live_item_app.dart @@ -3,8 +3,8 @@ import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/models_new/live/live_feed_index/card_data_list_item.dart'; import 'package:PiliPlus/utils/num_util.dart'; +import 'package:PiliPlus/utils/page_utils.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; // 视频卡片 - 垂直布局 class LiveCardVApp extends StatelessWidget { @@ -20,7 +20,7 @@ class LiveCardVApp extends StatelessWidget { return Card( clipBehavior: Clip.hardEdge, child: InkWell( - onTap: () => Get.toNamed('/liveRoom?roomid=${item.roomid}'), + onTap: () => PageUtils.toLiveRoom(item.roomid), onLongPress: () => imageSaveDialog( title: item.title, cover: item.cover, diff --git a/lib/pages/live_follow/widgets/live_item_follow.dart b/lib/pages/live_follow/widgets/live_item_follow.dart index 51808efb..b84b9399 100644 --- a/lib/pages/live_follow/widgets/live_item_follow.dart +++ b/lib/pages/live_follow/widgets/live_item_follow.dart @@ -2,8 +2,8 @@ import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/models_new/live/live_follow/item.dart'; +import 'package:PiliPlus/utils/page_utils.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; // 视频卡片 - 垂直布局 class LiveCardVFollow extends StatelessWidget { @@ -19,7 +19,7 @@ class LiveCardVFollow extends StatelessWidget { return Card( clipBehavior: Clip.hardEdge, child: InkWell( - onTap: () => Get.toNamed('/liveRoom?roomid=${liveItem.roomid}'), + onTap: () => PageUtils.toLiveRoom(liveItem.roomid), onLongPress: () => imageSaveDialog( title: liveItem.title, cover: liveItem.roomCover, diff --git a/lib/pages/live_room/controller.dart b/lib/pages/live_room/controller.dart index 243fed7f..e5febb69 100644 --- a/lib/pages/live_room/controller.dart +++ b/lib/pages/live_room/controller.dart @@ -30,7 +30,7 @@ class LiveRoomController extends GetxController { LiveRoomController(this.heroTag); final String heroTag; - int roomId = int.parse(Get.parameters['roomid']!); + int roomId = Get.arguments; PlPlayerController plPlayerController = PlPlayerController.getInstance( isLive: true, ); diff --git a/lib/pages/live_room/view.dart b/lib/pages/live_room/view.dart index a3e875d4..ffd40ed7 100644 --- a/lib/pages/live_room/view.dart +++ b/lib/pages/live_room/view.dart @@ -37,8 +37,7 @@ class LiveRoomPage extends StatefulWidget { class _LiveRoomPageState extends State with WidgetsBindingObserver { - late final String heroTag; - late final int _roomId; + final String heroTag = Utils.generateRandomString(6); late final LiveRoomController _liveRoomController; late final PlPlayerController plPlayerController; bool get isFullScreen => plPlayerController.isFullScreen.value; @@ -58,8 +57,6 @@ class _LiveRoomPageState extends State void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); - _roomId = int.parse(Get.parameters['roomid'] ?? '-1'); - heroTag = Utils.makeHeroTag(_roomId); _liveRoomController = Get.put( LiveRoomController(heroTag), tag: heroTag, @@ -528,7 +525,7 @@ class _LiveRoomPageState extends State child: LiveRoomChat( key: chatKey, isPP: isPP ?? false, - roomId: _roomId, + roomId: _liveRoomController.roomId, liveRoomController: _liveRoomController, ), ); diff --git a/lib/pages/live_search/controller.dart b/lib/pages/live_search/controller.dart index 2ca79292..4d8dc4ea 100644 --- a/lib/pages/live_search/controller.dart +++ b/lib/pages/live_search/controller.dart @@ -2,6 +2,7 @@ import 'package:PiliPlus/models/common/live_search_type.dart'; import 'package:PiliPlus/pages/live_search/child/controller.dart'; import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/id_utils.dart'; +import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -41,7 +42,7 @@ class LiveSearchController extends GetxController void submit() { if (editingController.text.isNotEmpty) { if (IdUtils.digitOnlyRegExp.hasMatch(editingController.text)) { - Get.toNamed('/liveRoom?roomid=${editingController.text}'); + PageUtils.toLiveRoom(int.parse(editingController.text)); } else { hasData.value = true; roomCtr diff --git a/lib/pages/live_search/widgets/live_search_room.dart b/lib/pages/live_search/widgets/live_search_room.dart index 82554378..248e249c 100644 --- a/lib/pages/live_search/widgets/live_search_room.dart +++ b/lib/pages/live_search/widgets/live_search_room.dart @@ -3,8 +3,8 @@ import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/models_new/live/live_search/room_item.dart'; import 'package:PiliPlus/utils/num_util.dart'; +import 'package:PiliPlus/utils/page_utils.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; // 视频卡片 - 垂直布局 class LiveCardVSearch extends StatelessWidget { @@ -20,7 +20,7 @@ class LiveCardVSearch extends StatelessWidget { return Card( clipBehavior: Clip.hardEdge, child: InkWell( - onTap: () => Get.toNamed('/liveRoom?roomid=${item.roomid}'), + onTap: () => PageUtils.toLiveRoom(item.roomid), onLongPress: () => imageSaveDialog( title: item.title, cover: item.cover, diff --git a/lib/pages/live_search/widgets/live_search_user.dart b/lib/pages/live_search/widgets/live_search_user.dart index 43c79bae..82a27f84 100644 --- a/lib/pages/live_search/widgets/live_search_user.dart +++ b/lib/pages/live_search/widgets/live_search_user.dart @@ -2,8 +2,8 @@ import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/models/common/image_type.dart'; import 'package:PiliPlus/models_new/live/live_search/user_item.dart'; import 'package:PiliPlus/utils/num_util.dart'; +import 'package:PiliPlus/utils/page_utils.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; class LiveSearchUserItem extends StatelessWidget { const LiveSearchUserItem({ @@ -23,9 +23,7 @@ class LiveSearchUserItem extends StatelessWidget { return Material( type: MaterialType.transparency, child: InkWell( - onTap: () => Get.toNamed( - '/liveRoom?roomid=${item.roomid}', - ), + onTap: () => PageUtils.toLiveRoom(item.roomid), child: Row( children: [ const SizedBox(width: 15), diff --git a/lib/pages/match_info/view.dart b/lib/pages/match_info/view.dart index 4b698113..47bd1bdd 100644 --- a/lib/pages/match_info/view.dart +++ b/lib/pages/match_info/view.dart @@ -14,6 +14,7 @@ import 'package:PiliPlus/pages/video/reply/widgets/reply_item_grpc.dart'; import 'package:PiliPlus/pages/video/reply_reply/view.dart'; import 'package:PiliPlus/utils/date_util.dart'; import 'package:PiliPlus/utils/feed_back.dart'; +import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:easy_debounce/easy_throttle.dart'; import 'package:flutter/material.dart'; @@ -162,9 +163,8 @@ class _MatchInfoPageState extends CommonDynPageState { visualDensity: VisualDensity.compact, tapTargetSize: MaterialTapTargetSize.shrinkWrap, ), - onPressed: () => Get.toNamed( - '/liveRoom?roomid=${data.liveRoom}', - ), + onPressed: () => + PageUtils.toLiveRoom(data.liveRoom), child: const Text('看直播'), ) else if (data.contestStatus == 3) diff --git a/lib/pages/search_panel/live/widgets/item.dart b/lib/pages/search_panel/live/widgets/item.dart index 6932057e..7fe612f4 100644 --- a/lib/pages/search_panel/live/widgets/item.dart +++ b/lib/pages/search_panel/live/widgets/item.dart @@ -2,8 +2,8 @@ import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/models/search/result.dart'; +import 'package:PiliPlus/utils/page_utils.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; class LiveItem extends StatelessWidget { final SearchLiveItemModel liveItem; @@ -16,7 +16,7 @@ class LiveItem extends StatelessWidget { return Card( clipBehavior: Clip.hardEdge, child: InkWell( - onTap: () => Get.toNamed('/liveRoom?roomid=${liveItem.roomid}'), + onTap: () => PageUtils.toLiveRoom(liveItem.roomid), onLongPress: () => imageSaveDialog( title: liveItem.title.map((item) => item.text).join(), cover: liveItem.cover, diff --git a/lib/pages/whisper_detail/widget/chat_item.dart b/lib/pages/whisper_detail/widget/chat_item.dart index d68028dc..ef0b27ac 100644 --- a/lib/pages/whisper_detail/widget/chat_item.dart +++ b/lib/pages/whisper_detail/widget/chat_item.dart @@ -203,7 +203,13 @@ class ChatItem extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ GestureDetector( - onTap: () => Get.toNamed('/liveRoom?roomid=${content['sourceID']}'), + onTap: () { + var roomId = content['sourceID']; + if (roomId is String) { + roomId = int.parse(roomId); + } + PageUtils.toLiveRoom(roomId); + }, child: NetworkImgLayer( width: 220, height: 220 * 9 / 16, diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index 2fcafd41..d6324778 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -424,6 +424,8 @@ class PlPlayerController { } } + static PlPlayerController? get instance => _instance; + static bool instanceExists() { return _instance != null; } @@ -476,8 +478,7 @@ class PlPlayerController { Box video = GStorage.video; // 添加一个私有构造函数 - PlPlayerController._({bool isLive = false}) { - _isLive = isLive; + PlPlayerController._() { if (!Accounts.heartbeat.isLogin || Pref.historyPause) { enableHeart = false; } @@ -504,7 +505,7 @@ class PlPlayerController { // 获取实例 传参 static PlPlayerController getInstance({bool isLive = false}) { // 如果实例尚未创建,则创建一个新实例 - _instance ??= PlPlayerController._(isLive: isLive); + _instance ??= PlPlayerController._().._isLive = isLive; _instance!._playerCount.value += 1; return _instance!; } diff --git a/lib/utils/app_scheme.dart b/lib/utils/app_scheme.dart index 35c988d4..ca90246b 100644 --- a/lib/utils/app_scheme.dart +++ b/lib/utils/app_scheme.dart @@ -191,7 +191,7 @@ class PiliScheme { // bilibili://live/12345678?extra_jump_from=1&from=1&is_room_feed=1&h5awaken=random String? roomId = uriDigitRegExp.firstMatch(path)?.group(1); if (roomId != null) { - PageUtils.toDupNamed('/liveRoom?roomid=$roomId', off: off); + PageUtils.toLiveRoom(int.parse(roomId), off: off); return true; } return false; @@ -561,7 +561,7 @@ class PiliScheme { if (host.contains('live.bilibili.com')) { String? roomId = uriDigitRegExp.firstMatch(path)?.group(1); if (roomId != null) { - PageUtils.toDupNamed('/liveRoom?roomid=$roomId', off: off); + PageUtils.toLiveRoom(int.parse(roomId), off: off); return true; } launchURL(); diff --git a/lib/utils/page_utils.dart b/lib/utils/page_utils.dart index bd9480fc..d56d3436 100644 --- a/lib/utils/page_utils.dart +++ b/lib/utils/page_utils.dart @@ -14,6 +14,7 @@ import 'package:PiliPlus/pages/contact/view.dart'; import 'package:PiliPlus/pages/fav_panel/view.dart'; import 'package:PiliPlus/pages/share/view.dart'; import 'package:PiliPlus/pages/video/introduction/ugc/widgets/menu_row.dart'; +import 'package:PiliPlus/plugin/pl_player/controller.dart'; import 'package:PiliPlus/services/shutdown_timer_service.dart'; import 'package:PiliPlus/utils/app_scheme.dart'; import 'package:PiliPlus/utils/extension.dart'; @@ -444,7 +445,7 @@ class PageUtils { case 'DYNAMIC_TYPE_LIVE_RCMD': DynamicLiveModel liveRcmd = item.modules.moduleDynamic!.major!.liveRcmd!; - toDupNamed('/liveRoom?roomid=${liveRcmd.roomId}'); + toLiveRoom(liveRcmd.roomId); break; /// 合集查看 @@ -663,6 +664,24 @@ class PageUtils { ); } + static void toLiveRoom( + int? roomId, { + bool off = false, + }) { + if (roomId == null) { + return; + } + if (PlPlayerController.instanceExists()) { + SmartDialog.showToast('unsupported'); + return; + } + if (off) { + Get.offNamed('/liveRoom', arguments: roomId); + } else { + Get.toNamed('/liveRoom', arguments: roomId); + } + } + static void toVideoPage({ VideoType videoType = VideoType.ugc, int? aid, @@ -679,6 +698,10 @@ class PageUtils { bool preventDuplicates = true, bool off = false, }) { + if (PlPlayerController.instance?.isLive == true) { + SmartDialog.showToast('Living'); + return; + } final arguments = { 'aid': aid ?? IdUtils.bv2av(bvid!), 'bvid': bvid ?? IdUtils.av2bv(aid!), @@ -698,14 +721,14 @@ class PageUtils { '/videoV', arguments: arguments, id: id, - preventDuplicates: preventDuplicates, + preventDuplicates: false, ); } else { Get.toNamed( '/videoV', arguments: arguments, id: id, - preventDuplicates: preventDuplicates, + preventDuplicates: false, ); } }