mirror of
https://github.com/HChaZZY/PiliPlus.git
synced 2025-12-06 09:13:48 +08:00
mod: lint
mod: tweaks opt: publish page Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
},
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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,
|
||||
),
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user