Show draggable scrollbar only for galleries with a sufficient number of entries
This commit is contained in:
parent
a1e68d54a6
commit
08bb9e0870
1 changed files with 25 additions and 4 deletions
|
@ -47,13 +47,16 @@ class _GalleryState extends State<Gallery> {
|
|||
|
||||
final Logger _logger = Logger("Gallery");
|
||||
final List<List<File>> _collatedFiles = List<List<File>>();
|
||||
final _scrollController = ItemScrollController();
|
||||
final _itemScrollController = ItemScrollController();
|
||||
final _itemPositionsListener = ItemPositionsListener.create();
|
||||
final _scrollKey = GlobalKey<DraggableScrollbarState>();
|
||||
|
||||
ScrollController _scrollController = ScrollController();
|
||||
double _scrollOffset = 0;
|
||||
bool _requiresLoad = false;
|
||||
bool _hasLoadedAll = false;
|
||||
bool _isLoadingNext = false;
|
||||
bool _hasDraggableScrollbar = false;
|
||||
List<File> _files;
|
||||
int _lastIndex = 0;
|
||||
|
||||
|
@ -70,7 +73,9 @@ class _GalleryState extends State<Gallery> {
|
|||
});
|
||||
}
|
||||
widget.selectedFiles.addListener(() {
|
||||
setState(() {});
|
||||
setState(() {
|
||||
_saveScrollPosition();
|
||||
});
|
||||
});
|
||||
if (widget.asyncLoader == null || widget.shouldLoadAll) {
|
||||
_hasLoadedAll = true;
|
||||
|
@ -119,6 +124,17 @@ class _GalleryState extends State<Gallery> {
|
|||
_collateFiles();
|
||||
final itemCount =
|
||||
_collatedFiles.length + (widget.headerWidget == null ? 1 : 2);
|
||||
_hasDraggableScrollbar = itemCount > 25 || _files.length > 50;
|
||||
if (!_hasDraggableScrollbar) {
|
||||
_scrollController = ScrollController(initialScrollOffset: _scrollOffset);
|
||||
return ListView.builder(
|
||||
itemCount: itemCount,
|
||||
itemBuilder: _buildListItem,
|
||||
controller: _scrollController,
|
||||
cacheExtent: 1500,
|
||||
addAutomaticKeepAlives: true,
|
||||
);
|
||||
}
|
||||
return DraggableScrollbar.semicircle(
|
||||
key: _scrollKey,
|
||||
initialScrollIndex: _lastIndex,
|
||||
|
@ -143,12 +159,12 @@ class _GalleryState extends State<Gallery> {
|
|||
return;
|
||||
}
|
||||
_lastIndex = index;
|
||||
_scrollController.jumpTo(index: index);
|
||||
_itemScrollController.jumpTo(index: index);
|
||||
},
|
||||
child: ScrollablePositionedList.builder(
|
||||
itemCount: itemCount,
|
||||
itemBuilder: _buildListItem,
|
||||
itemScrollController: _scrollController,
|
||||
itemScrollController: _itemScrollController,
|
||||
initialScrollIndex: _lastIndex,
|
||||
minCacheExtent: 1500,
|
||||
addAutomaticKeepAlives: true,
|
||||
|
@ -202,6 +218,7 @@ class _GalleryState extends State<Gallery> {
|
|||
widget.asyncLoader(_files[_files.length - 1], kLoadLimit).then((files) {
|
||||
setState(() {
|
||||
_isLoadingNext = false;
|
||||
_saveScrollPosition();
|
||||
if (files.length < kLoadLimit) {
|
||||
_hasLoadedAll = true;
|
||||
}
|
||||
|
@ -210,6 +227,10 @@ class _GalleryState extends State<Gallery> {
|
|||
});
|
||||
}
|
||||
|
||||
void _saveScrollPosition() {
|
||||
_scrollOffset = _scrollController.offset;
|
||||
}
|
||||
|
||||
Widget _getDay(int timestamp) {
|
||||
var date = DateTime.fromMicrosecondsSinceEpoch(timestamp);
|
||||
var title = getDayAndMonth(date);
|
||||
|
|
Loading…
Add table
Reference in a new issue