diff --git a/mobile/lib/widgets/asset_grid/asset_grid_data_structure.dart b/mobile/lib/widgets/asset_grid/asset_grid_data_structure.dart index 5ed9b9d21f..64803046ef 100644 --- a/mobile/lib/widgets/asset_grid/asset_grid_data_structure.dart +++ b/mobile/lib/widgets/asset_grid/asset_grid_data_structure.dart @@ -147,10 +147,19 @@ class RenderList { if (groupBy == GroupAssetsBy.none) { final int total = assets?.length ?? query!.countSync(); + + final dateLoader = query != null + ? DateBatchLoader( + query: query, + batchSize: 1000 * sectionSize, + ) + : null; + for (int i = 0; i < total; i += sectionSize) { final date = assets != null ? assets[i].fileCreatedAt - : await query!.offset(i).fileCreatedAtProperty().findFirst(); + : await dateLoader?.getDate(i); + final int count = i + sectionSize > total ? total - i : sectionSize; if (date == null) break; elements.add( @@ -320,3 +329,44 @@ class RenderList { _bufOffset = 0; } } + +class DateBatchLoader { + final QueryBuilder query; + final int batchSize; + + List _buffer = []; + int _bufferStart = 0; + + DateBatchLoader({ + required this.query, + required this.batchSize, + }); + + Future getDate(int index) async { + if (!_isIndexInBuffer(index)) { + await _loadBatch(index); + } + + if (_isIndexInBuffer(index)) { + return _buffer[index - _bufferStart]; + } + + return null; + } + + Future _loadBatch(int targetIndex) async { + final batchStart = (targetIndex ~/ batchSize) * batchSize; + + _buffer = await query + .offset(batchStart) + .limit(batchSize) + .fileCreatedAtProperty() + .findAll(); + + _bufferStart = batchStart; + } + + bool _isIndexInBuffer(int index) { + return index >= _bufferStart && index < _bufferStart + _buffer.length; + } +}