mod: lint

mod: tweaks

opt: publish page

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-05-04 11:37:13 +08:00
parent 2cfad80214
commit caa58e9d7d
313 changed files with 2751 additions and 2789 deletions

View File

@@ -62,7 +62,7 @@ class DynamicsController extends GetxController
queryFollowUp();
}
onSelectType(value) async {
Future<void> onSelectType(value) async {
initialValue.value = value;
}
@@ -164,9 +164,12 @@ class DynamicsController extends GetxController
isQuerying = false;
}
onSelectUp(mid) async {
Future<void> onSelectUp(mid) async {
if (this.mid == mid) {
tabController.index = (mid == -1 ? 0 : 4);
if (mid == -1) {
queryFollowUp();
}
controller.onReload();
return;
}
@@ -176,13 +179,13 @@ class DynamicsController extends GetxController
}
@override
onRefresh() async {
Future<void> onRefresh() async {
queryFollowUp();
await controller.onRefresh();
}
@override
void animateToTop() async {
Future<void> animateToTop() async {
controller.animateToTop();
scrollController.animToTop();
}

View File

@@ -7,14 +7,14 @@ import 'package:get/get.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
import 'controller.dart';
import 'widgets/up_panel.dart';
import 'package:PiliPlus/pages/dynamics/controller.dart';
import 'package:PiliPlus/pages/dynamics/widgets/up_panel.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
enum ReplyOption { allow, close, choose }
extension ReplyOptionExtension on ReplyOption {
String get title => ['允许评论', '关闭评论', '精选评论'][index];
String get title => const ['允许评论', '关闭评论', '精选评论'][index];
IconData get iconData => [
MdiIcons.commentTextOutline,
@@ -82,9 +82,7 @@ class _DynamicsPageState extends State<DynamicsPage>
@override
void initState() {
super.initState();
upPanelPosition = UpPanelPosition.values[GStorage.setting.get(
SettingBoxKey.upPanelPosition,
defaultValue: UpPanelPosition.leftFixed.index)];
upPanelPosition = GStorage.upPanelPosition;
debugPrint('upPanelPosition: $upPanelPosition');
if (GStorage.setting
.get(SettingBoxKey.dynamicsShowAllFollowedUp, defaultValue: false)) {
@@ -122,7 +120,7 @@ class _DynamicsPageState extends State<DynamicsPage>
} else if (_dynamicsController.upData.value.errMsg != null) {
return Center(
child: IconButton(
icon: Icon(Icons.refresh),
icon: const Icon(Icons.refresh),
onPressed: () {
_dynamicsController.queryFollowUp();
},

View File

@@ -22,7 +22,7 @@ class ActionPanel extends StatefulWidget {
class _ActionPanelState extends State<ActionPanel> {
bool isProcessing = false;
void handleState(Future Function() action) async {
Future<void> handleState(Future Function() action) async {
if (isProcessing.not) {
isProcessing = true;
await action();

View File

@@ -221,7 +221,7 @@ class AuthorPanel extends StatelessWidget {
void morePanel(BuildContext context) {
String? bvid;
try {
getBvid(String? type, DynamicMajorModel? major) => switch (type) {
String? getBvid(String? type, DynamicMajorModel? major) => switch (type) {
'DYNAMIC_TYPE_AV' => major?.archive?.bvid,
'DYNAMIC_TYPE_UGC_SEASON' => major?.ugcSeason?.bvid,
_ => null,

View File

@@ -3,7 +3,7 @@ import 'package:PiliPlus/common/widgets/image/image_view.dart';
import 'package:PiliPlus/models/dynamics/result.dart';
import 'package:flutter/material.dart';
import 'rich_node_panel.dart';
import 'package:PiliPlus/pages/dynamics/widgets/rich_node_panel.dart';
Widget content(
ThemeData theme,
@@ -52,7 +52,9 @@ Widget content(
source == 'detail'
? SelectableText.rich(
richNodes,
style: TextStyle(fontSize: !isSave ? 16 : 15),
style: !isSave
? const TextStyle(fontSize: 16)
: const TextStyle(fontSize: 15),
)
: Text.rich(
style: const TextStyle(fontSize: 15),

View File

@@ -4,10 +4,10 @@ import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/utils/page_utils.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'action_panel.dart';
import 'author_panel.dart';
import 'content_panel.dart';
import 'forward_panel.dart';
import 'package:PiliPlus/pages/dynamics/widgets/action_panel.dart';
import 'package:PiliPlus/pages/dynamics/widgets/author_panel.dart';
import 'package:PiliPlus/pages/dynamics/widgets/content_panel.dart';
import 'package:PiliPlus/pages/dynamics/widgets/forward_panel.dart';
class DynamicPanel extends StatelessWidget {
final DynamicItemModel item;
@@ -37,55 +37,60 @@ class DynamicPanel extends StatelessWidget {
isSave: isSave,
onSetTop: onSetTop,
);
return Container(
decoration: isSave ||
(source == 'detail' &&
Get.context!.orientation == Orientation.landscape)
? null
: BoxDecoration(
border: Border(
bottom: BorderSide(
width: 8,
color: theme.dividerColor.withOpacity(0.05),
),
),
final child = Material(
elevation: 0,
color: Colors.transparent,
child: InkWell(
onTap: source == 'detail' &&
const {
'DYNAMIC_TYPE_AV',
'DYNAMIC_TYPE_UGC_SEASON',
'DYNAMIC_TYPE_PGC_UNION',
'DYNAMIC_TYPE_PGC',
'DYNAMIC_TYPE_LIVE',
'DYNAMIC_TYPE_LIVE_RCMD',
'DYNAMIC_TYPE_MEDIALIST',
}.contains(item.type).not
? null
: () => PageUtils.pushDynDetail(item, 1),
onLongPress: () => _imageSaveDialog(context, authorWidget.morePanel),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.fromLTRB(12, 12, 12, 6),
child: authorWidget,
),
child: Material(
elevation: 0,
color: Colors.transparent,
child: InkWell(
onTap: source == 'detail' &&
const {
'DYNAMIC_TYPE_AV',
'DYNAMIC_TYPE_UGC_SEASON',
'DYNAMIC_TYPE_PGC_UNION',
'DYNAMIC_TYPE_PGC',
'DYNAMIC_TYPE_LIVE',
'DYNAMIC_TYPE_LIVE_RCMD',
'DYNAMIC_TYPE_MEDIALIST',
}.contains(item.type).not
? null
: () => PageUtils.pushDynDetail(item, 1),
onLongPress: () => _imageSaveDialog(context, authorWidget.morePanel),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.fromLTRB(12, 12, 12, 6),
child: authorWidget,
),
if (item.modules.moduleDynamic!.desc != null ||
item.modules.moduleDynamic!.major != null)
content(theme, isSave, context, item, source, callback),
forWard(theme, isSave, item, context, source, callback),
const SizedBox(height: 2),
if (source == null) ActionPanel(item: item),
if (source == 'detail' && !isSave) const SizedBox(height: 12),
],
if (item.modules.moduleDynamic!.desc != null ||
item.modules.moduleDynamic!.major != null)
content(theme, isSave, context, item, source, callback),
forWard(theme, isSave, item, context, source, callback),
const SizedBox(height: 2),
if (source == null) ActionPanel(item: item),
if (source == 'detail' && !isSave) const SizedBox(height: 12),
],
),
),
);
if (isSave ||
(source == 'detail' &&
Get.context!.orientation == Orientation.landscape)) {
return child;
}
return DecoratedBox(
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
width: 8,
color: theme.dividerColor.withOpacity(0.05),
),
),
),
child: Padding(
padding: const EdgeInsets.only(bottom: 8),
child: child,
),
);
}

View File

@@ -45,7 +45,7 @@ InlineSpan picsNodes(
Widget _blockedItem(ThemeData theme, ModuleBlocked moduleBlocked) {
return Padding(
padding: EdgeInsets.symmetric(horizontal: 13, vertical: 1),
padding: const EdgeInsets.symmetric(horizontal: 13, vertical: 1),
child: LayoutBuilder(
builder: (context, constraints) {
return moduleBlockedItem(theme, moduleBlocked, constraints.maxWidth);
@@ -66,9 +66,6 @@ Widget forWard(
switch (item.type) {
// 图文
case 'DYNAMIC_TYPE_DRAW':
bool hasPics =
item.modules.moduleDynamic?.major?.opus?.pics?.isNotEmpty == true;
TextSpan? richNodes = richNode(theme, item, context);
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
@@ -110,12 +107,12 @@ Widget forWard(
? null
: TextOverflow.ellipsis,
),
if (hasPics) ...[
if (item.modules.moduleDynamic?.major?.opus?.pics?.isNotEmpty ==
true)
Text.rich(
picsNodes(
item.modules.moduleDynamic!.major!.opus!.pics!, callback),
),
],
const SizedBox(height: 4),
],
Padding(

View File

@@ -5,7 +5,7 @@ import 'package:get/get.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'rich_node_panel.dart';
import 'package:PiliPlus/pages/dynamics/widgets/rich_node_panel.dart';
Widget livePanel(
ThemeData theme,

View File

@@ -7,7 +7,7 @@ import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/models/dynamics/result.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'rich_node_panel.dart';
import 'package:PiliPlus/pages/dynamics/widgets/rich_node_panel.dart';
Widget liveRcmdPanel(
ThemeData theme,

View File

@@ -73,47 +73,45 @@ TextSpan? richNode(
spanChildren.add(
WidgetSpan(
alignment: PlaceholderAlignment.middle,
child: GestureDetector(
onTap: () {},
child: Text(
'${i.origText}',
style: authorStyle,
),
child: Text(
'${i.origText}',
style: authorStyle,
),
),
);
break;
// 网页链接
case 'RICH_TEXT_NODE_TYPE_WEB':
spanChildren.add(
WidgetSpan(
alignment: PlaceholderAlignment.middle,
child: Icon(
Icons.link,
size: 20,
color: theme.colorScheme.primary,
),
),
);
spanChildren.add(
WidgetSpan(
alignment: PlaceholderAlignment.middle,
child: GestureDetector(
onTap: () {
String? url = i.origText;
if (url == null) {
SmartDialog.showToast('未获取到链接');
return;
}
PiliScheme.routePushFromUrl(url);
},
child: Text(
i.text ?? '',
style: authorStyle,
spanChildren
..add(
WidgetSpan(
alignment: PlaceholderAlignment.middle,
child: Icon(
Icons.link,
size: 20,
color: theme.colorScheme.primary,
),
),
),
);
)
..add(
WidgetSpan(
alignment: PlaceholderAlignment.middle,
child: GestureDetector(
onTap: () {
String? url = i.origText;
if (url == null) {
SmartDialog.showToast('未获取到链接');
return;
}
PiliScheme.routePushFromUrl(url);
},
child: Text(
i.text ?? '',
style: authorStyle,
),
),
),
);
break;
// 投票
case 'RICH_TEXT_NODE_TYPE_VOTE':
@@ -148,121 +146,122 @@ TextSpan? richNode(
break;
// 抽奖
case 'RICH_TEXT_NODE_TYPE_LOTTERY':
spanChildren.add(
WidgetSpan(
alignment: PlaceholderAlignment.middle,
child: Icon(
Icons.redeem_rounded,
size: 16,
color: theme.colorScheme.primary,
),
),
);
spanChildren.add(
WidgetSpan(
alignment: PlaceholderAlignment.middle,
child: GestureDetector(
onTap: () {
Get.toNamed(
'/webview',
parameters: {
'url':
'https://www.bilibili.com/h5/lottery/result?business_id=${item.idStr}'
},
);
},
child: Text(
'${i.origText} ',
style: authorStyle,
spanChildren
..add(
WidgetSpan(
alignment: PlaceholderAlignment.middle,
child: Icon(
Icons.redeem_rounded,
size: 16,
color: theme.colorScheme.primary,
),
),
),
);
)
..add(
WidgetSpan(
alignment: PlaceholderAlignment.middle,
child: GestureDetector(
onTap: () {
Get.toNamed(
'/webview',
parameters: {
'url':
'https://www.bilibili.com/h5/lottery/result?business_id=${item.idStr}'
},
);
},
child: Text(
'${i.origText} ',
style: authorStyle,
),
),
),
);
break;
/// TODO 商品
case 'RICH_TEXT_NODE_TYPE_GOODS':
spanChildren.add(
WidgetSpan(
alignment: PlaceholderAlignment.middle,
child: Icon(
Icons.shopping_bag_outlined,
size: 16,
color: theme.colorScheme.primary,
spanChildren
..add(
WidgetSpan(
alignment: PlaceholderAlignment.middle,
child: Icon(
Icons.shopping_bag_outlined,
size: 16,
color: theme.colorScheme.primary,
),
),
),
);
spanChildren.add(
WidgetSpan(
alignment: PlaceholderAlignment.middle,
child: GestureDetector(
onTap: () {},
)
..add(
WidgetSpan(
alignment: PlaceholderAlignment.middle,
child: Text(
'${i.text} ',
style: authorStyle,
),
),
),
);
);
break;
// 投稿
case 'RICH_TEXT_NODE_TYPE_BV':
spanChildren.add(
WidgetSpan(
alignment: PlaceholderAlignment.middle,
child: Icon(
Icons.play_circle_outline_outlined,
size: 16,
color: theme.colorScheme.primary,
),
),
);
spanChildren.add(
WidgetSpan(
alignment: PlaceholderAlignment.middle,
child: GestureDetector(
onTap: () async {
try {
int cid = await SearchHttp.ab2c(bvid: i.rid);
PageUtils.toVideoPage(
'bvid=${i.rid}&cid=$cid',
arguments: {
'heroTag': Utils.makeHeroTag(i.rid),
},
);
} catch (err) {
SmartDialog.showToast(err.toString());
}
},
child: Text(
'${i.text} ',
style: authorStyle,
spanChildren
..add(
WidgetSpan(
alignment: PlaceholderAlignment.middle,
child: Icon(
Icons.play_circle_outline_outlined,
size: 16,
color: theme.colorScheme.primary,
),
),
),
);
)
..add(
WidgetSpan(
alignment: PlaceholderAlignment.middle,
child: GestureDetector(
onTap: () async {
try {
int cid = await SearchHttp.ab2c(bvid: i.rid);
PageUtils.toVideoPage(
'bvid=${i.rid}&cid=$cid',
arguments: {
'heroTag': Utils.makeHeroTag(i.rid),
},
);
} catch (err) {
SmartDialog.showToast(err.toString());
}
},
child: Text(
'${i.text} ',
style: authorStyle,
),
),
),
);
break;
case 'RICH_TEXT_NODE_TYPE_VIEW_PICTURE'
when (i.pics?.isNotEmpty == true):
spanChildren.add(TextSpan(text: '\n'));
spanChildren.add(
WidgetSpan(
child: LayoutBuilder(
builder: (context, constraints) {
return imageView(
constraints.maxWidth,
i.pics!
.map((item) => ImageModel(
url: item.src ?? '',
width: item.width,
height: item.height,
))
.toList(),
);
},
spanChildren
..add(const TextSpan(text: '\n'))
..add(
WidgetSpan(
child: LayoutBuilder(
builder: (context, constraints) {
return imageView(
constraints.maxWidth,
i.pics!
.map((item) => ImageModel(
url: item.src ?? '',
width: item.width,
height: item.height,
))
.toList(),
);
},
),
),
),
);
);
break;
default:
spanChildren.add(

View File

@@ -7,7 +7,7 @@ import 'package:PiliPlus/common/widgets/badge.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'rich_node_panel.dart';
import 'package:PiliPlus/pages/dynamics/widgets/rich_node_panel.dart';
Widget videoSeasonWidget(
ThemeData theme,
@@ -89,8 +89,8 @@ Widget videoSeasonWidget(
alignment: Alignment.bottomLeft,
padding: const EdgeInsets.fromLTRB(10, 0, 8, 8),
clipBehavior: Clip.hardEdge,
decoration: BoxDecoration(
gradient: const LinearGradient(
decoration: const BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [
@@ -98,7 +98,7 @@ Widget videoSeasonWidget(
Colors.black54,
],
),
borderRadius: const BorderRadius.only(
borderRadius: BorderRadius.only(
bottomLeft: StyleString.imgRadius,
bottomRight: StyleString.imgRadius,
),

View File

@@ -78,7 +78,7 @@ class _VotePanelState extends State<VotePanel> {
text: _voteInfo.joinNum.toString(),
style: TextStyle(color: theme.colorScheme.primary),
),
TextSpan(text: '人参与'),
const TextSpan(text: '人参与'),
],
),
),
@@ -107,7 +107,7 @@ class _VotePanelState extends State<VotePanel> {
Flexible(fit: FlexFit.loose, child: _buildContext()),
if (_enabled)
Padding(
padding: EdgeInsets.only(top: 16),
padding: const EdgeInsets.only(top: 16),
child: ValueListenableBuilder(
valueListenable: _canVote,
builder: (_, val, __) => OutlinedButton(