Merge branch 'design' into alpha

This commit is contained in:
guozhigq
2023-08-08 17:08:03 +08:00
7 changed files with 241 additions and 326 deletions

View File

@ -89,20 +89,19 @@ class BangumiInfo extends StatefulWidget {
} }
class _BangumiInfoState extends State<BangumiInfo> { class _BangumiInfoState extends State<BangumiInfo> {
late BangumiInfoModel? bangumiItem; String heroTag = Get.arguments['heroTag'];
final BangumiIntroController bangumiIntroController = late final BangumiIntroController bangumiIntroController;
Get.put(BangumiIntroController(), tag: Get.arguments['heroTag']); late final VideoDetailController videoDetailCtr;
late VideoDetailController? videoDetailCtr;
Box localCache = GStrorage.localCache; Box localCache = GStrorage.localCache;
late final BangumiInfoModel? bangumiItem;
late double sheetHeight; late double sheetHeight;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
bangumiIntroController = Get.put(BangumiIntroController(), tag: heroTag);
videoDetailCtr = Get.find<VideoDetailController>(tag: heroTag);
bangumiItem = bangumiIntroController.bangumiItem; bangumiItem = bangumiIntroController.bangumiItem;
videoDetailCtr =
Get.find<VideoDetailController>(tag: Get.arguments['heroTag']);
sheetHeight = localCache.get('sheetHeight'); sheetHeight = localCache.get('sheetHeight');
} }

View File

@ -40,7 +40,7 @@ class _UpPanelState extends State<UpPanel> {
1, 1,
UpItem( UpItem(
face: user.get(UserBoxKey.userFace), face: user.get(UserBoxKey.userFace),
uname: '', uname: '',
mid: user.get(UserBoxKey.userMid), mid: user.get(UserBoxKey.userMid),
), ),
); );

View File

@ -62,7 +62,6 @@ class _VideoIntroPanelState extends State<VideoIntroPanel>
if (snapshot.connectionState == ConnectionState.done) { if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.data['status']) { if (snapshot.data['status']) {
// 请求成功 // 请求成功
// return _buildView(context, false, videoDetail);
return Obx( return Obx(
() => VideoInfo( () => VideoInfo(
loadingStatus: false, loadingStatus: false,
@ -95,22 +94,48 @@ class VideoInfo extends StatefulWidget {
} }
class _VideoInfoState extends State<VideoInfo> with TickerProviderStateMixin { class _VideoInfoState extends State<VideoInfo> with TickerProviderStateMixin {
Map videoItem = Get.put(VideoIntroController()).videoItem!; final String heroTag = Get.arguments['heroTag'];
final VideoIntroController videoIntroController = late final VideoIntroController videoIntroController;
Get.put(VideoIntroController(), tag: Get.arguments['heroTag']); late final VideoDetailController videoDetailCtr;
bool isExpand = false; late final Map<dynamic, dynamic> videoItem;
late VideoDetailController? videoDetailCtr;
Box localCache = GStrorage.localCache; Box localCache = GStrorage.localCache;
late double sheetHeight; late double sheetHeight;
late final bool loadingStatus; // 加载状态
late final int viewCount; // 观看
late final int danmakuCount; // 弹幕
late final String pubDate; // 发布日期
late final owner;
late final follower;
late final followStatus;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
videoDetailCtr = videoIntroController = Get.put(VideoIntroController(), tag: heroTag);
Get.find<VideoDetailController>(tag: Get.arguments['heroTag']); videoDetailCtr = Get.find<VideoDetailController>(tag: heroTag);
videoItem = videoIntroController.videoItem!;
sheetHeight = localCache.get('sheetHeight'); sheetHeight = localCache.get('sheetHeight');
loadingStatus = widget.loadingStatus;
viewCount = !loadingStatus
? widget.videoDetail!.stat!.view
: videoItem['stat'].view;
danmakuCount = !loadingStatus
? widget.videoDetail!.stat!.danmaku
: videoItem['stat'].danmaku;
pubDate = Utils.dateFormat(
!loadingStatus ? widget.videoDetail!.pubdate : videoItem['pubdate'],
formatType: 'detail');
owner = loadingStatus ? videoItem['owner'] : widget.videoDetail!.owner;
follower = loadingStatus
? '-'
: Utils.numFormat(videoIntroController.userStat['follower']);
followStatus = videoIntroController.followStatus;
} }
// 收藏 // 收藏
@ -141,24 +166,39 @@ class _VideoInfoState extends State<VideoInfo> with TickerProviderStateMixin {
); );
} }
// 用户主页
onPushMember() {
feedBack();
int mid = !loadingStatus
? widget.videoDetail!.owner!.mid
: videoItem['owner'].mid;
String face = !loadingStatus
? widget.videoDetail!.owner!.face
: videoItem['owner'].face;
Get.toNamed('/member?mid=$mid',
arguments: {'face': face, 'heroTag': (mid + 99).toString()});
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
ThemeData t = Theme.of(context); ThemeData t = Theme.of(context);
Color outline = t.colorScheme.outline;
return SliverPadding( return SliverPadding(
padding: const EdgeInsets.only( padding: const EdgeInsets.only(
left: StyleString.safeSpace, right: StyleString.safeSpace, top: 10), left: StyleString.safeSpace, right: StyleString.safeSpace, top: 10),
sliver: SliverToBoxAdapter( sliver: SliverToBoxAdapter(
child: !widget.loadingStatus || videoItem.isNotEmpty child: !loadingStatus || videoItem.isNotEmpty
? Column( ? Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
InkWell( GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () => showIntroDetail(), onTap: () => showIntroDetail(),
child: Row( child: Row(
children: [ children: [
Expanded( Expanded(
child: Text( child: Text(
!widget.loadingStatus !loadingStatus
? widget.videoDetail!.title ? widget.videoDetail!.title
: videoItem['title'], : videoItem['title'],
style: const TextStyle( style: const TextStyle(
@ -182,43 +222,27 @@ class _VideoInfoState extends State<VideoInfo> with TickerProviderStateMixin {
return t.highlightColor.withOpacity(0.2); return t.highlightColor.withOpacity(0.2);
}), }),
), ),
onPressed: () => showIntroDetail(), onPressed: showIntroDetail,
icon: const Icon(Icons.more_horiz), icon: const Icon(Icons.more_horiz),
), ),
), ),
], ],
), ),
), ),
InkWell( GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () => showIntroDetail(), onTap: () => showIntroDetail(),
child: Row( child: Row(
children: [ children: [
StatView( StatView(
theme: 'gray', theme: 'gray', view: viewCount, size: 'medium'),
view: !widget.loadingStatus
? widget.videoDetail!.stat!.view
: videoItem['stat'].view,
size: 'medium',
),
const SizedBox(width: 10), const SizedBox(width: 10),
StatDanMu( StatDanMu(
theme: 'gray', theme: 'gray', danmu: danmakuCount, size: 'medium'),
danmu: !widget.loadingStatus
? widget.videoDetail!.stat!.danmaku
: videoItem['stat'].danmaku,
size: 'medium',
),
const SizedBox(width: 10), const SizedBox(width: 10),
Text( Text(
Utils.dateFormat( pubDate,
!widget.loadingStatus style: TextStyle(fontSize: 12, color: outline),
? widget.videoDetail!.pubdate
: videoItem['pubdate'],
formatType: 'detail'),
style: TextStyle(
fontSize: 12,
color: t.colorScheme.outline,
),
), ),
], ],
), ),
@ -237,7 +261,7 @@ class _VideoInfoState extends State<VideoInfo> with TickerProviderStateMixin {
// 点赞收藏转发 布局样式2 // 点赞收藏转发 布局样式2
// actionGrid(context, videoIntroController), // actionGrid(context, videoIntroController),
// 合集 // 合集
if (!widget.loadingStatus && if (!loadingStatus &&
widget.videoDetail!.ugcSeason != null) ...[ widget.videoDetail!.ugcSeason != null) ...[
SeasonPanel( SeasonPanel(
ugcSeason: widget.videoDetail!.ugcSeason!, ugcSeason: widget.videoDetail!.ugcSeason!,
@ -248,94 +272,71 @@ class _VideoInfoState extends State<VideoInfo> with TickerProviderStateMixin {
) )
], ],
GestureDetector( GestureDetector(
onTap: () { onTap: onPushMember,
feedBack(); child: Container(
int mid = !widget.loadingStatus padding: const EdgeInsets.symmetric(
? widget.videoDetail!.owner!.mid vertical: 12, horizontal: 4),
: videoItem['owner'].mid;
String face = !widget.loadingStatus
? widget.videoDetail!.owner!.face
: videoItem['owner'].face;
Get.toNamed('/member?mid=$mid', arguments: {
'face': face,
'heroTag': (mid + 99).toString()
});
},
child: Padding(
padding: const EdgeInsets.only(
top: 12, bottom: 12, left: 4, right: 4),
child: Row( child: Row(
children: [ children: [
NetworkImgLayer( NetworkImgLayer(
type: 'avatar', type: 'avatar',
src: !widget.loadingStatus src: loadingStatus
? widget.videoDetail!.owner!.face ? owner.face
: videoItem['owner'].face, : widget.videoDetail!.owner!.face,
width: 34, width: 34,
height: 34, height: 34,
fadeInDuration: Duration.zero, fadeInDuration: Duration.zero,
fadeOutDuration: Duration.zero, fadeOutDuration: Duration.zero,
), ),
const SizedBox(width: 10), const SizedBox(width: 10),
Text( Text(owner.name,
!widget.loadingStatus style: const TextStyle(fontSize: 13)),
? widget.videoDetail!.owner!.name
: videoItem['owner'].name,
style: const TextStyle(fontSize: 13),
),
const SizedBox(width: 6), const SizedBox(width: 6),
Text( Text(
widget.loadingStatus follower,
? '-'
: Utils.numFormat(
videoIntroController.userStat['follower']),
style: TextStyle( style: TextStyle(
fontSize: t.textTheme.labelSmall!.fontSize, fontSize: t.textTheme.labelSmall!.fontSize,
color: t.colorScheme.outline), color: outline,
),
), ),
const Spacer(), const Spacer(),
AnimatedOpacity( AnimatedOpacity(
opacity: widget.loadingStatus ? 0 : 1, opacity: loadingStatus ? 0 : 1,
duration: const Duration(milliseconds: 150), duration: const Duration(milliseconds: 150),
child: SizedBox( child: SizedBox(
height: 32, height: 32,
child: Obx( child: Obx(
() => videoIntroController () =>
.followStatus.isNotEmpty videoIntroController.followStatus.isNotEmpty
? TextButton( ? TextButton(
onPressed: () => videoIntroController onPressed: videoIntroController
.actionRelationMod(), .actionRelationMod,
style: TextButton.styleFrom( style: TextButton.styleFrom(
padding: const EdgeInsets.only( padding: const EdgeInsets.only(
left: 8, right: 8), left: 8, right: 8),
foregroundColor: foregroundColor:
videoIntroController.followStatus[ followStatus['attribute'] != 0
'attribute'] != ? outline
0
? t.colorScheme.outline
: t.colorScheme.onPrimary, : t.colorScheme.onPrimary,
backgroundColor: videoIntroController backgroundColor:
.followStatus[ followStatus['attribute'] != 0
'attribute'] != ? t.colorScheme
0 .onInverseSurface
? t.colorScheme.onInverseSurface
: t.colorScheme : t.colorScheme
.primary, // 设置按钮背景色 .primary, // 设置按钮背景色
), ),
child: Text( child: Text(
videoIntroController.followStatus[ followStatus['attribute'] != 0
'attribute'] !=
0
? '已关注' ? '已关注'
: '关注', : '关注',
style: TextStyle( style: TextStyle(
fontSize: t.textTheme.labelMedium! fontSize: t.textTheme
.fontSize), .labelMedium!.fontSize),
), ),
) )
: ElevatedButton( : ElevatedButton(
onPressed: () => videoIntroController onPressed: videoIntroController
.actionRelationMod(), .actionRelationMod,
child: const Text('关注'), child: const Text('关注'),
), ),
), ),
@ -359,9 +360,8 @@ class _VideoInfoState extends State<VideoInfo> with TickerProviderStateMixin {
Widget actionGrid(BuildContext context, videoIntroController) { Widget actionGrid(BuildContext context, videoIntroController) {
return LayoutBuilder(builder: (context, constraints) { return LayoutBuilder(builder: (context, constraints) {
return Padding( return Container(
padding: const EdgeInsets.only(top: 6, bottom: 10), padding: const EdgeInsets.only(top: 6, bottom: 10),
child: SizedBox(
height: constraints.maxWidth / 5 * 0.8, height: constraints.maxWidth / 5 * 0.8,
child: GridView.count( child: GridView.count(
primary: false, primary: false,
@ -375,8 +375,8 @@ class _VideoInfoState extends State<VideoInfo> with TickerProviderStateMixin {
selectIcon: const Icon(FontAwesomeIcons.solidThumbsUp), selectIcon: const Icon(FontAwesomeIcons.solidThumbsUp),
onTap: () => videoIntroController.actionLikeVideo(), onTap: () => videoIntroController.actionLikeVideo(),
selectStatus: videoIntroController.hasLike.value, selectStatus: videoIntroController.hasLike.value,
loadingStatus: widget.loadingStatus, loadingStatus: loadingStatus,
text: !widget.loadingStatus text: !loadingStatus
? widget.videoDetail!.stat!.like!.toString() ? widget.videoDetail!.stat!.like!.toString()
: '-'), : '-'),
), ),
@ -384,7 +384,7 @@ class _VideoInfoState extends State<VideoInfo> with TickerProviderStateMixin {
icon: const Icon(FontAwesomeIcons.clock), icon: const Icon(FontAwesomeIcons.clock),
onTap: () => videoIntroController.actionShareVideo(), onTap: () => videoIntroController.actionShareVideo(),
selectStatus: false, selectStatus: false,
loadingStatus: widget.loadingStatus, loadingStatus: loadingStatus,
text: '稍后再看'), text: '稍后再看'),
Obx( Obx(
() => ActionItem( () => ActionItem(
@ -392,8 +392,8 @@ class _VideoInfoState extends State<VideoInfo> with TickerProviderStateMixin {
selectIcon: const Icon(FontAwesomeIcons.b), selectIcon: const Icon(FontAwesomeIcons.b),
onTap: () => videoIntroController.actionCoinVideo(), onTap: () => videoIntroController.actionCoinVideo(),
selectStatus: videoIntroController.hasCoin.value, selectStatus: videoIntroController.hasCoin.value,
loadingStatus: widget.loadingStatus, loadingStatus: loadingStatus,
text: !widget.loadingStatus text: !loadingStatus
? widget.videoDetail!.stat!.coin!.toString() ? widget.videoDetail!.stat!.coin!.toString()
: '-'), : '-'),
), ),
@ -404,8 +404,8 @@ class _VideoInfoState extends State<VideoInfo> with TickerProviderStateMixin {
// onTap: () => videoIntroController.actionFavVideo(), // onTap: () => videoIntroController.actionFavVideo(),
onTap: () => showFavBottomSheet(), onTap: () => showFavBottomSheet(),
selectStatus: videoIntroController.hasFav.value, selectStatus: videoIntroController.hasFav.value,
loadingStatus: widget.loadingStatus, loadingStatus: loadingStatus,
text: !widget.loadingStatus text: !loadingStatus
? widget.videoDetail!.stat!.favorite!.toString() ? widget.videoDetail!.stat!.favorite!.toString()
: '-'), : '-'),
), ),
@ -413,13 +413,12 @@ class _VideoInfoState extends State<VideoInfo> with TickerProviderStateMixin {
icon: const Icon(FontAwesomeIcons.shareFromSquare), icon: const Icon(FontAwesomeIcons.shareFromSquare),
onTap: () => videoIntroController.actionShareVideo(), onTap: () => videoIntroController.actionShareVideo(),
selectStatus: false, selectStatus: false,
loadingStatus: widget.loadingStatus, loadingStatus: loadingStatus,
text: !widget.loadingStatus text: !loadingStatus
? widget.videoDetail!.stat!.share!.toString() ? widget.videoDetail!.stat!.share!.toString()
: '-'), : '-'),
], ],
), ),
),
); );
}); });
} }
@ -431,10 +430,9 @@ class _VideoInfoState extends State<VideoInfo> with TickerProviderStateMixin {
icon: const Icon(FontAwesomeIcons.thumbsUp), icon: const Icon(FontAwesomeIcons.thumbsUp),
onTap: () => videoIntroController.actionLikeVideo(), onTap: () => videoIntroController.actionLikeVideo(),
selectStatus: videoIntroController.hasLike.value, selectStatus: videoIntroController.hasLike.value,
loadingStatus: widget.loadingStatus, loadingStatus: loadingStatus,
text: !widget.loadingStatus text:
? widget.videoDetail!.stat!.like!.toString() !loadingStatus ? widget.videoDetail!.stat!.like!.toString() : '-',
: '-',
), ),
), ),
const SizedBox(width: 8), const SizedBox(width: 8),
@ -443,10 +441,9 @@ class _VideoInfoState extends State<VideoInfo> with TickerProviderStateMixin {
icon: const Icon(FontAwesomeIcons.b), icon: const Icon(FontAwesomeIcons.b),
onTap: () => videoIntroController.actionCoinVideo(), onTap: () => videoIntroController.actionCoinVideo(),
selectStatus: videoIntroController.hasCoin.value, selectStatus: videoIntroController.hasCoin.value,
loadingStatus: widget.loadingStatus, loadingStatus: loadingStatus,
text: !widget.loadingStatus text:
? widget.videoDetail!.stat!.coin!.toString() !loadingStatus ? widget.videoDetail!.stat!.coin!.toString() : '-',
: '-',
), ),
), ),
const SizedBox(width: 8), const SizedBox(width: 8),
@ -455,8 +452,8 @@ class _VideoInfoState extends State<VideoInfo> with TickerProviderStateMixin {
icon: const Icon(FontAwesomeIcons.heart), icon: const Icon(FontAwesomeIcons.heart),
onTap: () => showFavBottomSheet(), onTap: () => showFavBottomSheet(),
selectStatus: videoIntroController.hasFav.value, selectStatus: videoIntroController.hasFav.value,
loadingStatus: widget.loadingStatus, loadingStatus: loadingStatus,
text: !widget.loadingStatus text: !loadingStatus
? widget.videoDetail!.stat!.favorite!.toString() ? widget.videoDetail!.stat!.favorite!.toString()
: '-', : '-',
), ),
@ -468,57 +465,20 @@ class _VideoInfoState extends State<VideoInfo> with TickerProviderStateMixin {
videoDetailCtr.tabCtr.animateTo(1); videoDetailCtr.tabCtr.animateTo(1);
}, },
selectStatus: false, selectStatus: false,
loadingStatus: widget.loadingStatus, loadingStatus: loadingStatus,
text: !widget.loadingStatus text:
? widget.videoDetail!.stat!.reply!.toString() !loadingStatus ? widget.videoDetail!.stat!.reply!.toString() : '-',
: '-',
), ),
const SizedBox(width: 8), const SizedBox(width: 8),
ActionRowItem( ActionRowItem(
icon: const Icon(FontAwesomeIcons.share), icon: const Icon(FontAwesomeIcons.share),
onTap: () => videoIntroController.actionShareVideo(), onTap: () => videoIntroController.actionShareVideo(),
selectStatus: false, selectStatus: false,
loadingStatus: widget.loadingStatus, loadingStatus: loadingStatus,
// text: !widget.loadingStatus // text: !loadingStatus
// ? widget.videoDetail!.stat!.share!.toString() // ? widget.videoDetail!.stat!.share!.toString()
// : '-', // : '-',
text: '转发'), text: '转发'),
]); ]);
} }
InlineSpan buildContent(BuildContext context, content) {
String desc = content.desc;
List descV2 = content.descV2;
// type
// 1 普通文本
// 2 @用户
List<InlineSpan> spanChilds = [];
if (descV2.isNotEmpty) {
for (var i = 0; i < descV2.length; i++) {
if (descV2[i].type == 1) {
spanChilds.add(TextSpan(text: descV2[i].rawText));
} else if (descV2[i].type == 2) {
spanChilds.add(
TextSpan(
text: '@${descV2[i].rawText}',
style: TextStyle(
color: Theme.of(context).colorScheme.primary,
),
recognizer: TapGestureRecognizer()
..onTap = () {
String heroTag = Utils.makeHeroTag(descV2[i].bizId);
Get.toNamed(
'/member?mid=${descV2[i].bizId}',
arguments: {'face': '', 'heroTag': heroTag},
);
},
),
);
}
}
} else {
spanChilds.add(TextSpan(text: desc));
}
return TextSpan(children: spanChilds);
}
} }

View File

@ -125,33 +125,29 @@ class IntroDetail extends StatelessWidget {
// type // type
// 1 普通文本 // 1 普通文本
// 2 @用户 // 2 @用户
List<InlineSpan> spanChilds = []; List<TextSpan> spanChilds = List.generate(descV2.length, (index) {
if (descV2.isNotEmpty) { final currentDesc = descV2[index];
for (var i = 0; i < descV2.length; i++) { switch (currentDesc.type) {
if (descV2[i].type == 1) { case 1:
spanChilds.add(TextSpan(text: descV2[i].rawText)); return TextSpan(text: currentDesc.rawText);
} else if (descV2[i].type == 2) { case 2:
spanChilds.add( final colorSchemePrimary = Theme.of(context).colorScheme.primary;
TextSpan( final heroTag = Utils.makeHeroTag(currentDesc.bizId);
text: '@${descV2[i].rawText}', return TextSpan(
style: TextStyle( text: '@${currentDesc.rawText}',
color: Theme.of(context).colorScheme.primary, style: TextStyle(color: colorSchemePrimary),
),
recognizer: TapGestureRecognizer() recognizer: TapGestureRecognizer()
..onTap = () { ..onTap = () {
String heroTag = Utils.makeHeroTag(descV2[i].bizId);
Get.toNamed( Get.toNamed(
'/member?mid=${descV2[i].bizId}', '/member?mid=${currentDesc.bizId}',
arguments: {'face': '', 'heroTag': heroTag}, arguments: {'face': '', 'heroTag': heroTag},
); );
}, },
),
); );
default:
return TextSpan();
} }
} });
} else {
spanChilds.add(TextSpan(text: desc));
}
return TextSpan(children: spanChilds); return TextSpan(children: spanChilds);
} }
} }

View File

@ -391,6 +391,7 @@ class ReplyItemRow extends StatelessWidget {
), ),
if (replies![i].isUp) if (replies![i].isUp)
const WidgetSpan( const WidgetSpan(
alignment: PlaceholderAlignment.top,
child: UpTag(), child: UpTag(),
), ),
buildContent( buildContent(

View File

@ -118,7 +118,7 @@ class _VideoReplyNewDialogState extends State<VideoReplyNewDialog>
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Container(
height: 400, height: 500,
clipBehavior: Clip.hardEdge, clipBehavior: Clip.hardEdge,
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: const BorderRadius.only( borderRadius: const BorderRadius.only(

View File

@ -1,4 +1,5 @@
import 'dart:async'; import 'dart:async';
import 'dart:ui';
import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart'; import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
@ -287,46 +288,7 @@ class _VideoDetailPageState extends State<VideoDetailPage>
onlyOneScrollInBody: true, onlyOneScrollInBody: true,
body: Container( body: Container(
color: Theme.of(context).colorScheme.background, color: Theme.of(context).colorScheme.background,
child: Column( child: Expanded(
children: [
Opacity(
opacity: 0,
child: Container(
width: double.infinity,
height: 0,
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
color: Theme.of(context)
.dividerColor
.withOpacity(0.1),
),
),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
children: [
Container(
width: 280,
margin: const EdgeInsets.only(left: 20),
child: Obx(
() => TabBar(
controller: videoDetailController.tabCtr,
dividerColor: Colors.transparent,
indicatorColor:
Theme.of(context).colorScheme.background,
tabs: videoDetailController.tabs
.map((String name) => Tab(text: name))
.toList(),
),
),
),
],
),
),
),
Expanded(
child: TabBarView( child: TabBarView(
controller: videoDetailController.tabCtr, controller: videoDetailController.tabCtr,
children: [ children: [
@ -349,8 +311,7 @@ class _VideoDetailPageState extends State<VideoDetailPage>
pinned: true, pinned: true,
delegate: SliverHeaderDelegate( delegate: SliverHeaderDelegate(
height: 50, height: 50,
child: child: const MenuRow(loadingStatus: false),
const MenuRow(loadingStatus: false),
), ),
), ),
], ],
@ -365,8 +326,6 @@ class _VideoDetailPageState extends State<VideoDetailPage>
], ],
), ),
), ),
],
),
), ),
), ),
), ),