diff --git a/lib/http/danmaku.dart b/lib/http/danmaku.dart index fbaa7779..e94b7b54 100644 --- a/lib/http/danmaku.dart +++ b/lib/http/danmaku.dart @@ -35,7 +35,7 @@ class DanmakuHttp { //'aid': aid, 'bvid': bvid, 'progress': progress, - 'color': colorful == true ? null : color, + 'color': colorful == true ? 16777215 : color, 'fontsize': fontsize, 'pool': pool, 'rnd': DateTime.now().microsecondsSinceEpoch, diff --git a/lib/pages/live_room/controller.dart b/lib/pages/live_room/controller.dart index 783e5fff..91a8b86c 100644 --- a/lib/pages/live_room/controller.dart +++ b/lib/pages/live_room/controller.dart @@ -91,26 +91,7 @@ class LiveRoomController extends GetxController { if (res['status']) { RoomPlayInfoData data = res['data']; if (data.liveStatus != 1) { - Get.dialog( - AlertDialog( - title: const Text('当前直播间未开播'), - actions: [ - TextButton( - onPressed: Get.back, - child: Text( - '关闭', - style: TextStyle(color: Get.theme.colorScheme.outline), - ), - ), - TextButton( - onPressed: () => Get - ..back() - ..back(), - child: const Text('退出'), - ), - ], - ), - ); + _dialog(title: '当前直播间未开播'); return; } isPortrait.value = data.isPortrait ?? false; @@ -145,9 +126,38 @@ class LiveRoomController extends GetxController { roomId, heroTag, ); + } else { + if (res['msg'] != null) { + _dialog(title: res['msg']); + } } } + void _dialog({ + required String title, + }) { + Get.dialog( + AlertDialog( + title: Text(title), + actions: [ + TextButton( + onPressed: Get.back, + child: Text( + '关闭', + style: TextStyle(color: Get.theme.colorScheme.outline), + ), + ), + TextButton( + onPressed: () => Get + ..back() + ..back(), + child: const Text('退出'), + ), + ], + ), + ); + } + LiveMessageStream? msgStream; final ScrollController scrollController = ScrollController(); diff --git a/lib/pages/live_room/view.dart b/lib/pages/live_room/view.dart index 1b7a23cf..723bab49 100644 --- a/lib/pages/live_room/view.dart +++ b/lib/pages/live_room/view.dart @@ -370,36 +370,38 @@ class _LiveRoomPageState extends State RoomInfoH5Data? roomInfoH5 = _liveRoomController.roomInfoH5.value; return roomInfoH5 == null ? const SizedBox.shrink() - : Row( - children: [ - GestureDetector( - onTap: () => Get.toNamed( - '/member?mid=${roomInfoH5.roomInfo?.uid}'), - child: NetworkImgLayer( + : GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () => + Get.toNamed('/member?mid=${roomInfoH5.roomInfo?.uid}'), + child: Row( + spacing: 10, + mainAxisSize: MainAxisSize.min, + children: [ + NetworkImgLayer( width: 34, height: 34, type: ImageType.avatar, src: roomInfoH5.anchorInfo!.baseInfo!.face, ), - ), - const SizedBox(width: 10), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - roomInfoH5.anchorInfo!.baseInfo!.uname!, - style: const TextStyle(fontSize: 14), - ), - const SizedBox(height: 1), - if (roomInfoH5.watchedShow?.textLarge?.isNotEmpty == - true) + Column( + spacing: 1, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ Text( - roomInfoH5.watchedShow!.textLarge!, - style: const TextStyle(fontSize: 12), + roomInfoH5.anchorInfo!.baseInfo!.uname!, + style: const TextStyle(fontSize: 14), ), - ], - ), - ], + if (roomInfoH5.watchedShow?.textLarge?.isNotEmpty == + true) + Text( + roomInfoH5.watchedShow!.textLarge!, + style: const TextStyle(fontSize: 12), + ), + ], + ), + ], + ), ); }, ), diff --git a/lib/pages/live_room/widgets/bottom_control.dart b/lib/pages/live_room/widgets/bottom_control.dart index 710f759b..98c84d39 100644 --- a/lib/pages/live_room/widgets/bottom_control.dart +++ b/lib/pages/live_room/widgets/bottom_control.dart @@ -47,19 +47,26 @@ class BottomControl extends StatelessWidget { ), const Spacer(), Obx( - () => IconButton( - onPressed: () { - plPlayerController.isOpenDanmu.value = - !plPlayerController.isOpenDanmu.value; - GStorage.setting.put(SettingBoxKey.enableShowDanmaku, - plPlayerController.isOpenDanmu.value); - }, - icon: Icon( - size: 18, - plPlayerController.isOpenDanmu.value - ? Icons.subtitles_outlined - : Icons.subtitles_off_outlined, - color: Colors.white, + () => SizedBox( + width: 35, + height: 35, + child: IconButton( + style: ButtonStyle( + padding: WidgetStateProperty.all(EdgeInsets.zero), + ), + onPressed: () { + plPlayerController.isOpenDanmu.value = + !plPlayerController.isOpenDanmu.value; + GStorage.setting.put(SettingBoxKey.enableShowDanmaku, + plPlayerController.isOpenDanmu.value); + }, + icon: Icon( + size: 18, + plPlayerController.isOpenDanmu.value + ? Icons.subtitles_outlined + : Icons.subtitles_off_outlined, + color: Colors.white, + ), ), ), ), diff --git a/lib/pages/live_room/widgets/header_control.dart b/lib/pages/live_room/widgets/header_control.dart index e4f85cf5..065a88fa 100644 --- a/lib/pages/live_room/widgets/header_control.dart +++ b/lib/pages/live_room/widgets/header_control.dart @@ -30,6 +30,7 @@ class LiveHeaderControl extends StatelessWidget { automaticallyImplyLeading: false, titleSpacing: 14, title: Row( + spacing: 10, children: [ if (title != null) Expanded( @@ -55,72 +56,92 @@ class LiveHeaderControl extends StatelessWidget { ) else const Spacer(), - IconButton( - tooltip: '发弹幕', - style: ButtonStyle( - padding: WidgetStateProperty.all(EdgeInsets.zero), - ), - onPressed: onSendDanmaku, - icon: const Icon( - Icons.comment_outlined, - size: 18, - color: Colors.white, - ), - ), - Obx( - () => IconButton( - onPressed: plPlayerController.setOnlyPlayAudio, - icon: plPlayerController.onlyPlayAudio.value - ? const Icon( - size: 18, - MdiIcons.musicCircle, - color: Colors.white, - ) - : const Icon( - size: 18, - MdiIcons.musicCircleOutline, - color: Colors.white, - ), - ), - ), - const SizedBox(width: 10), - if (Platform.isAndroid) ...[ - IconButton( - tooltip: '画中画', + SizedBox( + width: 35, + height: 35, + child: IconButton( + tooltip: '发弹幕', style: ButtonStyle( padding: WidgetStateProperty.all(EdgeInsets.zero), ), - onPressed: () async { - try { - var floating = Floating(); - if ((await floating.isPipAvailable) == true) { - plPlayerController.hiddenControls(false); - floating.enable( - plPlayerController.direction.value == 'vertical' - ? const EnableManual(aspectRatio: Rational.vertical()) - : const EnableManual(), - ); - } - } catch (_) {} - }, + onPressed: onSendDanmaku, icon: const Icon( - Icons.picture_in_picture_outlined, + Icons.comment_outlined, size: 18, color: Colors.white, ), ), - const SizedBox(width: 10), - ], - IconButton( - onPressed: () => PageUtils.scheduleExit( - context, - plPlayerController.isFullScreen.value, - true, + ), + Obx( + () => SizedBox( + width: 35, + height: 35, + child: IconButton( + onPressed: plPlayerController.setOnlyPlayAudio, + style: ButtonStyle( + padding: WidgetStateProperty.all(EdgeInsets.zero), + ), + icon: plPlayerController.onlyPlayAudio.value + ? const Icon( + size: 18, + MdiIcons.musicCircle, + color: Colors.white, + ) + : const Icon( + size: 18, + MdiIcons.musicCircleOutline, + color: Colors.white, + ), + ), ), - icon: const Icon( - size: 18, - Icons.schedule, - color: Colors.white, + ), + if (Platform.isAndroid) + SizedBox( + width: 35, + height: 35, + child: IconButton( + tooltip: '画中画', + style: ButtonStyle( + padding: WidgetStateProperty.all(EdgeInsets.zero), + ), + onPressed: () async { + try { + var floating = Floating(); + if ((await floating.isPipAvailable) == true) { + plPlayerController.hiddenControls(false); + floating.enable( + plPlayerController.direction.value == 'vertical' + ? const EnableManual( + aspectRatio: Rational.vertical()) + : const EnableManual(), + ); + } + } catch (_) {} + }, + icon: const Icon( + Icons.picture_in_picture_outlined, + size: 18, + color: Colors.white, + ), + ), + ), + SizedBox( + width: 35, + height: 35, + child: IconButton( + style: ButtonStyle( + padding: WidgetStateProperty.all(EdgeInsets.zero), + ), + onPressed: () => PageUtils.scheduleExit( + context, + plPlayerController.isFullScreen.value, + true, + ), + icon: const Icon( + size: 18, + Icons.schedule, + color: Colors.white, + ), ), ), ], diff --git a/lib/pages/main/controller.dart b/lib/pages/main/controller.dart index 55f07775..29ae1312 100644 --- a/lib/pages/main/controller.dart +++ b/lib/pages/main/controller.dart @@ -8,9 +8,11 @@ import 'package:PiliPlus/models/common/msg/msg_unread_type.dart'; import 'package:PiliPlus/models/common/nav_bar_config.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/utils.dart'; +import 'package:flutter/material.dart'; import 'package:get/get.dart'; -class MainController extends GetxController { +class MainController extends GetxController + with GetSingleTickerProviderStateMixin { List navigationBars = []; RxInt dynCount = 0.obs; @@ -44,6 +46,14 @@ class MainController extends GetxController { setNavBarConfig(); + controller = mainTabBarView + ? TabController( + vsync: this, + initialIndex: selectedIndex.value, + length: navigationBars.length, + ) + : PageController(initialPage: selectedIndex.value); + hideTabBar = GStorage.setting.get(SettingBoxKey.hideTabBar, defaultValue: true); if (navigationBars.length > 1 && hideTabBar) { @@ -174,6 +184,7 @@ class MainController extends GetxController { @override void onClose() { bottomBarStream?.close(); + controller.dispose(); super.onClose(); } } diff --git a/lib/pages/main/view.dart b/lib/pages/main/view.dart index 50cf5afa..eca18429 100644 --- a/lib/pages/main/view.dart +++ b/lib/pages/main/view.dart @@ -37,7 +37,7 @@ class MainApp extends StatefulWidget { } class _MainAppState extends State - with SingleTickerProviderStateMixin, RouteAware, WidgetsBindingObserver { + with RouteAware, WidgetsBindingObserver { final MainController _mainController = Get.put(MainController()); late final _homeController = Get.put(HomeController()); late final _dynamicController = Get.put(DynamicsController()); @@ -50,13 +50,6 @@ class _MainAppState extends State void initState() { super.initState(); _lastSelectTime = DateTime.now().millisecondsSinceEpoch; - _mainController.controller = _mainController.mainTabBarView - ? TabController( - vsync: this, - initialIndex: _mainController.selectedIndex.value, - length: _mainController.navigationBars.length, - ) - : PageController(initialPage: _mainController.selectedIndex.value); enableMYBar = GStorage.setting.get(SettingBoxKey.enableMYBar, defaultValue: true); useSideBar = diff --git a/lib/pages/member_contribute/controller.dart b/lib/pages/member_contribute/controller.dart index cf769937..2625b182 100644 --- a/lib/pages/member_contribute/controller.dart +++ b/lib/pages/member_contribute/controller.dart @@ -1,14 +1,12 @@ import 'dart:math'; -import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models_new/space/space/tab2.dart'; -import 'package:PiliPlus/pages/common/common_data_controller.dart'; import 'package:PiliPlus/pages/member/controller.dart'; import 'package:PiliPlus/utils/extension.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -class MemberContributeCtr extends CommonDataController +class MemberContributeCtr extends GetxController with GetSingleTickerProviderStateMixin { MemberContributeCtr({ required this.heroTag, @@ -49,11 +47,6 @@ class MemberContributeCtr extends CommonDataController } } - @override - Future customGetData() { - throw UnimplementedError(); - } - @override void onClose() { tabController?.dispose(); diff --git a/lib/pages/video/view.dart b/lib/pages/video/view.dart index fdfb8150..29b2ad90 100644 --- a/lib/pages/video/view.dart +++ b/lib/pages/video/view.dart @@ -1451,6 +1451,7 @@ class _VideoDetailPageVState extends State if (_shouldShowSeasonPanel) '播放列表', ]; if (videoDetailController.tabCtr.length != tabs.length) { + videoDetailController.tabCtr.dispose(); videoDetailController.tabCtr = TabController( vsync: this, length: tabs.length,