feat: 动态跳转直播
This commit is contained in:
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 ??
|
|
||||||
''),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
)),
|
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
|
@ -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(
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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']),
|
||||||
),
|
]),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
Reference in New Issue
Block a user