feat: 动态跳转直播

This commit is contained in:
guozhigq
2023-07-13 12:02:30 +08:00
parent 3f457aa7f6
commit 0cbf777220
5 changed files with 105 additions and 61 deletions

View File

@ -6,6 +6,7 @@ import 'package:pilipala/http/search.dart';
import 'package:pilipala/models/common/dynamics_type.dart'; import 'package:pilipala/models/common/dynamics_type.dart';
import 'package:pilipala/models/dynamics/result.dart'; import 'package:pilipala/models/dynamics/result.dart';
import 'package:pilipala/models/dynamics/up.dart'; import 'package:pilipala/models/dynamics/up.dart';
import 'package:pilipala/models/live/item.dart';
import 'package:pilipala/utils/utils.dart'; import 'package:pilipala/utils/utils.dart';
class DynamicsController extends GetxController { class DynamicsController extends GetxController {
@ -119,6 +120,22 @@ class DynamicsController extends GetxController {
Get.toNamed('/dynamicDetail', Get.toNamed('/dynamicDetail',
arguments: {'item': item, 'floor': floor}); arguments: {'item': item, 'floor': floor});
break; break;
case 'DYNAMIC_TYPE_LIVE_RCMD':
DynamicLiveModel liveRcmd = item.modules.moduleDynamic.major.liveRcmd;
ModuleAuthorModel author = item.modules.moduleAuthor;
LiveItemModel liveItem = LiveItemModel.fromJson({
'title': liveRcmd.title,
'uname': author.name,
'cover': liveRcmd.cover,
'mid': author.mid,
'face': author.face,
'roomid': liveRcmd.roomId,
});
Get.toNamed('/liveRoom?roomid=${liveItem.roomId}', arguments: {
'liveItem': liveItem,
'heroTag': liveItem.roomId.toString()
});
break;
} }
} }

View File

@ -1,13 +1,20 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:pilipala/common/constants.dart'; import 'package:pilipala/common/constants.dart';
import 'package:pilipala/common/widgets/badge.dart';
import 'package:pilipala/common/widgets/network_img_layer.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart';
import 'package:pilipala/models/dynamics/result.dart';
import 'package:pilipala/pages/dynamics/index.dart';
import 'package:pilipala/utils/utils.dart'; import 'package:pilipala/utils/utils.dart';
import 'rich_node_panel.dart'; import 'rich_node_panel.dart';
final DynamicsController _dynamicsController = Get.put(DynamicsController());
Widget liveRcmdPanel(item, context, {floor = 1}) { Widget liveRcmdPanel(item, context, {floor = 1}) {
TextStyle authorStyle = TextStyle authorStyle =
TextStyle(color: Theme.of(context).colorScheme.primary); TextStyle(color: Theme.of(context).colorScheme.primary);
int liveStatus = item.modules.moduleDynamic.major.liveRcmd.liveStatus;
DynamicLiveModel liveRcmd = item.modules.moduleDynamic.major.liveRcmd;
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
@ -51,59 +58,67 @@ Widget liveRcmdPanel(item, context, {floor = 1}) {
const SizedBox(height: 6), const SizedBox(height: 6),
], ],
GestureDetector( GestureDetector(
onTap: () {}, onTap: () {
_dynamicsController.pushDetail(item, floor);
},
child: LayoutBuilder(builder: (context, box) { child: LayoutBuilder(builder: (context, box) {
double width = box.maxWidth; double width = box.maxWidth;
return Stack( return Stack(
children: [ children: [
NetworkImgLayer( Hero(
type: floor == 1 ? 'emote' : null, tag: liveRcmd.roomId.toString(),
width: width, child: NetworkImgLayer(
height: width / StyleString.aspectRatio, type: floor == 1 ? 'emote' : null,
src: item.modules.moduleDynamic.major.liveRcmd.cover, width: width,
height: width / StyleString.aspectRatio,
src: item.modules.moduleDynamic.major.liveRcmd.cover,
),
), ),
pBadge(
liveStatus == 1 ? '直播中' : '直播结束', context, 6, 6, null, null),
Positioned( Positioned(
left: 0, left: 0,
right: 0, right: 0,
bottom: 0, bottom: 0,
child: Container( child: Container(
height: 80, height: 80,
padding: const EdgeInsets.fromLTRB(12, 0, 10, 10), padding: const EdgeInsets.fromLTRB(12, 0, 10, 10),
clipBehavior: Clip.hardEdge, clipBehavior: Clip.hardEdge,
decoration: BoxDecoration( decoration: BoxDecoration(
gradient: const LinearGradient( gradient: const LinearGradient(
begin: Alignment.topCenter, begin: Alignment.topCenter,
end: Alignment.bottomCenter, end: Alignment.bottomCenter,
colors: <Color>[ colors: <Color>[
Colors.transparent, Colors.transparent,
Colors.black45, Colors.black45,
],
),
borderRadius: floor == 1
? null
: const BorderRadius.all(Radius.circular(6))),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
DefaultTextStyle.merge(
style: TextStyle(
fontSize: Theme.of(context)
.textTheme
.labelMedium!
.fontSize,
color: Colors.white),
child: Row(
children: [
Text(item.modules.moduleDynamic.major.liveRcmd
.areaName ??
''),
], ],
), ),
borderRadius: floor == 1 ),
? null ],
: const BorderRadius.all(Radius.circular(6))), ),
child: Row( ),
mainAxisAlignment: MainAxisAlignment.spaceBetween, ),
crossAxisAlignment: CrossAxisAlignment.end,
children: [
DefaultTextStyle.merge(
style: TextStyle(
fontSize: Theme.of(context)
.textTheme
.labelMedium!
.fontSize,
color: Colors.white),
child: Row(
children: [
Text(item.modules.moduleDynamic.major.liveRcmd
.areaName ??
''),
],
),
),
],
),
)),
], ],
); );
}), }),

View File

@ -4,6 +4,7 @@ import 'package:get/get.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
import 'package:pilipala/common/widgets/network_img_layer.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart';
import 'package:pilipala/models/dynamics/up.dart'; import 'package:pilipala/models/dynamics/up.dart';
import 'package:pilipala/models/live/item.dart';
import 'package:pilipala/pages/dynamics/controller.dart'; import 'package:pilipala/pages/dynamics/controller.dart';
import 'package:pilipala/utils/storage.dart'; import 'package:pilipala/utils/storage.dart';
@ -148,7 +149,16 @@ class _UpPanelState extends State<UpPanel> {
setState(() {}); setState(() {});
} else if (data.type == 'live') { } else if (data.type == 'live') {
SmartDialog.showToast('直播功能暂未开发'); LiveItemModel liveItem = LiveItemModel.fromJson({
'title': data.title,
'uname': data.uname,
'face': data.face,
'roomid': data.roomId,
});
Get.toNamed(
'/liveRoom?rooid=${data.roomId}',
arguments: {'liveItem': liveItem},
);
} }
}, },
child: Padding( child: Padding(

View File

@ -20,12 +20,13 @@ class LiveRoomController extends GetxController {
@override @override
void onInit() { void onInit() {
super.onInit(); super.onInit();
var args = Get.arguments['liveItem']; if (Get.arguments != null) {
liveItem = args; var args = Get.arguments['liveItem'];
print(liveItem.roomId); liveItem = args;
roomId = liveItem.roomId!; roomId = liveItem.roomId!;
if (args.pic != null && args.pic != '') { if (args.pic != null && args.pic != '') {
cover = args.cover; cover = args.cover;
}
} }
queryLiveInfo(); queryLiveInfo();
} }

View File

@ -91,15 +91,16 @@ class _LiveRoomPageState extends State<LiveRoomPage> {
controller: _meeduPlayerController!, controller: _meeduPlayerController!,
), ),
), ),
Container( if (_liveRoomController.liveItem.watchedShow != null)
color: Theme.of(context).colorScheme.background, Container(
height: 45, color: Theme.of(context).colorScheme.background,
padding: const EdgeInsets.only(left: 12, right: 12), height: 45,
child: Row(children: [ padding: const EdgeInsets.only(left: 12, right: 12),
Text( child: Row(children: [
_liveRoomController.liveItem.watchedShow['text_large']), Text(_liveRoomController
]), .liveItem.watchedShow['text_large']),
), ]),
),
], ],
), ),
) )