feat: 直播弹幕2
This commit is contained in:
@ -1,7 +1,9 @@
|
||||
import 'dart:convert';
|
||||
import 'dart:ui';
|
||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:hive/hive.dart';
|
||||
import 'package:ns_danmaku/ns_danmaku.dart';
|
||||
import 'package:pilipala/http/constants.dart';
|
||||
import 'package:pilipala/http/init.dart';
|
||||
import 'package:pilipala/http/live.dart';
|
||||
@ -37,6 +39,7 @@ class LiveRoomController extends GetxController {
|
||||
String token = '';
|
||||
// 弹幕消息列表
|
||||
RxList<LiveMessageModel> messageList = <LiveMessageModel>[].obs;
|
||||
DanmakuController? danmakuController;
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
@ -172,9 +175,28 @@ class LiveRoomController extends GetxController {
|
||||
final List<LiveMessageModel>? liveMsg =
|
||||
LiveUtils.decodeMessage(message);
|
||||
if (liveMsg != null) {
|
||||
messageList.addAll(liveMsg
|
||||
.where((msg) => msg.type == LiveMessageType.chat)
|
||||
.toList());
|
||||
// 过滤出聊天消息
|
||||
var chatMessages =
|
||||
liveMsg.where((msg) => msg.type == LiveMessageType.chat).toList();
|
||||
|
||||
// 添加到 messageList
|
||||
messageList.addAll(chatMessages);
|
||||
|
||||
// 将 chatMessages 转换为 danmakuItems 列表
|
||||
List<DanmakuItem> danmakuItems = chatMessages.map<DanmakuItem>((e) {
|
||||
return DanmakuItem(
|
||||
e.message ?? '',
|
||||
color: Color.fromARGB(
|
||||
255,
|
||||
e.color.r,
|
||||
e.color.g,
|
||||
e.color.b,
|
||||
),
|
||||
);
|
||||
}).toList();
|
||||
|
||||
// 添加到 danmakuController
|
||||
danmakuController?.addItems(danmakuItems);
|
||||
}
|
||||
},
|
||||
onErrorCb: (e) {
|
||||
|
@ -7,6 +7,7 @@ import 'package:flutter/rendering.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:pilipala/common/widgets/network_img_layer.dart';
|
||||
import 'package:pilipala/models/live/message.dart';
|
||||
import 'package:pilipala/pages/danmaku/index.dart';
|
||||
import 'package:pilipala/plugin/pl_player/index.dart';
|
||||
|
||||
import 'controller.dart';
|
||||
@ -22,7 +23,7 @@ class LiveRoomPage extends StatefulWidget {
|
||||
class _LiveRoomPageState extends State<LiveRoomPage>
|
||||
with TickerProviderStateMixin {
|
||||
final LiveRoomController _liveRoomController = Get.put(LiveRoomController());
|
||||
PlPlayerController? plPlayerController;
|
||||
late PlPlayerController plPlayerController;
|
||||
late Future? _futureBuilder;
|
||||
late Future? _futureBuilderFuture;
|
||||
|
||||
@ -32,6 +33,7 @@ class _LiveRoomPageState extends State<LiveRoomPage>
|
||||
final ScrollController _scrollController = ScrollController();
|
||||
late AnimationController fabAnimationCtr;
|
||||
bool _shouldAutoScroll = true;
|
||||
final int roomId = int.parse(Get.parameters['roomid']!);
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
@ -110,8 +112,9 @@ class _LiveRoomPageState extends State<LiveRoomPage>
|
||||
future: _futureBuilderFuture,
|
||||
builder: (BuildContext context, AsyncSnapshot snapshot) {
|
||||
if (snapshot.hasData && snapshot.data['status']) {
|
||||
plPlayerController = _liveRoomController.plPlayerController;
|
||||
return PLVideoPlayer(
|
||||
controller: plPlayerController!,
|
||||
controller: plPlayerController,
|
||||
bottomControl: BottomControl(
|
||||
controller: plPlayerController,
|
||||
liveRoomCtr: _liveRoomController,
|
||||
@ -122,6 +125,14 @@ class _LiveRoomPageState extends State<LiveRoomPage>
|
||||
});
|
||||
},
|
||||
),
|
||||
danmuWidget: PlDanmaku(
|
||||
cid: roomId,
|
||||
playerController: plPlayerController,
|
||||
type: 'live',
|
||||
createdController: (e) {
|
||||
_liveRoomController.danmakuController = e;
|
||||
},
|
||||
),
|
||||
);
|
||||
} else {
|
||||
return const SizedBox();
|
||||
|
Reference in New Issue
Block a user