Signed-off-by: dom <githubaccount56556@proton.me>
This commit is contained in:
dom
2026-06-13 10:17:35 +08:00
parent b02e4253f1
commit 3fae4ef632
8 changed files with 177 additions and 195 deletions

View File

@@ -632,19 +632,22 @@ class LiveRoomController extends GetxController {
PublishRoute(
barrierColor: Colors.transparent,
pageBuilder: (context, animation, secondaryAnimation) {
return LiveSendDmPanel(
fromEmote: fromEmote,
liveRoomController: this,
items: savedDanmaku,
autofocus: !fromEmote,
onSave: (msg) {
if (msg.isEmpty) {
savedDanmaku?.clear();
savedDanmaku = null;
} else {
savedDanmaku = msg.toList();
}
},
return Theme(
data: ThemeUtils.darkTheme,
child: LiveSendDmPanel(
fromEmote: fromEmote,
liveRoomController: this,
items: savedDanmaku,
autofocus: !fromEmote,
onSave: (msg) {
if (msg.isEmpty) {
savedDanmaku?.clear();
savedDanmaku = null;
} else {
savedDanmaku = msg.toList();
}
},
),
);
},
transitionDuration: fromEmote

View File

@@ -48,6 +48,7 @@ import 'package:PiliPlus/utils/share_utils.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/storage_key.dart';
import 'package:PiliPlus/utils/storage_pref.dart';
import 'package:PiliPlus/utils/theme_utils.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'package:cached_network_image_ce/cached_network_image.dart';
import 'package:canvas_danmaku/danmaku_screen.dart';
@@ -57,6 +58,8 @@ import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
import 'package:screen_brightness_platform_interface/screen_brightness_platform_interface.dart';
const baseWhite = Color(0xFFEEEEEE);
class LiveRoomPage extends StatefulWidget {
const LiveRoomPage({super.key});
@@ -233,7 +236,10 @@ class _LiveRoomPageState extends State<LiveRoomPage>
child: child,
);
}
return child;
return Theme(
data: ThemeUtils.darkTheme,
child: child,
);
}
Widget videoPlayerPanel(
@@ -541,7 +547,6 @@ class _LiveRoomPageState extends State<LiveRoomPage>
}
PreferredSizeWidget _buildAppBar(bool isFullScreen) {
final color = Theme.of(context).colorScheme.onSurfaceVariant;
return AppBar(
primary: !plPlayerController.removeSafeArea,
toolbarHeight: isFullScreen ? 0 : null,
@@ -563,7 +568,7 @@ class _LiveRoomPageState extends State<LiveRoomPage>
Get.toNamed('/member?mid=${roomInfoH5.roomInfo?.uid}'),
child: Row(
spacing: 10,
mainAxisSize: MainAxisSize.min,
mainAxisSize: .min,
children: [
NetworkImgLayer(
width: 34,
@@ -623,47 +628,35 @@ class _LiveRoomPageState extends State<LiveRoomPage>
return <PopupMenuEntry>[
PopupMenuItem(
onTap: () => Utils.copyText(liveUrl),
child: Row(
child: const Row(
spacing: 10,
mainAxisSize: MainAxisSize.min,
mainAxisSize: .min,
children: [
Icon(
Icons.copy,
size: 19,
color: color,
),
const Text('复制链接'),
Icon(Icons.copy, size: 19),
Text('复制链接'),
],
),
),
if (PlatformUtils.isMobile)
PopupMenuItem(
onTap: () => ShareUtils.shareText(liveUrl),
child: Row(
child: const Row(
spacing: 10,
mainAxisSize: MainAxisSize.min,
mainAxisSize: .min,
children: [
Icon(
Icons.share,
size: 19,
color: color,
),
const Text('分享直播间'),
Icon(Icons.share, size: 19),
Text('分享直播间'),
],
),
),
PopupMenuItem(
onTap: () => PageUtils.inAppWebview(liveUrl, off: true),
child: Row(
child: const Row(
spacing: 10,
mainAxisSize: MainAxisSize.min,
mainAxisSize: .min,
children: [
Icon(
Icons.open_in_browser,
size: 19,
color: color,
),
const Text('浏览器打开'),
Icon(Icons.open_in_browser, size: 19),
Text('浏览器打开'),
],
),
),
@@ -690,16 +683,12 @@ class _LiveRoomPageState extends State<LiveRoomPage>
SmartDialog.showToast(e.toString());
}
},
child: Row(
child: const Row(
spacing: 10,
mainAxisSize: MainAxisSize.min,
mainAxisSize: .min,
children: [
Icon(
Icons.forward_to_inbox,
size: 19,
color: color,
),
const Text('分享至消息'),
Icon(Icons.forward_to_inbox, size: 19),
Text('分享至消息'),
],
),
),
@@ -800,25 +789,20 @@ class _LiveRoomPageState extends State<LiveRoomPage>
Widget get _buildInputWidget {
final child = Container(
padding: EdgeInsets.only(
top: 5,
left: 10,
right: 10,
bottom: padding.bottom,
),
padding: .only(top: 5, left: 10, right: 10, bottom: padding.bottom),
height: 70 + padding.bottom,
decoration: const BoxDecoration(
borderRadius: BorderRadius.vertical(top: Radius.circular(20)),
borderRadius: .vertical(top: .circular(20)),
border: Border(top: BorderSide(color: Color(0x1AFFFFFF))),
color: Color(0x1AFFFFFF),
),
child: GestureDetector(
onTap: _liveRoomController.onSendDanmaku,
behavior: HitTestBehavior.opaque,
behavior: .opaque,
child: Padding(
padding: const EdgeInsets.only(top: 5, bottom: 10),
padding: const .only(top: 5, bottom: 10),
child: Align(
alignment: Alignment.topCenter,
alignment: .topCenter,
child: Row(
spacing: 6,
children: [
@@ -830,9 +814,7 @@ class _LiveRoomPageState extends State<LiveRoomPage>
width: 34,
height: 34,
child: IconButton(
style: IconButton.styleFrom(
padding: EdgeInsets.zero,
),
style: IconButton.styleFrom(padding: .zero),
onPressed: () {
final newVal = !enableShowLiveDanmaku;
plPlayerController.enableShowDanmaku.value = newVal;
@@ -847,12 +829,12 @@ class _LiveRoomPageState extends State<LiveRoomPage>
? const Icon(
size: 22,
CustomIcons.dm_on,
color: Color(0xFFEEEEEE),
color: baseWhite,
)
: const Icon(
size: 22,
CustomIcons.dm_off,
color: Color(0xFFEEEEEE),
color: baseWhite,
),
),
);
@@ -861,7 +843,7 @@ class _LiveRoomPageState extends State<LiveRoomPage>
const Expanded(
child: Text(
'发送弹幕',
style: TextStyle(color: Color(0xFFEEEEEE)),
style: TextStyle(color: baseWhite),
),
),
Builder(
@@ -882,7 +864,7 @@ class _LiveRoomPageState extends State<LiveRoomPage>
dimension: 34,
child: Icon(
size: 22,
color: Color(0xFFEEEEEE),
color: baseWhite,
Icons.thumb_up_off_alt,
),
),
@@ -930,7 +912,7 @@ class _LiveRoomPageState extends State<LiveRoomPage>
onPressed: () => _liveRoomController.onSendDanmaku(true),
icon: const Icon(
size: 22,
color: Color(0xFFEEEEEE),
color: baseWhite,
Icons.emoji_emotions_outlined,
),
),

View File

@@ -7,6 +7,7 @@ import 'package:PiliPlus/plugin/pl_player/widgets/common_btn.dart';
import 'package:PiliPlus/plugin/pl_player/widgets/play_pause_btn.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/storage_key.dart';
import 'package:PiliPlus/utils/theme_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
@@ -36,6 +37,8 @@ class _BottomControlState extends State<BottomControl> with HeaderMixin {
late final LiveRoomController liveRoomCtr = widget.liveRoomCtr;
@override
late final PlPlayerController plPlayerController = widget.plPlayerController;
@override
ThemeData get theme => ThemeUtils.darkTheme;
@override
Widget build(BuildContext context) {

View File

@@ -307,7 +307,6 @@ class _LiveHeaderControlState extends State<LiveHeaderControl>
showModalBottomSheet(
context: context,
useSafeArea: true,
clipBehavior: .hardEdge,
isScrollControlled: true,
constraints: BoxConstraints(
maxWidth: math.min(640, context.mediaQueryShortestSide),
@@ -331,11 +330,7 @@ class _LiveHeaderControlState extends State<LiveHeaderControl>
final currStyle = TextStyle(fontSize: 14, color: secondary);
return Theme(
data: theme.copyWith(dividerColor: Colors.transparent),
child: ListView(
controller: scrollController,
padding: .only(
bottom: MediaQuery.viewPaddingOf(context).bottom + 100,
),
child: Column(
children: [
InkWell(
onTap: Get.back,
@@ -354,90 +349,100 @@ class _LiveHeaderControlState extends State<LiveHeaderControl>
),
),
),
...controller.stream.indexed.map((stream) {
final isCurrStream = stream.$1 == controller.streamIndex;
final streamColor = isCurrStream
? secondary
: onSurfaceVariant;
return _ExpansionTile(
initiallyExpanded: isCurrStream,
iconColor: streamColor,
collapsedIconColor: streamColor,
title: Text(
stream.$2.protocolName ?? stream.$1.toString(),
style: isCurrStream
? currStyle
: const TextStyle(fontSize: 14),
Expanded(
child: ListView(
controller: scrollController,
padding: .only(
bottom: MediaQuery.viewPaddingOf(context).bottom + 100,
),
children: stream.$2.format.indexed.map((format) {
final isCurrFormat =
isCurrStream && format.$1 == controller.formatIndex;
final formatColor = isCurrFormat
children: controller.stream.indexed.map((stream) {
final isCurrStream =
stream.$1 == controller.streamIndex;
final streamColor = isCurrStream
? secondary
: onSurfaceVariant;
return _ExpansionTile(
initiallyExpanded: isCurrFormat,
iconColor: formatColor,
collapsedIconColor: formatColor,
initiallyExpanded: isCurrStream,
iconColor: streamColor,
collapsedIconColor: streamColor,
title: Text(
format.$2.formatName ?? format.$1.toString(),
style: isCurrFormat
stream.$2.protocolName ?? stream.$1.toString(),
style: isCurrStream
? currStyle
: const TextStyle(fontSize: 14),
),
children: format.$2.codec.indexed.map((codec) {
final e = codec.$2;
final isCurrCodec =
isCurrFormat &&
codec.$1 == controller.codecIndex;
final codecColor = isCurrCodec
children: stream.$2.format.indexed.map((format) {
final isCurrFormat =
isCurrStream &&
format.$1 == controller.formatIndex;
final formatColor = isCurrFormat
? secondary
: onSurfaceVariant;
return _ExpansionTile(
initiallyExpanded: isCurrCodec,
iconColor: codecColor,
collapsedIconColor: codecColor,
initiallyExpanded: isCurrFormat,
iconColor: formatColor,
collapsedIconColor: formatColor,
title: Text(
'${e.codecName ?? codec.$1.toString()} (${LiveQuality.fromCode(e.currentQn)?.desc ?? e.currentQn})',
style: isCurrCodec
format.$2.formatName ?? format.$1.toString(),
style: isCurrFormat
? currStyle
: const TextStyle(fontSize: 14),
),
children: e.urlInfo.indexed.map((url) {
final isCurrUrl =
(isCurrCodec &&
url.$1 == controller.liveUrlIndex);
return ListTile(
dense: true,
children: format.$2.codec.indexed.map((codec) {
final e = codec.$2;
final isCurrCodec =
isCurrFormat &&
codec.$1 == controller.codecIndex;
final codecColor = isCurrCodec
? secondary
: onSurfaceVariant;
return _ExpansionTile(
initiallyExpanded: isCurrCodec,
iconColor: codecColor,
collapsedIconColor: codecColor,
title: Text(
'${url.$2.host}${e.baseUrl}...',
style: isCurrUrl
? const TextStyle(fontSize: 14)
: TextStyle(
fontSize: 14,
color: onSurfaceVariant,
),
'${e.codecName ?? codec.$1.toString()} (${LiveQuality.fromCode(e.currentQn)?.desc ?? e.currentQn})',
style: isCurrCodec
? currStyle
: const TextStyle(fontSize: 14),
),
selected: isCurrUrl,
onTap: isCurrUrl
? null
: () {
Get.back();
controller.initLiveUrl(
streamIndex: stream.$1,
formatIndex: format.$1,
codecIndex: codec.$1,
liveUrlIndex: url.$1,
);
},
children: e.urlInfo.indexed.map((url) {
final isCurrUrl =
(isCurrCodec &&
url.$1 == controller.liveUrlIndex);
return ListTile(
dense: true,
title: Text(
'${url.$2.host}${e.baseUrl}...',
style: isCurrUrl
? const TextStyle(fontSize: 14)
: TextStyle(
fontSize: 14,
color: onSurfaceVariant,
),
),
selected: isCurrUrl,
onTap: isCurrUrl
? null
: () {
Get.back();
controller.initLiveUrl(
streamIndex: stream.$1,
formatIndex: format.$1,
codecIndex: codec.$1,
liveUrlIndex: url.$1,
);
},
);
}).toList(),
);
}).toList(),
);
}).toList(),
);
}).toList(),
);
}),
),
),
],
),
);