diff --git a/lib/http/api.dart b/lib/http/api.dart index f42694e31..2333393c5 100644 --- a/lib/http/api.dart +++ b/lib/http/api.dart @@ -886,4 +886,6 @@ class Api { static const String spaceSettingMod = '/x/space/privacy/batch/modify'; static const String vipExpAdd = '/x/vip/experience/add'; + + static const String coinLog = '/x/member/web/coin/log'; } diff --git a/lib/http/user.dart b/lib/http/user.dart index d270828e6..5b8943565 100644 --- a/lib/http/user.dart +++ b/lib/http/user.dart @@ -4,6 +4,7 @@ import 'package:PiliPlus/http/init.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models/user/info.dart'; import 'package:PiliPlus/models/user/stat.dart'; +import 'package:PiliPlus/models_new/coin_log/data.dart'; import 'package:PiliPlus/models_new/history/data.dart'; import 'package:PiliPlus/models_new/later/data.dart'; import 'package:PiliPlus/models_new/media_list/data.dart'; @@ -398,4 +399,19 @@ class UserHttp { return {'status': false, 'msg': res.data['message']}; } } + + static Future> coinLog() async { + final res = await Request().get( + Api.coinLog, + queryParameters: { + 'jsonp': 'jsonp', + 'web_location': '333.33', + }, + ); + if (res.data['code'] == 0) { + return Success(CoinLogData.fromJson(res.data['data'])); + } else { + return Error(res.data['message']); + } + } } diff --git a/lib/models_new/coin_log/data.dart b/lib/models_new/coin_log/data.dart new file mode 100644 index 000000000..7b3dd08dd --- /dev/null +++ b/lib/models_new/coin_log/data.dart @@ -0,0 +1,15 @@ +import 'package:PiliPlus/models_new/coin_log/list.dart'; + +class CoinLogData { + List? list; + int? count; + + CoinLogData({this.list, this.count}); + + factory CoinLogData.fromJson(Map json) => CoinLogData( + list: (json['list'] as List?) + ?.map((e) => CoinLogItem.fromJson(e as Map)) + .toList(), + count: json['count'] as int?, + ); +} diff --git a/lib/models_new/coin_log/list.dart b/lib/models_new/coin_log/list.dart new file mode 100644 index 000000000..b05c7bef5 --- /dev/null +++ b/lib/models_new/coin_log/list.dart @@ -0,0 +1,14 @@ +class CoinLogItem { + final String time; + final String delta; + final String reason; + + const CoinLogItem( + {required this.time, required this.delta, required this.reason}); + + factory CoinLogItem.fromJson(Map json) => CoinLogItem( + time: json['time'], + delta: (json['delta'] as num).toString(), + reason: json['reason'], + ); +} diff --git a/lib/pages/article/widgets/article_ops.dart b/lib/pages/article/widgets/article_ops.dart index 8d888eaa7..3d7fa0762 100644 --- a/lib/pages/article/widgets/article_ops.dart +++ b/lib/pages/article/widgets/article_ops.dart @@ -69,9 +69,7 @@ class ArticleOpus extends StatelessWidget { return Text(e.toString()); } }, - separatorBuilder: (context, index) { - return const SizedBox(height: 10); - }, + separatorBuilder: (context, index) => const SizedBox(height: 10), ); } } diff --git a/lib/pages/member/view.dart b/lib/pages/member/view.dart index d7206912c..726052a39 100644 --- a/lib/pages/member/view.dart +++ b/lib/pages/member/view.dart @@ -6,6 +6,7 @@ import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models_new/space/space/data.dart'; import 'package:PiliPlus/pages/member/controller.dart'; import 'package:PiliPlus/pages/member/widget/user_info_card.dart'; +import 'package:PiliPlus/pages/member_coin_log/view.dart'; import 'package:PiliPlus/pages/member_contribute/view.dart'; import 'package:PiliPlus/pages/member_dynamics/view.dart'; import 'package:PiliPlus/pages/member_favorite/view.dart'; @@ -14,6 +15,7 @@ import 'package:PiliPlus/pages/member_pgc/view.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart'; import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:get/get.dart'; class MemberPage extends StatefulWidget { @@ -152,6 +154,17 @@ class _MemberPageState extends State { ], ), ), + PopupMenuItem( + onTap: () => Get.to(const MemberCoinLogPage()), + child: const Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(FontAwesomeIcons.b, size: 18), + SizedBox(width: 10), + Text('硬币记录'), + ], + ), + ), PopupMenuItem( onTap: () => Get.toNamed('/spaceSetting'), child: const Row( diff --git a/lib/pages/member_coin/controller.dart b/lib/pages/member_coin_arc/controller.dart similarity index 90% rename from lib/pages/member_coin/controller.dart rename to lib/pages/member_coin_arc/controller.dart index d428d7f98..2b05d305e 100644 --- a/lib/pages/member_coin/controller.dart +++ b/lib/pages/member_coin_arc/controller.dart @@ -4,10 +4,10 @@ import 'package:PiliPlus/models_new/member/coin_like_arc/data.dart'; import 'package:PiliPlus/models_new/member/coin_like_arc/item.dart'; import 'package:PiliPlus/pages/common/common_list_controller.dart'; -class MemberCoinController +class MemberCoinArcController extends CommonListController { final dynamic mid; - MemberCoinController({this.mid}); + MemberCoinArcController({this.mid}); @override void onInit() { diff --git a/lib/pages/member_coin/view.dart b/lib/pages/member_coin_arc/view.dart similarity index 88% rename from lib/pages/member_coin/view.dart rename to lib/pages/member_coin_arc/view.dart index 1e92d359a..e534bd6bf 100644 --- a/lib/pages/member_coin/view.dart +++ b/lib/pages/member_coin_arc/view.dart @@ -3,16 +3,16 @@ import 'package:PiliPlus/common/skeleton/video_card_v.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models_new/member/coin_like_arc/item.dart'; -import 'package:PiliPlus/pages/member_coin/controller.dart'; -import 'package:PiliPlus/pages/member_coin/widgets/item.dart'; +import 'package:PiliPlus/pages/member_coin_arc/controller.dart'; +import 'package:PiliPlus/pages/member_coin_arc/widgets/item.dart'; import 'package:PiliPlus/utils/grid.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -class MemberCoinPage extends StatefulWidget { - const MemberCoinPage({ +class MemberCoinArcPage extends StatefulWidget { + const MemberCoinArcPage({ super.key, required this.mid, this.name, @@ -22,14 +22,14 @@ class MemberCoinPage extends StatefulWidget { final String? name; @override - State createState() => _MemberCoinPageState(); + State createState() => _MemberCoinArcPageState(); } -class _MemberCoinPageState extends State { +class _MemberCoinArcPageState extends State { late final _ownerMid = Accounts.main.mid; late final _ctr = Get.put( - MemberCoinController(mid: widget.mid), + MemberCoinArcController(mid: widget.mid), tag: Utils.makeHeroTag(widget.mid), ); diff --git a/lib/pages/member_coin/widgets/item.dart b/lib/pages/member_coin_arc/widgets/item.dart similarity index 100% rename from lib/pages/member_coin/widgets/item.dart rename to lib/pages/member_coin_arc/widgets/item.dart diff --git a/lib/pages/member_coin_log/controller.dart b/lib/pages/member_coin_log/controller.dart new file mode 100644 index 000000000..1b0998dc1 --- /dev/null +++ b/lib/pages/member_coin_log/controller.dart @@ -0,0 +1,22 @@ +import 'package:PiliPlus/http/loading_state.dart'; +import 'package:PiliPlus/http/user.dart'; +import 'package:PiliPlus/models_new/coin_log/data.dart'; +import 'package:PiliPlus/models_new/coin_log/list.dart'; +import 'package:PiliPlus/pages/common/common_list_controller.dart'; + +class MemberCoinLogController + extends CommonListController { + @override + void onInit() { + super.onInit(); + queryData(); + } + + @override + List? getDataList(CoinLogData response) { + return response.list; + } + + @override + Future> customGetData() => UserHttp.coinLog(); +} diff --git a/lib/pages/member_coin_log/view.dart b/lib/pages/member_coin_log/view.dart new file mode 100644 index 000000000..df4f2a036 --- /dev/null +++ b/lib/pages/member_coin_log/view.dart @@ -0,0 +1,136 @@ +import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; +import 'package:PiliPlus/http/loading_state.dart'; +import 'package:PiliPlus/models_new/coin_log/list.dart'; +import 'package:PiliPlus/pages/member_coin_log/controller.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class MemberCoinLogPage extends StatefulWidget { + const MemberCoinLogPage({super.key}); + + @override + State createState() => _MemberCoinLogPageState(); +} + +class _MemberCoinLogPageState extends State { + late final _controller = Get.put(MemberCoinLogController()); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('硬币记录')), + body: SafeArea( + top: false, + bottom: false, + child: Center( + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 680), + child: CustomScrollView( + slivers: [ + SliverPadding( + padding: EdgeInsets.only( + left: 10, + right: 10, + bottom: MediaQuery.paddingOf(context).bottom + 80, + ), + sliver: Obx(() => _buildBody(_controller.loadingState.value)), + ), + ], + ), + ), + ), + ), + ); + } + + Widget _buildBody(LoadingState?> loadingState) { + return switch (loadingState) { + Loading() => const SliverToBoxAdapter(child: LinearProgressIndicator()), + Success(:var response) => response?.isNotEmpty == true + ? Builder( + builder: (context) { + final them = Theme.of(context); + final outline = them.colorScheme.outline.withValues(alpha: 0.1); + final divider = Divider( + height: 1, + color: outline, + ); + final sliverDivider = SliverToBoxAdapter( + child: divider, + ); + final dividerV = VerticalDivider( + width: 1, + color: outline, + ); + return SliverMainAxisGroup( + slivers: [ + sliverDivider, + SliverToBoxAdapter( + child: ColoredBox( + color: them.colorScheme.onInverseSurface, + child: _item( + const CoinLogItem( + time: '时间', + delta: '变化', + reason: '原因', + ), + dividerV, + isHeader: true, + ), + ), + ), + sliverDivider, + SliverList.separated( + itemCount: response!.length, + itemBuilder: (context, index) { + return _item(response[index], dividerV); + }, + separatorBuilder: (context, index) => divider, + ), + sliverDivider, + ], + ); + }, + ) + : HttpError(onReload: _controller.onReload), + Error(:var errMsg) => HttpError( + errMsg: errMsg, + onReload: _controller.onReload, + ), + }; + } + + Widget _item(CoinLogItem item, Widget divider, {bool isHeader = false}) { + Widget text(int flex, String text) => Expanded( + flex: flex, + child: Padding( + padding: isHeader + ? const EdgeInsets.symmetric(vertical: 6) + : const EdgeInsets.symmetric(vertical: 8), + child: Center( + child: Text( + text, + textAlign: TextAlign.center, + style: isHeader + ? const TextStyle(fontSize: 13, fontWeight: FontWeight.bold) + : const TextStyle(fontSize: 13), + ), + ), + ), + ); + Widget content = Row( + children: [ + divider, + text(3, item.time), + divider, + text(1, item.delta), + divider, + text(4, item.reason), + divider, + ], + ); + return IntrinsicHeight( + child: isHeader ? content : SelectionArea(child: content), + ); + } +} diff --git a/lib/pages/member_home/view.dart b/lib/pages/member_home/view.dart index 0707935d5..8f19303f5 100644 --- a/lib/pages/member_home/view.dart +++ b/lib/pages/member_home/view.dart @@ -7,11 +7,11 @@ import 'package:PiliPlus/models_new/space/space/data.dart'; import 'package:PiliPlus/models_new/space/space/tab2.dart'; import 'package:PiliPlus/pages/member/controller.dart'; import 'package:PiliPlus/pages/member_article/widget/item.dart'; -import 'package:PiliPlus/pages/member_coin/view.dart'; +import 'package:PiliPlus/pages/member_coin_arc/view.dart'; import 'package:PiliPlus/pages/member_contribute/controller.dart'; import 'package:PiliPlus/pages/member_home/widgets/fav_item.dart'; import 'package:PiliPlus/pages/member_home/widgets/video_card_v_member_home.dart'; -import 'package:PiliPlus/pages/member_like/view.dart'; +import 'package:PiliPlus/pages/member_like_arc/view.dart'; import 'package:PiliPlus/pages/member_pgc/widgets/pgc_card_v_member_pgc.dart'; import 'package:PiliPlus/utils/grid.dart'; import 'package:flutter/foundation.dart' show kDebugMode; @@ -281,7 +281,7 @@ class _MemberHomeState extends State _ctr.tabController?.animateTo(index); } else { if (param == 'coinArchive') { - Get.to(MemberCoinPage( + Get.to(MemberCoinArcPage( mid: _ctr.mid, name: _ctr.username, )); @@ -289,7 +289,7 @@ class _MemberHomeState extends State } if (param == 'likeArchive') { - Get.to(MemberLikePage( + Get.to(MemberLikeArcPage( mid: _ctr.mid, name: _ctr.username, )); diff --git a/lib/pages/member_like/controller.dart b/lib/pages/member_like_arc/controller.dart similarity index 90% rename from lib/pages/member_like/controller.dart rename to lib/pages/member_like_arc/controller.dart index b938be660..4c15a3ac9 100644 --- a/lib/pages/member_like/controller.dart +++ b/lib/pages/member_like_arc/controller.dart @@ -4,10 +4,10 @@ import 'package:PiliPlus/models_new/member/coin_like_arc/data.dart'; import 'package:PiliPlus/models_new/member/coin_like_arc/item.dart'; import 'package:PiliPlus/pages/common/common_list_controller.dart'; -class MemberLikeController +class MemberLikeArcController extends CommonListController { final dynamic mid; - MemberLikeController({this.mid}); + MemberLikeArcController({this.mid}); @override void onInit() { diff --git a/lib/pages/member_like/view.dart b/lib/pages/member_like_arc/view.dart similarity index 88% rename from lib/pages/member_like/view.dart rename to lib/pages/member_like_arc/view.dart index 239cccaad..45369f1b6 100644 --- a/lib/pages/member_like/view.dart +++ b/lib/pages/member_like_arc/view.dart @@ -3,16 +3,16 @@ import 'package:PiliPlus/common/skeleton/video_card_v.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models_new/member/coin_like_arc/item.dart'; -import 'package:PiliPlus/pages/member_coin/widgets/item.dart'; -import 'package:PiliPlus/pages/member_like/controller.dart'; +import 'package:PiliPlus/pages/member_coin_arc/widgets/item.dart'; +import 'package:PiliPlus/pages/member_like_arc/controller.dart'; import 'package:PiliPlus/utils/grid.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -class MemberLikePage extends StatefulWidget { - const MemberLikePage({ +class MemberLikeArcPage extends StatefulWidget { + const MemberLikeArcPage({ super.key, required this.mid, this.name, @@ -22,14 +22,14 @@ class MemberLikePage extends StatefulWidget { final String? name; @override - State createState() => _MemberLikePageState(); + State createState() => _MemberLikeArcPageState(); } -class _MemberLikePageState extends State { +class _MemberLikeArcPageState extends State { late final _ownerMid = Accounts.main.mid; late final _ctr = Get.put( - MemberLikeController(mid: widget.mid), + MemberLikeArcController(mid: widget.mid), tag: Utils.makeHeroTag(widget.mid), ); diff --git a/lib/pages/mine/view.dart b/lib/pages/mine/view.dart index 9deb19a4e..b03ade651 100644 --- a/lib/pages/mine/view.dart +++ b/lib/pages/mine/view.dart @@ -103,6 +103,7 @@ class _MinePageState extends State { color: theme.colorScheme.primary, fontWeight: FontWeight.bold, ); + final isVip = userInfo.vipStatus != null && userInfo.vipStatus! > 0; return Column( mainAxisSize: MainAxisSize.min, children: [ @@ -125,8 +126,7 @@ class _MinePageState extends State { width: 55, height: 55, ), - if (userInfo.vipStatus != null && - userInfo.vipStatus! > 0) + if (isVip) Positioned( right: -1, bottom: -2, @@ -161,9 +161,7 @@ class _MinePageState extends State { userInfo.uname ?? '点击头像登录', style: theme.textTheme.titleMedium!.copyWith( height: 1, - color: userInfo.vipStatus != null && - userInfo.vipStatus! > 0 && - userInfo.vipType == 2 + color: isVip && userInfo.vipType == 2 ? context.vipColor : null, ), diff --git a/lib/pages/msg_feed_top/at_me/view.dart b/lib/pages/msg_feed_top/at_me/view.dart index cbe756eae..1de2e53b4 100644 --- a/lib/pages/msg_feed_top/at_me/view.dart +++ b/lib/pages/msg_feed_top/at_me/view.dart @@ -65,6 +65,12 @@ class _AtMePageState extends State { Widget _buildBody( ThemeData theme, LoadingState?> loadingState) { + late final divider = Divider( + indent: 72, + endIndent: 20, + height: 6, + color: Colors.grey.withValues(alpha: 0.1), + ); return switch (loadingState) { Loading() => SliverList.builder( itemCount: 12, @@ -152,14 +158,7 @@ class _AtMePageState extends State { : null, ); }, - separatorBuilder: (BuildContext context, int index) { - return Divider( - indent: 72, - endIndent: 20, - height: 6, - color: Colors.grey.withValues(alpha: 0.1), - ); - }, + separatorBuilder: (context, index) => divider, ) : HttpError(onReload: _atMeController.onReload), Error(:var errMsg) => HttpError( diff --git a/lib/pages/msg_feed_top/like_me/view.dart b/lib/pages/msg_feed_top/like_me/view.dart index a16dfd943..6fc58a71e 100644 --- a/lib/pages/msg_feed_top/like_me/view.dart +++ b/lib/pages/msg_feed_top/like_me/view.dart @@ -65,6 +65,12 @@ class _LikeMePageState extends State { } Widget _buildBody(ThemeData theme, LoadingState loadingState) { + late final divider = Divider( + indent: 72, + endIndent: 20, + height: 6, + color: Colors.grey.withValues(alpha: 0.1), + ); return switch (loadingState) { Loading() => SliverList.builder( itemCount: 12, @@ -99,14 +105,7 @@ class _LikeMePageState extends State { ); }, itemCount: latest.length, - separatorBuilder: (BuildContext context, int index) { - return Divider( - indent: 72, - endIndent: 20, - height: 6, - color: Colors.grey.withValues(alpha: 0.1), - ); - }, + separatorBuilder: (context, index) => divider, ), ], if (total.isNotEmpty) ...[ @@ -129,14 +128,7 @@ class _LikeMePageState extends State { ); }, itemCount: total.length, - separatorBuilder: (BuildContext context, int index) { - return Divider( - indent: 72, - endIndent: 20, - height: 6, - color: Colors.grey.withValues(alpha: 0.1), - ); - }, + separatorBuilder: (context, index) => divider, ), ], ], diff --git a/lib/pages/msg_feed_top/reply_me/view.dart b/lib/pages/msg_feed_top/reply_me/view.dart index 0acc94744..e784b270a 100644 --- a/lib/pages/msg_feed_top/reply_me/view.dart +++ b/lib/pages/msg_feed_top/reply_me/view.dart @@ -65,6 +65,12 @@ class _ReplyMePageState extends State { Widget _buildBody( ThemeData theme, LoadingState?> loadingState) { + late final divider = Divider( + indent: 72, + endIndent: 20, + height: 6, + color: Colors.grey.withValues(alpha: 0.1), + ); return switch (loadingState) { Loading() => SliverList.builder( itemCount: 12, @@ -166,14 +172,7 @@ class _ReplyMePageState extends State { ), ); }, - separatorBuilder: (BuildContext context, int index) { - return Divider( - indent: 72, - endIndent: 20, - height: 6, - color: Colors.grey.withValues(alpha: 0.1), - ); - }, + separatorBuilder: (context, index) => divider, ) : HttpError(onReload: _replyMeController.onReload), Error(:var errMsg) => HttpError( diff --git a/lib/pages/msg_feed_top/sys_msg/view.dart b/lib/pages/msg_feed_top/sys_msg/view.dart index acc05ee75..729dec92e 100644 --- a/lib/pages/msg_feed_top/sys_msg/view.dart +++ b/lib/pages/msg_feed_top/sys_msg/view.dart @@ -50,6 +50,12 @@ class _SysMsgPageState extends State { Widget _buildBody( ThemeData theme, LoadingState?> loadingState) { + late final divider = Divider( + indent: 72, + endIndent: 20, + height: 6, + color: Colors.grey.withValues(alpha: 0.1), + ); return switch (loadingState) { Loading() => SliverSafeArea( sliver: SliverList.builder( @@ -107,14 +113,7 @@ class _SysMsgPageState extends State { ), ); }, - separatorBuilder: (BuildContext context, int index) { - return Divider( - indent: 72, - endIndent: 20, - height: 6, - color: Colors.grey.withValues(alpha: 0.1), - ); - }, + separatorBuilder: (context, index) => divider, ) : HttpError(onReload: _sysMsgController.onReload), Error(:var errMsg) => HttpError( diff --git a/lib/pages/pgc_review/child/view.dart b/lib/pages/pgc_review/child/view.dart index ed495e0a5..f670f6072 100644 --- a/lib/pages/pgc_review/child/view.dart +++ b/lib/pages/pgc_review/child/view.dart @@ -73,6 +73,10 @@ class _PgcReviewChildPageState extends State Widget _buildBody( ThemeData theme, LoadingState?> loadingState) { + late final divider = Divider( + height: 1, + color: theme.colorScheme.outline.withValues(alpha: 0.1), + ); return switch (loadingState) { Loading() => SliverToBoxAdapter( child: ListView.builder( @@ -93,10 +97,7 @@ class _PgcReviewChildPageState extends State return _itemWidget(theme, index, response[index]); }, itemCount: response!.length, - separatorBuilder: (context, index) => Divider( - height: 1, - color: theme.colorScheme.outline.withValues(alpha: 0.1), - ), + separatorBuilder: (context, index) => divider, ) : HttpError(onReload: _controller.onReload), Error(:var errMsg) => HttpError( diff --git a/lib/pages/search_trending/view.dart b/lib/pages/search_trending/view.dart index 68ba30e92..d83bfe4cf 100644 --- a/lib/pages/search_trending/view.dart +++ b/lib/pages/search_trending/view.dart @@ -142,6 +142,11 @@ class _SearchTrendingPageState extends State { Widget _buildBody(ThemeData theme, LoadingState?> loadingState) { + late final divider = Divider( + height: 1, + indent: 48, + color: theme.colorScheme.outline.withValues(alpha: 0.1), + ); return switch (loadingState) { Loading() => const SliverToBoxAdapter(child: LinearProgressIndicator()), Success(:var response) => response?.isNotEmpty == true @@ -206,11 +211,7 @@ class _SearchTrendingPageState extends State { ), ); }, - separatorBuilder: (context, index) => Divider( - height: 1, - indent: 48, - color: theme.colorScheme.outline.withValues(alpha: 0.1), - ), + separatorBuilder: (context, index) => divider, ) : HttpError( onReload: _controller.onReload, diff --git a/lib/pages/sponsor_block/view.dart b/lib/pages/sponsor_block/view.dart index a918ce315..8d6aa35d4 100644 --- a/lib/pages/sponsor_block/view.dart +++ b/lib/pages/sponsor_block/view.dart @@ -417,13 +417,13 @@ class _SponsorBlockPageState extends State { color: theme.colorScheme.outline, ); - final divider = SliverToBoxAdapter( - child: Divider( - height: 1, - color: theme.colorScheme.outline.withValues(alpha: 0.1), - ), + final divider = Divider( + height: 1, + color: theme.colorScheme.outline.withValues(alpha: 0.1), ); + final sliverDivider = SliverToBoxAdapter(child: divider); + final dividerL = SliverToBoxAdapter( child: Divider( thickness: 16, @@ -440,9 +440,9 @@ class _SponsorBlockPageState extends State { dividerL, SliverToBoxAdapter( child: _blockLimitItem(theme, titleStyle, subTitleStyle)), - divider, + sliverDivider, SliverToBoxAdapter(child: _blockToastItem(titleStyle)), - divider, + sliverDivider, SliverToBoxAdapter(child: _blockTrackItem(titleStyle, subTitleStyle)), dividerL, SliverList.separated( @@ -536,15 +536,12 @@ class _SponsorBlockPageState extends State { ), ), ), - separatorBuilder: (context, index) => Divider( - height: 1, - color: theme.colorScheme.outline.withValues(alpha: 0.1), - ), + separatorBuilder: (context, index) => divider, ), dividerL, SliverToBoxAdapter( child: _userIdItem(theme, titleStyle, subTitleStyle)), - divider, + sliverDivider, SliverToBoxAdapter( child: _blockServerItem(theme, titleStyle, subTitleStyle)), dividerL, diff --git a/lib/pages/video/note/view.dart b/lib/pages/video/note/view.dart index ea74a410f..f30fb979f 100644 --- a/lib/pages/video/note/view.dart +++ b/lib/pages/video/note/view.dart @@ -160,6 +160,10 @@ class _NoteListPageState extends CommonSlidePageState { Widget _buildBody( ThemeData theme, LoadingState?> loadingState) { + late final divider = Divider( + height: 1, + color: theme.colorScheme.outline.withValues(alpha: 0.1), + ); return switch (loadingState) { Loading() => SliverToBoxAdapter( child: ListView.builder( @@ -180,10 +184,7 @@ class _NoteListPageState extends CommonSlidePageState { return _itemWidget(theme, response[index]); }, itemCount: response!.length, - separatorBuilder: (context, index) => Divider( - height: 1, - color: theme.colorScheme.outline.withValues(alpha: 0.1), - ), + separatorBuilder: (context, index) => divider, ) : HttpError(onReload: _controller.onReload), Error(:var errMsg) => HttpError( diff --git a/lib/pages/video/view_point/view.dart b/lib/pages/video/view_point/view.dart index 76af3fe68..f66b695aa 100644 --- a/lib/pages/video/view_point/view.dart +++ b/lib/pages/video/view_point/view.dart @@ -87,6 +87,10 @@ class _ViewPointsPageState @override Widget buildList(ThemeData theme) { + final divider = Divider( + height: 1, + color: theme.dividerColor.withValues(alpha: 0.1), + ); return ListView.separated( controller: ScrollController(), physics: const AlwaysScrollableScrollPhysics(), @@ -157,10 +161,7 @@ class _ViewPointsPageState ), ); }, - separatorBuilder: (context, index) => Divider( - height: 1, - color: theme.dividerColor.withValues(alpha: 0.1), - ), + separatorBuilder: (context, index) => divider, ); } } diff --git a/lib/pages/whisper/view.dart b/lib/pages/whisper/view.dart index df80e407b..a28e207a5 100644 --- a/lib/pages/whisper/view.dart +++ b/lib/pages/whisper/view.dart @@ -86,6 +86,12 @@ class _WhisperPageState extends State { } Widget _buildBody(LoadingState?> loadingState) { + late final divider = Divider( + indent: 72, + endIndent: 20, + height: 1, + color: Colors.grey.withValues(alpha: 0.1), + ); return switch (loadingState) { Loading() => SliverList.builder( itemCount: 12, @@ -109,12 +115,7 @@ class _WhisperPageState extends State { onRemove: (talkerId) => _controller.onRemove(index, talkerId), ); }, - separatorBuilder: (context, index) => Divider( - indent: 72, - endIndent: 20, - height: 1, - color: Colors.grey.withValues(alpha: 0.1), - ), + separatorBuilder: (context, index) => divider, ) : HttpError( onReload: _controller.onReload, diff --git a/lib/pages/whisper_detail/view.dart b/lib/pages/whisper_detail/view.dart index b49fb3c18..3fd4a2950 100644 --- a/lib/pages/whisper_detail/view.dart +++ b/lib/pages/whisper_detail/view.dart @@ -168,8 +168,7 @@ class _WhisperDetailPageState : null, ); }, - separatorBuilder: (BuildContext context, int index) => - const SizedBox(height: 12), + separatorBuilder: (context, index) => const SizedBox(height: 12), ) : scrollErrorWidget( onReload: _whisperDetailController.onReload, diff --git a/lib/pages/whisper_secondary/view.dart b/lib/pages/whisper_secondary/view.dart index fa46d2e09..1f5e67144 100644 --- a/lib/pages/whisper_secondary/view.dart +++ b/lib/pages/whisper_secondary/view.dart @@ -77,6 +77,12 @@ class _WhisperSecPageState extends State { } Widget _buildBody(LoadingState?> loadingState) { + late final divider = Divider( + indent: 72, + endIndent: 20, + height: 1, + color: Colors.grey.withValues(alpha: 0.1), + ); return switch (loadingState) { Loading() => SliverList.builder( itemCount: 12, @@ -100,12 +106,7 @@ class _WhisperSecPageState extends State { onRemove: (talkerId) => _controller.onRemove(index, talkerId), ); }, - separatorBuilder: (context, index) => Divider( - indent: 72, - endIndent: 20, - height: 1, - color: Colors.grey.withValues(alpha: 0.1), - ), + separatorBuilder: (context, index) => divider, ) : HttpError( onReload: _controller.onReload, diff --git a/lib/pages/whisper_settings/view.dart b/lib/pages/whisper_settings/view.dart index 35e2c1a11..c28bb4b89 100644 --- a/lib/pages/whisper_settings/view.dart +++ b/lib/pages/whisper_settings/view.dart @@ -145,6 +145,10 @@ class _WhisperSettingsPageState extends State { Widget _buildBody( ThemeData theme, LoadingState> loadingState) { + late final divider = Divider( + height: 1, + color: theme.colorScheme.outline.withValues(alpha: 0.1), + ); return switch (loadingState) { Loading() => const SizedBox.shrink(), Success>(:var response) => @@ -163,10 +167,7 @@ class _WhisperSettingsPageState extends State { onRedirect: () => onRedirect(theme, key, response, item), ); }, - separatorBuilder: (context, index) => Divider( - height: 1, - color: theme.colorScheme.outline.withValues(alpha: 0.1), - ), + separatorBuilder: (context, index) => divider, ); }), Error(:var errMsg) => scrollErrorWidget(