opt: code

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2024-11-28 16:16:40 +08:00
parent 1f71dc9a67
commit f4866258d2
41 changed files with 943 additions and 1223 deletions

View File

@@ -168,7 +168,7 @@ class _AppExpansionPanelListState extends State<AppExpansionPanelList> {
if (widget.expansionCallback != null &&
childIndex != index &&
child.value == _currentOpenPanel?.value) {
widget.expansionCallback!(childIndex, false);
widget.expansionCallback?.call(childIndex, false);
}
}

View File

@@ -6,16 +6,10 @@ import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter_html/flutter_html.dart';
class ArticleContent extends StatelessWidget {
const ArticleContent({
super.key,
required this.list,
});
final List<ArticleContentModel> list;
@override
Widget build(BuildContext context) {
Widget articleContent({
required BuildContext context,
required List<ArticleContentModel> list,
}) {
List<String>? imgList = list
.where((item) => item.pic != null)
.toList()
@@ -92,4 +86,3 @@ class ArticleContent extends StatelessWidget {
separatorBuilder: (context, index) => const SizedBox(height: 10),
);
}
}

View File

@@ -3,25 +3,13 @@ import 'package:flutter/material.dart';
import 'package:flutter_html/flutter_html.dart';
import 'network_img_layer.dart';
// ignore: must_be_immutable
class HtmlRender extends StatelessWidget {
const HtmlRender({
this.htmlContent,
this.imgCount,
this.imgList,
required this.constrainedWidth,
super.key,
});
final String? htmlContent;
final int? imgCount;
final List<String>? imgList;
final double constrainedWidth;
@override
Widget build(BuildContext context) {
// double textScale =
// setting.get(SettingBoxKey.defaultTextScale, defaultValue: 1.0);
Widget htmlRender({
required BuildContext context,
String? htmlContent,
int? imgCount,
List<String>? imgList,
required double constrainedWidth,
}) {
return SelectionArea(
child: Html(
data: htmlContent,
@@ -31,8 +19,7 @@ class HtmlRender extends StatelessWidget {
tagsToExtend: <String>{'img'},
builder: (ExtensionContext extensionContext) {
try {
final Map<String, dynamic> attributes =
extensionContext.attributes;
final Map<String, dynamic> attributes = extensionContext.attributes;
final List<dynamic> key = attributes.keys.toList();
String imgUrl = key.contains('src')
? attributes['src'] as String
@@ -138,4 +125,3 @@ class HtmlRender extends StatelessWidget {
},
));
}
}

View File

@@ -13,53 +13,6 @@ import 'package:scrollable_positioned_list/scrollable_positioned_list.dart';
import '../../utils/storage.dart';
import '../../utils/utils.dart';
class ListSheet {
ListSheet({
this.index,
this.season,
required this.episodes,
this.bvid,
this.aid,
required this.currentCid,
required this.changeFucCall,
required this.context,
this.scaffoldState,
});
final dynamic index;
final dynamic season;
final dynamic episodes;
final String? bvid;
final int? aid;
final int currentCid;
final Function changeFucCall;
final BuildContext context;
final ScaffoldState? scaffoldState;
late PersistentBottomSheetController bottomSheetController;
Widget get listSheetContent => ListSheetContent(
index: index,
season: season,
episodes: episodes,
bvid: bvid,
aid: aid,
currentCid: currentCid,
changeFucCall: changeFucCall,
onClose: bottomSheetController.close,
);
void buildShowBottomSheet() {
bottomSheetController = scaffoldState?.showBottomSheet(
(context) => listSheetContent,
) ??
showBottomSheet(
context: context,
builder: (context) => listSheetContent,
);
}
}
class ListSheetContent extends StatefulWidget {
const ListSheetContent({
super.key,
@@ -80,7 +33,7 @@ class ListSheetContent extends StatefulWidget {
final int? aid;
final int currentCid;
final Function changeFucCall;
final Function() onClose;
final VoidCallback? onClose;
@override
State<ListSheetContent> createState() => _ListSheetContentState();
@@ -184,7 +137,7 @@ class _ListSheetContentState extends State<ListSheetContent>
}
}
SmartDialog.showToast('切换到:$title');
widget.onClose();
widget.onClose?.call();
widget.changeFucCall(
episode is bangumi.EpisodeItem ? episode.epId : null,
episode.runtimeType.toString() == "EpisodeItem"

View File

@@ -53,31 +53,21 @@ class LiveCard extends StatelessWidget {
child: AnimatedOpacity(
opacity: 1,
duration: const Duration(milliseconds: 200),
child: LiveStat(
// view: liveItem.stat.view,
// danmaku: liveItem.stat.danmaku,
// duration: liveItem.duration,
online: liveItem.online as int,
),
child: liveStat(context),
),
),
],
);
}),
),
LiveContent(liveItem: liveItem)
liveContent(context)
],
),
),
);
}
}
class LiveContent extends StatelessWidget {
final dynamic liveItem;
const LiveContent({super.key, required this.liveItem});
@override
Widget build(BuildContext context) {
Widget liveContent(context) {
return Padding(
// 多列
padding: const EdgeInsets.fromLTRB(8, 8, 6, 7),
@@ -109,15 +99,8 @@ class LiveContent extends StatelessWidget {
),
);
}
}
class LiveStat extends StatelessWidget {
const LiveStat({super.key, required this.online});
final int? online;
@override
Widget build(BuildContext context) {
Widget liveStat(context) {
return Container(
height: 45,
padding: const EdgeInsets.only(top: 22, left: 8, right: 8),
@@ -149,7 +132,7 @@ class LiveStat extends StatelessWidget {
// ],
// ),
Text(
online.toString(),
liveItem.online.toString(),
style: const TextStyle(fontSize: 11, color: Colors.white),
)
],

View File

@@ -53,7 +53,7 @@ class OverlayPop extends StatelessWidget {
style: ButtonStyle(
padding: WidgetStateProperty.all(EdgeInsets.zero),
),
onPressed: () => closeFn!(),
onPressed: () => closeFn?.call(),
icon: const Icon(
Icons.close,
size: 18,
@@ -93,7 +93,7 @@ class OverlayPop extends StatelessWidget {
: (videoItem.cover as String).http2https)
],
);
closeFn!();
closeFn?.call();
},
icon: const Icon(Icons.download, size: 20),
)

View File

@@ -1,15 +1,12 @@
import 'package:flutter/material.dart';
import 'package:PiliPalaX/utils/utils.dart';
class StatDanMu extends StatelessWidget {
final String? theme;
final dynamic danmu;
final String? size;
const StatDanMu({super.key, this.theme, this.danmu, this.size});
@override
Widget build(BuildContext context) {
Widget statDanMu({
required BuildContext context,
String? theme,
dynamic danmu,
String? size,
}) {
Map<String, Color> colorObject = {
'white': Colors.white,
'gray': Theme.of(context).colorScheme.outline.withOpacity(0.8),
@@ -37,4 +34,3 @@ class StatDanMu extends StatelessWidget {
],
);
}
}

View File

@@ -1,16 +1,13 @@
import 'package:flutter/material.dart';
import 'package:PiliPalaX/utils/utils.dart';
class StatView extends StatelessWidget {
final String? theme;
final dynamic view;
final String? size;
final String? goto;
const StatView({super.key, this.theme, this.view, this.size, this.goto});
@override
Widget build(BuildContext context) {
Widget statView({
required BuildContext context,
String? theme,
dynamic view,
String? size,
String? goto,
}) {
Map<String, Color> colorObject = {
'white': Colors.white,
'gray': Theme.of(context).colorScheme.outline.withOpacity(0.8),
@@ -41,4 +38,3 @@ class StatView extends StatelessWidget {
],
);
}
}

View File

@@ -55,11 +55,7 @@ class VideoCardH extends StatelessWidget {
},
child: InkWell(
borderRadius: BorderRadius.circular(12),
onLongPress: () {
if (longPress != null) {
longPress!();
}
},
onLongPress: longPress,
onTap: () async {
if (type == 'ketang') {
SmartDialog.showToast('课堂视频暂不支持播放');
@@ -120,14 +116,7 @@ class VideoCardH extends StatelessWidget {
},
),
),
VideoContent(
videoItem: videoItem,
source: source,
showOwner: showOwner,
showView: showView,
showDanmaku: showDanmaku,
showPubdate: showPubdate,
)
videoContent(context)
],
);
},
@@ -146,28 +135,8 @@ class VideoCardH extends StatelessWidget {
),
]);
}
}
class VideoContent extends StatelessWidget {
final dynamic videoItem;
final String source;
final bool showOwner;
final bool showView;
final bool showDanmaku;
final bool showPubdate;
const VideoContent({
super.key,
required this.videoItem,
this.source = 'normal',
this.showOwner = true,
this.showView = true,
this.showDanmaku = true,
this.showPubdate = false,
});
@override
Widget build(BuildContext context) {
Widget videoContent(context) {
String pubdate = showPubdate
? Utils.dateFormat(videoItem.pubdate!, formatType: 'day')
: '';
@@ -258,14 +227,16 @@ class VideoContent extends StatelessWidget {
Row(
children: [
if (showView) ...[
StatView(
statView(
context: context,
theme: 'gray',
view: videoItem.stat.view as int,
),
const SizedBox(width: 8),
],
if (showDanmaku)
StatDanMu(
statDanMu(
context: context,
theme: 'gray',
danmu: videoItem.stat.danmu as int,
),

View File

@@ -50,11 +50,7 @@ class VideoCardHGrpc extends StatelessWidget {
// },
child: InkWell(
borderRadius: BorderRadius.circular(12),
onLongPress: () {
if (longPress != null) {
longPress!();
}
},
onLongPress: longPress,
onTap: () async {
if (type == 'ketang') {
SmartDialog.showToast('课堂视频暂不支持播放');
@@ -121,14 +117,7 @@ class VideoCardHGrpc extends StatelessWidget {
},
),
),
VideoContent(
videoItem: videoItem,
source: source,
showOwner: showOwner,
showView: showView,
showDanmaku: showDanmaku,
showPubdate: showPubdate,
)
videoContent(context)
],
);
},
@@ -147,32 +136,8 @@ class VideoCardHGrpc extends StatelessWidget {
// ),
]);
}
}
class VideoContent extends StatelessWidget {
final card.Card videoItem;
final String source;
final bool showOwner;
final bool showView;
final bool showDanmaku;
final bool showPubdate;
const VideoContent({
super.key,
required this.videoItem,
this.source = 'normal',
this.showOwner = true,
this.showView = true,
this.showDanmaku = true,
this.showPubdate = false,
});
@override
Widget build(BuildContext context) {
// String pubdate = showPubdate
// ? Utils.dateFormat(videoItem.pubdate!, formatType: 'day')
// : '';
// if (pubdate != '') pubdate += ' ';
Widget videoContent(context) {
return Expanded(
child: Padding(
padding: const EdgeInsets.fromLTRB(10, 0, 6, 0),

View File

@@ -30,11 +30,7 @@ class VideoCardHMemberVideo extends StatelessWidget {
return Stack(children: [
InkWell(
borderRadius: BorderRadius.circular(12),
onLongPress: () {
if (longPress != null) {
longPress!();
}
},
onLongPress: longPress,
onTap: () async {
try {
Get.toNamed('/video?bvid=$bvid&cid=${videoItem.firstCid}',
@@ -87,9 +83,7 @@ class VideoCardHMemberVideo extends StatelessWidget {
},
),
),
VideoContent(
videoItem: videoItem,
)
videoContent(context)
],
);
},
@@ -106,18 +100,8 @@ class VideoCardHMemberVideo extends StatelessWidget {
),
]);
}
}
class VideoContent extends StatelessWidget {
final Item videoItem;
const VideoContent({
super.key,
required this.videoItem,
});
@override
Widget build(BuildContext context) {
Widget videoContent(context) {
return Expanded(
child: Padding(
padding: const EdgeInsets.fromLTRB(10, 0, 6, 0),
@@ -157,14 +141,16 @@ class VideoContent extends StatelessWidget {
const SizedBox(height: 3),
Row(
children: [
StatView(
statView(
context: context,
theme: 'gray',
// view: videoItem.season?['view_content'] ??
// videoItem.viewContent,
view: videoItem.viewContent,
),
const SizedBox(width: 8),
StatDanMu(
statDanMu(
context: context,
theme: 'gray',
// danmu: videoItem.season?['danmaku'] ?? videoItem.danmaku,
danmu: videoItem.danmaku,

View File

@@ -158,11 +158,7 @@ class VideoCardV extends StatelessWidget {
margin: EdgeInsets.zero,
child: InkWell(
onTap: () async => onPushDetail(heroTag),
onLongPress: () {
if (longPress != null) {
longPress!();
}
},
onLongPress: longPress,
child: Column(
children: [
AspectRatio(
@@ -194,7 +190,7 @@ class VideoCardV extends StatelessWidget {
);
}),
),
VideoContent(videoItem: videoItem)
videoContent(context)
],
),
),
@@ -211,13 +207,8 @@ class VideoCardV extends StatelessWidget {
)),
]);
}
}
class VideoContent extends StatelessWidget {
final dynamic videoItem;
const VideoContent({super.key, required this.videoItem});
@override
Widget build(BuildContext context) {
Widget videoContent(context) {
return Expanded(
child: Padding(
padding: const EdgeInsets.fromLTRB(6, 5, 6, 5),
@@ -241,9 +232,7 @@ class VideoContent extends StatelessWidget {
),
const Spacer(),
// const SizedBox(height: 2),
VideoStat(
videoItem: videoItem,
),
videoStat(context),
Row(
children: [
if (videoItem.goto == 'bangumi') ...[
@@ -303,28 +292,20 @@ class VideoContent extends StatelessWidget {
),
);
}
}
class VideoStat extends StatelessWidget {
final dynamic videoItem;
const VideoStat({
super.key,
required this.videoItem,
});
@override
Widget build(BuildContext context) {
Widget videoStat(context) {
return Row(
children: [
StatView(
statView(
context: context,
theme: 'gray',
view: videoItem.stat.view,
goto: videoItem.goto,
),
const SizedBox(width: 6),
if (videoItem.goto != 'picture')
StatDanMu(
statDanMu(
context: context,
theme: 'gray',
danmu: videoItem.stat.danmu,
),

View File

@@ -147,11 +147,7 @@ class VideoCardVMemberHome extends StatelessWidget {
margin: EdgeInsets.zero,
child: InkWell(
onTap: () async => onPushDetail(heroTag),
onLongPress: () {
if (longPress != null) {
longPress!();
}
},
onLongPress: longPress,
child: Column(
children: [
AspectRatio(

View File

@@ -312,7 +312,8 @@ class _BangumiInfoState extends State<BangumiInfo>
),
Row(
children: [
StatView(
statView(
context: context,
theme: 'gray',
view: !widget.loadingStatus
? widget.bangumiDetail!.stat!['views']
@@ -320,7 +321,8 @@ class _BangumiInfoState extends State<BangumiInfo>
size: 'medium',
),
const SizedBox(width: 6),
StatDanMu(
statDanMu(
context: context,
theme: 'gray',
danmu: !widget.loadingStatus
? widget

View File

@@ -59,13 +59,15 @@ class IntroDetail extends StatelessWidget {
const SizedBox(height: 4),
Row(
children: [
StatView(
statView(
context: context,
theme: 'gray',
view: bangumiDetail!.stat!['views'],
size: 'medium',
),
const SizedBox(width: 6),
StatDanMu(
statDanMu(
context: context,
theme: 'gray',
danmu: bangumiDetail!.stat!['danmakus'],
size: 'medium',

View File

@@ -123,20 +123,15 @@ class BangumiCardV extends StatelessWidget {
}),
),
),
BangumiContent(bangumiItem: bangumiItem)
bagumiContent(context)
],
),
),
),
);
}
}
class BangumiContent extends StatelessWidget {
const BangumiContent({super.key, required this.bangumiItem});
final dynamic bangumiItem;
@override
Widget build(BuildContext context) {
Widget bagumiContent(context) {
return Expanded(
child: Padding(
// 多列

View File

@@ -254,9 +254,7 @@ class MorePanel extends StatelessWidget {
TextButton(
onPressed: () {
Get.back();
if (onRemove != null) {
onRemove!(item.idStr);
}
onRemove?.call(item.idStr);
},
child: const Text('确定'),
),

View File

@@ -255,9 +255,7 @@ class MorePanel extends StatelessWidget {
TextButton(
onPressed: () {
Get.back();
if (onRemove != null) {
onRemove!(item.idStr);
}
onRemove?.call(item.idStr);
},
child: const Text('确定'),
),

View File

@@ -1,4 +1,3 @@
import 'package:PiliPalaX/models/user/fav_folder.dart';
import 'package:PiliPalaX/utils/utils.dart';
import 'package:flutter/material.dart';
import 'package:PiliPalaX/common/constants.dart';
@@ -48,7 +47,7 @@ class FavItem extends StatelessWidget {
},
),
),
VideoContent(favFolderItem: favFolderItem)
videoContent(context)
],
),
);
@@ -57,14 +56,8 @@ class FavItem extends StatelessWidget {
),
);
}
}
class VideoContent extends StatelessWidget {
final FavFolderItemData favFolderItem;
const VideoContent({super.key, required this.favFolderItem});
@override
Widget build(BuildContext context) {
Widget videoContent(context) {
return Expanded(
child: Padding(
padding: const EdgeInsets.fromLTRB(10, 2, 6, 0),

View File

@@ -116,11 +116,7 @@ class FavVideoCardH extends StatelessWidget {
},
),
),
VideoContent(
videoItem: videoItem,
callFn: callFn,
searchType: searchType,
)
videoContent(context)
],
),
);
@@ -131,21 +127,8 @@ class FavVideoCardH extends StatelessWidget {
),
);
}
}
class VideoContent extends StatelessWidget {
final dynamic videoItem;
final Function? callFn;
final int? searchType;
const VideoContent({
super.key,
required this.videoItem,
this.callFn,
this.searchType,
});
@override
Widget build(BuildContext context) {
Widget videoContent(context) {
return Expanded(
child: Padding(
padding: const EdgeInsets.fromLTRB(10, 2, 6, 0),
@@ -195,13 +178,17 @@ class VideoContent extends StatelessWidget {
padding: const EdgeInsets.only(top: 2),
child: Row(
children: [
StatView(
statView(
context: context,
theme: 'gray',
view: videoItem.cntInfo['play'],
),
const SizedBox(width: 8),
StatDanMu(
theme: 'gray', danmu: videoItem.cntInfo['danmaku']),
statDanMu(
context: context,
theme: 'gray',
danmu: videoItem.cntInfo['danmaku'],
),
const Spacer(),
],
),
@@ -236,7 +223,7 @@ class VideoContent extends StatelessWidget {
)),
TextButton(
onPressed: () async {
await callFn!();
await callFn?.call();
Get.back();
},
child: const Text('确定取消'),

View File

@@ -37,7 +37,7 @@ class HistoryItem extends StatelessWidget {
onTap: () async {
if (ctr!.enableMultiple.value) {
feedBack();
onChoose!();
onChoose?.call();
return;
}
if (videoItem.history.business.contains('article')) {
@@ -158,8 +158,8 @@ class HistoryItem extends StatelessWidget {
if (!ctr!.enableMultiple.value) {
feedBack();
ctr!.enableMultiple.value = true;
onChoose!();
onUpdateMultiple!();
onChoose?.call();
onUpdateMultiple?.call();
}
},
child: Column(
@@ -264,7 +264,7 @@ class HistoryItem extends StatelessWidget {
),
onPressed: () {
feedBack();
onChoose!();
onChoose?.call();
},
icon: Icon(Icons.done_all_outlined,
color: Theme.of(context)
@@ -301,7 +301,7 @@ class HistoryItem extends StatelessWidget {
)
],
),
VideoContent(videoItem: videoItem, ctr: ctr)
videoContent(context)
],
),
);
@@ -312,15 +312,8 @@ class HistoryItem extends StatelessWidget {
),
);
}
}
class VideoContent extends StatelessWidget {
final dynamic videoItem;
final dynamic ctr;
const VideoContent({super.key, required this.videoItem, this.ctr});
@override
Widget build(BuildContext context) {
Widget videoContent(context) {
return Expanded(
child: Padding(
padding: const EdgeInsets.fromLTRB(10, 2, 6, 0),

View File

@@ -448,12 +448,14 @@ class _HtmlRenderPageState extends State<HtmlRenderPage>
sliver: Obx(
() => _htmlRenderCtr.loaded.value
? _htmlRenderCtr.response['isJsonContent'] == true
? ArticleContent(
? articleContent(
context: context,
list: _htmlRenderCtr.response['content'],
)
: SliverToBoxAdapter(
child: LayoutBuilder(
builder: (_, constraints) => HtmlRender(
builder: (_, constraints) => htmlRender(
context: context,
htmlContent: _htmlRenderCtr.response['content'],
constrainedWidth: constraints.maxWidth,
),

View File

@@ -29,11 +29,7 @@ class LiveCardV extends StatelessWidget {
Get.toNamed('/liveRoom?roomid=${liveItem.roomId}',
arguments: {'liveItem': liveItem, 'heroTag': heroTag});
},
onLongPress: () {
if (longPress != null) {
longPress!();
}
},
onLongPress: longPress,
child: Column(
children: [
ClipRRect(
@@ -60,9 +56,7 @@ class LiveCardV extends StatelessWidget {
child: AnimatedOpacity(
opacity: 1,
duration: const Duration(milliseconds: 200),
child: VideoStat(
liveItem: liveItem,
),
child: videoStat(context),
),
),
],
@@ -70,19 +64,14 @@ class LiveCardV extends StatelessWidget {
}),
),
),
LiveContent(liveItem: liveItem)
liveContent(context)
],
),
),
);
}
}
class LiveContent extends StatelessWidget {
final dynamic liveItem;
const LiveContent({super.key, required this.liveItem});
@override
Widget build(BuildContext context) {
Widget liveContent(context) {
return Expanded(
flex: 1,
child: Padding(
@@ -92,7 +81,7 @@ class LiveContent extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
liveItem.title,
'${liveItem.title}',
textAlign: TextAlign.start,
style: const TextStyle(
fontWeight: FontWeight.w400,
@@ -105,7 +94,7 @@ class LiveContent extends StatelessWidget {
children: [
Expanded(
child: Text(
liveItem.uname,
'${liveItem.uname}',
textAlign: TextAlign.start,
style: TextStyle(
fontSize:
@@ -123,18 +112,8 @@ class LiveContent extends StatelessWidget {
),
);
}
}
class VideoStat extends StatelessWidget {
final LiveItemModel? liveItem;
const VideoStat({
super.key,
required this.liveItem,
});
@override
Widget build(BuildContext context) {
Widget videoStat(context) {
return Container(
height: 50,
padding: const EdgeInsets.only(top: 26, left: 10, right: 10),
@@ -153,14 +132,14 @@ class VideoStat extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
liveItem!.areaName!,
'${liveItem.areaName}',
style: const TextStyle(fontSize: 11, color: Colors.white),
semanticsLabel: "${liveItem!.areaName!}直播",
semanticsLabel: "${liveItem.areaName}直播",
),
Text(
liveItem!.watchedShow!['text_small'],
liveItem.watchedShow!['text_small'],
style: const TextStyle(fontSize: 11, color: Colors.white),
semanticsLabel: "${liveItem!.watchedShow!['text_small']}围观",
semanticsLabel: "${liveItem.watchedShow?['text_small']}围观",
),
],
),

View File

@@ -68,7 +68,8 @@ class MemberCoinsItem extends StatelessWidget {
const SizedBox(height: 4),
Row(
children: [
StatView(
statView(
context: context,
view: coinItem.view,
theme: 'gray',
),

View File

@@ -72,7 +72,8 @@ class MemberSeasonsItem extends StatelessWidget {
const SizedBox(height: 4),
Row(
children: [
StatView(
statView(
context: context,
view: seasonItem.view,
theme: 'gray',
),

View File

@@ -27,7 +27,7 @@ class HotKeyword extends StatelessWidget {
borderRadius: BorderRadius.circular(3),
clipBehavior: Clip.hardEdge,
child: InkWell(
onTap: () => onClick!(i.keyword),
onTap: () => onClick?.call(i.keyword),
child: Padding(
padding: EdgeInsets.only(
left: 2,

View File

@@ -29,10 +29,10 @@ class SearchText extends StatelessWidget {
padding: EdgeInsets.zero,
child: InkWell(
onTap: () {
onSelect!(searchText);
onSelect?.call(searchText);
},
onLongPress: () {
onLongSelect!(searchText);
onLongSelect?.call(searchText);
},
borderRadius: BorderRadius.circular(6),
child: Padding(

View File

@@ -163,7 +163,7 @@ class CustomFilterChip extends StatelessWidget {
// Theme.of(context).colorScheme.surfaceVariant.withOpacity(0.5),
backgroundColor: Colors.transparent,
side: BorderSide.none,
onSelected: (bool selected) => callFn!(selected),
onSelected: (bool selected) => callFn?.call(selected),
),
);
}

View File

@@ -56,10 +56,7 @@ class SubItem extends StatelessWidget {
},
),
),
VideoContent(
subFolderItem: subFolderItem,
cancelSub: cancelSub,
)
videoContent(context)
],
),
);
@@ -68,15 +65,8 @@ class SubItem extends StatelessWidget {
),
);
}
}
class VideoContent extends StatelessWidget {
final SubFolderItemData subFolderItem;
final Function(SubFolderItemData)? cancelSub;
const VideoContent({super.key, required this.subFolderItem, this.cancelSub});
@override
Widget build(BuildContext context) {
Widget videoContent(context) {
// subFolderItem.type == 11播单
// subFolderItem.type == 21合集
// 其它:其它
@@ -130,7 +120,7 @@ class VideoContent extends StatelessWidget {
height: 35,
width: 35,
child: IconButton(
onPressed: () => cancelSub?.call(subFolderItem),
onPressed: () => cancelSub(subFolderItem),
style: TextButton.styleFrom(
foregroundColor: Theme.of(context).colorScheme.outline,
padding: const EdgeInsets.fromLTRB(0, 0, 0, 0),

View File

@@ -91,10 +91,7 @@ class SubVideoCardH extends StatelessWidget {
},
),
),
VideoContent(
videoItem: videoItem,
searchType: searchType,
)
videoContent(context)
],
),
);
@@ -105,19 +102,8 @@ class SubVideoCardH extends StatelessWidget {
),
);
}
}
class VideoContent extends StatelessWidget {
final dynamic videoItem;
final int? searchType;
const VideoContent({
super.key,
required this.videoItem,
this.searchType,
});
@override
Widget build(BuildContext context) {
Widget videoContent(context) {
return Expanded(
child: Padding(
padding: const EdgeInsets.fromLTRB(10, 2, 6, 0),
@@ -127,7 +113,7 @@ class VideoContent extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
videoItem.title,
'${videoItem.title}',
textAlign: TextAlign.start,
style: const TextStyle(
fontWeight: FontWeight.w400,
@@ -147,13 +133,17 @@ class VideoContent extends StatelessWidget {
padding: const EdgeInsets.only(top: 2),
child: Row(
children: [
StatView(
statView(
context: context,
theme: 'gray',
view: videoItem.cntInfo['play'],
view: videoItem.cntInfo?['play'],
),
const SizedBox(width: 8),
StatDanMu(
theme: 'gray', danmu: videoItem.cntInfo['danmaku']),
statDanMu(
context: context,
theme: 'gray',
danmu: videoItem.cntInfo?['danmaku'],
),
const Spacer(),
],
),

View File

@@ -444,7 +444,8 @@ class _VideoInfoState extends State<VideoInfo> with TickerProviderStateMixin {
onTap: showIntroDetail,
child: Row(
children: <Widget>[
StatView(
statView(
context: context,
theme: 'gray',
view: !loadingStatus
? widget.videoDetail?.stat?.view ?? '-'
@@ -452,7 +453,8 @@ class _VideoInfoState extends State<VideoInfo> with TickerProviderStateMixin {
size: 'medium',
),
const SizedBox(width: 10),
StatDanMu(
statDanMu(
context: context,
theme: 'gray',
danmu: !loadingStatus
? widget.videoDetail?.stat?.danmu ?? '-'

View File

@@ -32,13 +32,11 @@ class ActionRowItem extends StatelessWidget {
child: InkWell(
onTap: () => {
feedBack(),
onTap!(),
onTap?.call(),
},
onLongPress: () {
feedBack();
if (onLongPress != null) {
onLongPress!();
}
onLongPress?.call();
},
child: Padding(
padding: const EdgeInsets.fromLTRB(15, 7, 15, 7),

View File

@@ -56,13 +56,15 @@ class IntroDetail extends StatelessWidget {
const SizedBox(height: 6),
Row(
children: [
StatView(
statView(
context: context,
theme: 'gray',
view: videoDetail!.stat!.view,
size: 'medium',
),
const SizedBox(width: 10),
StatDanMu(
statDanMu(
context: context,
theme: 'gray',
danmu: videoDetail!.stat!.danmu,
size: 'medium',

View File

@@ -61,7 +61,7 @@ class MenuRow extends StatelessWidget {
child: InkWell(
onTap: () => {
feedBack(),
onTap!(),
onTap?.call(),
},
child: Container(
padding: const EdgeInsets.fromLTRB(13, 5.5, 13, 4.5),
@@ -120,7 +120,7 @@ class ActionRowLineItem extends StatelessWidget {
child: InkWell(
onTap: () => {
feedBack(),
onTap!(),
onTap?.call(),
},
child: Container(
padding: const EdgeInsets.fromLTRB(13, 5.5, 13, 4.5),

View File

@@ -60,9 +60,7 @@ class ReplyItem extends StatelessWidget {
return MorePanel(
item: replyItem!,
onDelete: (rpid) {
if (onDelete != null) {
onDelete!(rpid, null);
}
onDelete?.call(rpid, null);
},
);
},
@@ -318,9 +316,7 @@ class ReplyItem extends StatelessWidget {
replyItem: replyItem,
replyReply: replyReply,
onDelete: (rpid) {
if (onDelete != null) {
onDelete!(rpid, replyItem!.rpid);
}
onDelete?.call(rpid, replyItem!.rpid);
},
),
),
@@ -339,10 +335,7 @@ class ReplyItem extends StatelessWidget {
child: TextButton(
onPressed: () {
feedBack();
if (onReply != null) {
onReply!();
return;
}
onReply?.call();
},
child: Row(children: [
Icon(Icons.reply,
@@ -990,8 +983,8 @@ class MorePanel extends StatelessWidget {
'https://www.bilibili.com/h5/comment/report?mid=${item.mid}&oid=${item.oid}&pageType=1&rpid=${item.rpid}&platform=android',
},
);
if (result == true && onDelete != null) {
onDelete!(item.rpid!);
if (result == true) {
onDelete?.call(item.rpid!);
}
break;
case 'copyAll':
@@ -1056,10 +1049,7 @@ class MorePanel extends StatelessWidget {
SmartDialog.dismiss();
if (result['status']) {
SmartDialog.showToast('删除成功');
// Get.back();
if (onDelete != null) {
onDelete!(item.rpid!);
}
onDelete?.call(item.rpid!);
} else {
SmartDialog.showToast('删除失败, ${result["msg"]}');
}

View File

@@ -71,12 +71,11 @@ class ReplyItemGrpc extends StatelessWidget {
useRootNavigator: true,
isScrollControlled: true,
builder: (context) {
return MorePanel(
return morePanel(
context: context,
item: replyItem,
onDelete: (rpid) {
if (onDelete != null) {
onDelete!(rpid, null);
}
onDelete?.call(rpid, null);
},
);
},
@@ -339,10 +338,7 @@ class ReplyItemGrpc extends StatelessWidget {
style: _style,
onPressed: () {
feedBack();
if (onReply != null) {
onReply!();
return;
}
onReply?.call();
},
child: Row(children: [
Icon(Icons.reply,
@@ -439,7 +435,8 @@ class ReplyItemGrpc extends StatelessWidget {
useRootNavigator: true,
isScrollControlled: true,
builder: (context) {
return MorePanel(
return morePanel(
context: context,
item: replyItem.replies[i],
onDelete: (rpid) {
onDelete?.call(rpid, replyItem.id.toInt());
@@ -579,7 +576,6 @@ class ReplyItemGrpc extends StatelessWidget {
),
);
}
}
InlineSpan buildContent(
BuildContext context,
@@ -763,7 +759,8 @@ InlineSpan buildContent(
Get.find<VideoDetailController>(
tag: Get.arguments['heroTag'])
.plPlayerController
.seekTo(Duration(seconds: Utils.duration(matchStr)),
.seekTo(
Duration(seconds: Utils.duration(matchStr)),
type: 'slider');
} catch (e) {
SmartDialog.showToast('跳转失败: $e');
@@ -791,7 +788,8 @@ InlineSpan buildContent(
String appUrlSchema = '';
final bool enableWordRe = GStorage.setting
.get(SettingBoxKey.enableWordRe, defaultValue: false) as bool;
if (content.url[matchStr] != null && !matchedStrs.contains(matchStr)) {
if (content.url[matchStr] != null &&
!matchedStrs.contains(matchStr)) {
appUrlSchema = content.url[matchStr]!.appUrlSchema;
if (appUrlSchema.startsWith('bilibili://search') && !enableWordRe) {
addPlainTextSpan(matchStr);
@@ -868,7 +866,8 @@ InlineSpan buildContent(
} else if (matchStr.startsWith('https://b23.tv')) {
final String redirectUrl =
await UrlUtils.parseRedirectUrl(matchStr);
final String pathSegment = Uri.parse(redirectUrl).path;
final String pathSegment =
Uri.parse(redirectUrl).path;
final String lastPathSegment =
pathSegment.split('/').last;
if (lastPathSegment.startsWith('BV')) {
@@ -905,7 +904,8 @@ InlineSpan buildContent(
// 只显示一次
matchedStrs.add(matchStr);
} else if (matchStr.length > 1 &&
content.topic[matchStr.substring(1, matchStr.length - 1)] != null) {
content.topic[matchStr.substring(1, matchStr.length - 1)] !=
null) {
spanChildren.add(
TextSpan(
text: matchStr,
@@ -916,7 +916,8 @@ InlineSpan buildContent(
..onTap = () {
final String topic =
matchStr.substring(1, matchStr.length - 1);
Get.toNamed('/searchResult', parameters: {'keyword': topic});
Get.toNamed('/searchResult',
parameters: {'keyword': topic});
},
),
);
@@ -1032,12 +1033,11 @@ InlineSpan buildContent(
return TextSpan(children: spanChildren);
}
class MorePanel extends StatelessWidget {
final ReplyInfo item;
final Function(dynamic rpid)? onDelete;
const MorePanel({super.key, required this.item, this.onDelete});
Widget morePanel({
required BuildContext context,
required dynamic item,
required onDelete,
}) {
Future<dynamic> menuActionHandler(String type) async {
String message = item.content.message;
switch (type) {
@@ -1050,8 +1050,8 @@ class MorePanel extends StatelessWidget {
'https://www.bilibili.com/h5/comment/report?mid=${item.mid}&oid=${item.oid}&pageType=1&rpid=${item.id}&platform=android',
},
);
if (result == true && onDelete != null) {
onDelete!(item.id.toInt());
if (result == true) {
onDelete?.call(item.id.toInt());
}
break;
case 'copyAll':
@@ -1088,8 +1088,8 @@ class MorePanel extends StatelessWidget {
builder: (context) {
return AlertDialog(
title: const Text('删除评论(测试)'),
content:
Text('确定尝试删除这条评论吗?\n\n$message\n\n注:只能删除自己的评论,或自己管理的评论区下的评论'),
content: Text(
'确定尝试删除这条评论吗?\n\n$message\n\n注:只能删除自己的评论,或自己管理的评论区下的评论'),
actions: <Widget>[
TextButton(
onPressed: () {
@@ -1119,10 +1119,7 @@ class MorePanel extends StatelessWidget {
SmartDialog.dismiss();
if (result['status']) {
SmartDialog.showToast('删除成功');
// Get.back();
if (onDelete != null) {
onDelete!(item.id.toInt());
}
onDelete?.call(item.id.toInt());
} else {
SmartDialog.showToast('删除失败, ${result["msg"]}');
}
@@ -1131,8 +1128,6 @@ class MorePanel extends StatelessWidget {
}
}
@override
Widget build(BuildContext context) {
Color errorColor = Theme.of(context).colorScheme.error;
return Container(
padding: EdgeInsets.only(

View File

@@ -292,9 +292,7 @@ class _ReplyPageState extends State<ReplyPage>
_enablePublish = false;
_publishStream.add(false);
}
if (widget.onSaveReply != null) {
widget.onSaveReply!(value);
}
widget.onSaveReply?.call(value);
},
focusNode: _focusNode,
decoration: const InputDecoration(
@@ -537,8 +535,6 @@ class _ReplyPageState extends State<ReplyPage>
selection:
TextSelection.collapsed(offset: cursorPosition + emote.text!.length),
);
if (widget.onSaveReply != null) {
widget.onSaveReply!(_replyContentController.text);
}
widget.onSaveReply?.call(_replyContentController.text);
}
}

View File

@@ -1350,20 +1350,28 @@ class _VideoDetailPageState extends State<VideoDetailPage>
}
showEpisodes(index, season, episodes, bvid, aid, cid) {
ListSheet(
PersistentBottomSheetController? bottomSheetController;
Widget listSheetContent() => ListSheetContent(
index: index,
season: season,
episodes: episodes,
bvid: bvid,
aid: aid,
currentCid: cid,
changeFucCall: videoDetailController.videoType == SearchType.media_bangumi
changeFucCall:
videoDetailController.videoType == SearchType.media_bangumi
? bangumiIntroController.changeSeasonOrbangu
: videoIntroController.changeSeasonOrbangu,
context: context,
scaffoldState: isFullScreen
? videoDetailController.scaffoldKey.currentState
: videoDetailController.childKey.currentState,
).buildShowBottomSheet();
onClose: bottomSheetController?.close,
);
bottomSheetController = isFullScreen
? videoDetailController.scaffoldKey.currentState?.showBottomSheet(
(context) => listSheetContent(),
)
: videoDetailController.scaffoldKey.currentState?.showBottomSheet(
(context) => listSheetContent(),
);
}
}

View File

@@ -301,9 +301,7 @@ class PlPlayerController {
static Future<void> playIfExists(
{bool repeat = false, bool hideControls = true}) async {
// await _instance?.play(repeat: repeat, hideControls: hideControls);
if (_playCallBack != null) {
_playCallBack!();
}
_playCallBack?.call();
}
// try to get PlayerStatus

View File

@@ -371,18 +371,14 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
.episodes!;
// changeFucCall = bangumiIntroController!.changeSeasonOrbangu;
}
if (widget.showEpisodes != null) {
widget.showEpisodes!(
widget.showEpisodes?.call(
index,
isPage
? null
: videoIntroController?.videoDetail.value.ugcSeason,
isPage ? null : videoIntroController?.videoDetail.value.ugcSeason,
episodes,
bvid,
IdUtils.bv2av(bvid),
currentCid,
);
}
},
),
),

View File

@@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
class ComBtn extends StatelessWidget {
final Widget? icon;
final Function? fuc;
final GestureTapCallback? fuc;
const ComBtn({
this.icon,
@@ -16,9 +16,7 @@ class ComBtn extends StatelessWidget {
width: 34,
height: 34,
child: InkWell(
onTap: () {
fuc!();
},
onTap: fuc,
child: icon!,
),
);