From 08ea9997d4d301d7af665d42e6c2c053f7af71e6 Mon Sep 17 00:00:00 2001 From: orz12 Date: Fri, 12 Jul 2024 23:18:22 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=90=88=E9=9B=86=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=8F=8D=E5=BA=8F=EF=BC=8C=E8=B7=B3=E8=87=B3?= =?UTF-8?q?=E9=A1=B6=E9=83=A8/=E5=BA=95=E9=83=A8=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/common/widgets/list_sheet.dart | 57 ++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 15 deletions(-) diff --git a/lib/common/widgets/list_sheet.dart b/lib/common/widgets/list_sheet.dart index 7fd2ed8a..2b4d195b 100644 --- a/lib/common/widgets/list_sheet.dart +++ b/lib/common/widgets/list_sheet.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; +import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; import '../../utils/storage.dart'; @@ -21,6 +22,7 @@ class ListSheet { required this.changeFucCall, required this.context, }); + bool reverse = false; Widget buildEpisodeListItem( dynamic episode, @@ -114,12 +116,41 @@ class ListSheet { height: 45, padding: const EdgeInsets.only(left: 14, right: 14), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( '合集(${episodes!.length})', style: Theme.of(context).textTheme.titleMedium, ), + IconButton( + tooltip: '跳至顶部', + icon: const Icon(Icons.vertical_align_top), + onPressed: () { + itemScrollController.jumpTo( + index: !reverse ? 0 : episodes!.length - 1, + ); + }, + ), + IconButton( + tooltip: '跳至底部', + icon: const Icon(Icons.vertical_align_bottom), + onPressed: () { + itemScrollController.jumpTo( + index: !reverse ? episodes!.length - 1 : 0, + ); + }, + ), + const Spacer(), + IconButton( + tooltip: '反序', + icon: Icon(!reverse + ? MdiIcons.sortAscending + : MdiIcons.sortDescending), + onPressed: () { + setState(() { + reverse = !reverse; + }); + }, + ), IconButton( tooltip: '关闭', icon: const Icon(Icons.close), @@ -135,21 +166,17 @@ class ListSheet { Expanded( child: Material( child: ScrollablePositionedList.builder( - itemCount: episodes!.length + 1, + padding: EdgeInsets.only( + bottom: MediaQuery.of(context).padding.bottom + 20), + reverse: reverse, + itemCount: episodes!.length, itemBuilder: (BuildContext context, int index) { - bool isLastItem = index == episodes!.length; - bool isCurrentIndex = currentIndex == index; - return isLastItem - ? SizedBox( - height: - MediaQuery.of(context).padding.bottom + 20, - ) - : buildEpisodeListItem( - episodes![index], - index, - isCurrentIndex, - bottomSheetController!, - ); + return buildEpisodeListItem( + episodes![index], + index, + currentIndex == index, + bottomSheetController!, + ); }, itemScrollController: itemScrollController, ),