diff --git a/lib/pages/danmaku/controller.dart b/lib/pages/danmaku/controller.dart index c7f5c40a..fb61f108 100644 --- a/lib/pages/danmaku/controller.dart +++ b/lib/pages/danmaku/controller.dart @@ -3,7 +3,8 @@ import 'package:PiliPalaX/models/danmaku/dm.pb.dart'; import 'package:flutter/cupertino.dart'; class PlDanmakuController { - PlDanmakuController(this.cid, this.danmakuWeightNotifier, this.danmakuFilterNotifier); + PlDanmakuController( + this.cid, this.danmakuWeightNotifier, this.danmakuFilterNotifier); final int cid; final ValueNotifier danmakuWeightNotifier; final ValueNotifier>> danmakuFilterNotifier; @@ -27,7 +28,8 @@ class PlDanmakuController { danmakuWeight = danmakuWeightNotifier.value; }); danmakuFilterNotifier.addListener(() { - print("danmakuFilter changed from $danmakuFilter to ${danmakuFilterNotifier.value}"); + print( + "danmakuFilter changed from $danmakuFilter to ${danmakuFilterNotifier.value}"); danmakuFilter = danmakuFilterNotifier.value; }); if (requestedSeg.isEmpty) { diff --git a/lib/pages/danmaku/view.dart b/lib/pages/danmaku/view.dart index 6dc2fa5e..3569da5d 100644 --- a/lib/pages/danmaku/view.dart +++ b/lib/pages/danmaku/view.dart @@ -23,7 +23,7 @@ class PlDanmaku extends StatefulWidget { State createState() => _PlDanmakuState(); } -class _PlDanmakuState extends State { +class _PlDanmakuState extends State with WidgetsBindingObserver { late PlPlayerController playerController; late PlDanmakuController _plDanmakuController; DanmakuController? _controller; @@ -38,10 +38,22 @@ class _PlDanmakuState extends State { late double strokeWidth; late int fontWeight; int latestAddedPosition = -1; + bool showDanmaku = true; + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + if (state == AppLifecycleState.resumed) { + showDanmaku = true; + } else if (state == AppLifecycleState.paused) { + showDanmaku = false; + playerController.danmakuController?.clear(); + } + } @override void initState() { super.initState(); + WidgetsBinding.instance.addObserver(this); enableShowDanmaku = setting.get(SettingBoxKey.enableShowDanmaku, defaultValue: true); _plDanmakuController = PlDanmakuController( @@ -100,7 +112,7 @@ class _PlDanmakuState extends State { List? currentDanmakuList = _plDanmakuController.getCurrentDanmaku(currentPosition); - if (currentDanmakuList != null && _controller != null) { + if (showDanmaku && currentDanmakuList != null && _controller != null) { Color? defaultColor = playerController.blockTypes.contains(6) ? DmUtils.decimalToColor(16777215) : null; @@ -118,6 +130,7 @@ class _PlDanmakuState extends State { @override void dispose() { + WidgetsBinding.instance.removeObserver(this); playerController.removePositionListener(videoPositionListen); super.dispose(); } diff --git a/lib/pages/live_room/controller.dart b/lib/pages/live_room/controller.dart index 1ae6ac80..1ecc3528 100644 --- a/lib/pages/live_room/controller.dart +++ b/lib/pages/live_room/controller.dart @@ -33,6 +33,7 @@ class LiveRoomController extends GetxController { RxBool disableAutoScroll = false.obs; double? brightness; DanmakuController? controller; + bool showDanmaku = true; @override void onInit() { @@ -135,17 +136,19 @@ class LiveRoomController extends GetxController { // logger.i(' 原始弹幕消息 ======> ${jsonEncode(obj)}'); messages.add(obj); Map json = jsonDecode(obj['info'][0][15]['extra']); - controller?.addItems([ - DanmakuItem( - json['content'], - color: DmUtils.decimalToColor(json['color']), - // time: e.progress, - type: DmUtils.getPosition(json['mode']), - ) - ]); - WidgetsBinding.instance.addPostFrameCallback( - (_) => scrollToBottom(), - ); + if (showDanmaku) { + controller?.addItems([ + DanmakuItem( + json['content'], + color: DmUtils.decimalToColor(json['color']), + // time: e.progress, + type: DmUtils.getPosition(json['mode']), + ) + ]); + WidgetsBinding.instance.addPostFrameCallback( + (_) => scrollToBottom(), + ); + } } }); msgStream?.init(); diff --git a/lib/pages/live_room/view.dart b/lib/pages/live_room/view.dart index c5b949d1..4cb7ae1b 100644 --- a/lib/pages/live_room/view.dart +++ b/lib/pages/live_room/view.dart @@ -25,7 +25,8 @@ class LiveRoomPage extends StatefulWidget { State createState() => _LiveRoomPageState(); } -class _LiveRoomPageState extends State { +class _LiveRoomPageState extends State + with WidgetsBindingObserver { late final int _roomId; final LiveRoomController _liveRoomController = Get.put(LiveRoomController()); late final PlPlayerController plPlayerController; @@ -57,6 +58,7 @@ class _LiveRoomPageState extends State { @override void initState() { super.initState(); + WidgetsBinding.instance.addObserver(this); _roomId = int.parse(Get.parameters['roomid'] ?? '-1'); PlPlayerController.setPlayCallBack(playCallBack); if (Platform.isAndroid) { @@ -82,6 +84,7 @@ class _LiveRoomPageState extends State { @override void dispose() { + WidgetsBinding.instance.removeObserver(this); ScreenBrightness().resetApplicationScreenBrightness(); PlPlayerController.setPlayCallBack(null); floating?.dispose(); @@ -94,6 +97,16 @@ class _LiveRoomPageState extends State { super.dispose(); } + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + if (state == AppLifecycleState.resumed) { + _liveRoomController.showDanmaku = true; + } else if (state == AppLifecycleState.paused) { + _liveRoomController.showDanmaku = false; + plPlayerController.danmakuController?.clear(); + } + } + @override Widget build(BuildContext context) { Widget videoPlayerPanel = FutureBuilder(