diff --git a/lib/features/documents/view/pages/documents_page.dart b/lib/features/documents/view/pages/documents_page.dart index 03886c0..140c999 100644 --- a/lib/features/documents/view/pages/documents_page.dart +++ b/lib/features/documents/view/pages/documents_page.dart @@ -18,7 +18,6 @@ import 'package:paperless_mobile/features/saved_view/cubit/saved_view_cubit.dart import 'package:paperless_mobile/features/saved_view/view/add_saved_view_page.dart'; import 'package:paperless_mobile/features/saved_view/view/saved_view_list.dart'; import 'package:paperless_mobile/features/search_app_bar/view/search_app_bar.dart'; -import 'package:paperless_mobile/features/settings/model/view_type.dart'; import 'package:paperless_mobile/features/tasks/cubit/task_status_cubit.dart'; import 'package:paperless_mobile/generated/l10n.dart'; import 'package:paperless_mobile/helpers/message_helpers.dart'; @@ -243,67 +242,68 @@ class _DocumentsPageState extends State children: [ Builder( builder: (context) { + final itemHeight = + MediaQuery.sizeOf(context).height - + MediaQuery.viewInsetsOf(context).bottom - + MediaQuery.viewInsetsOf(context).top - + kToolbarHeight - + kTextTabBarHeight - + 56; return RefreshIndicator( edgeOffset: kToolbarHeight + kTextTabBarHeight, onRefresh: _onReloadDocuments, notificationPredicate: (_) => connectivityState.isConnected, - child: + child: CustomScrollView( + key: const PageStorageKey("documents"), + slivers: [ + SliverOverlapInjector( + handle: NestedScrollView + .sliverOverlapAbsorberHandleFor( + context), + ), + _buildViewActions(), BlocBuilder( - builder: (context, state) { - return CustomScrollView( - key: const PageStorageKey( - "documents"), - slivers: [ - SliverOverlapInjector( - handle: NestedScrollView - .sliverOverlapAbsorberHandleFor( - context), - ), - _buildViewActions(), - Builder( - builder: (context) { - if (state.hasLoaded && - state.documents.isEmpty) { - return SliverToBoxAdapter( - child: DocumentsEmptyState( - state: state, - onReset: () { - context - .read() - .resetFilter(); - }, - ), - ); - } + builder: (context, state) { + if (state.hasLoaded && + state.documents.isEmpty) { + return SliverToBoxAdapter( + child: DocumentsEmptyState( + state: state, + onReset: () { + context + .read() + .resetFilter(); + }, + ), + ); + } - return SliverAdaptiveDocumentsView( - viewType: state.viewType, - onTap: _openDetails, - onSelected: context - .read() - .toggleDocumentSelection, - hasInternetConnection: - connectivityState.isConnected, - onTagSelected: _addTagToFilter, - onCorrespondentSelected: - _addCorrespondentToFilter, - onDocumentTypeSelected: - _addDocumentTypeToFilter, - onStoragePathSelected: - _addStoragePathToFilter, - documents: state.documents, - hasLoaded: state.hasLoaded, - isLabelClickable: true, - isLoading: state.isLoading, - selectedDocumentIds: - state.selectedIds, - ); - }, - ), - ], - ); - }, + return SliverAdaptiveDocumentsView( + viewType: state.viewType, + maxItemExtent: itemHeight, + onTap: _openDetails, + onSelected: context + .read() + .toggleDocumentSelection, + hasInternetConnection: + connectivityState.isConnected, + onTagSelected: _addTagToFilter, + onCorrespondentSelected: + _addCorrespondentToFilter, + onDocumentTypeSelected: + _addDocumentTypeToFilter, + onStoragePathSelected: + _addStoragePathToFilter, + documents: state.documents, + hasLoaded: state.hasLoaded, + isLabelClickable: true, + isLoading: state.isLoading, + selectedDocumentIds: state.selectedIds, + ); + }, + ), + ], ), ); }, diff --git a/lib/features/documents/view/widgets/adaptive_documents_view.dart b/lib/features/documents/view/widgets/adaptive_documents_view.dart index fd88235..be9338f 100644 --- a/lib/features/documents/view/widgets/adaptive_documents_view.dart +++ b/lib/features/documents/view/widgets/adaptive_documents_view.dart @@ -23,6 +23,7 @@ abstract class AdaptiveDocumentsView extends StatelessWidget { final void Function(int? id)? onCorrespondentSelected; final void Function(int? id)? onDocumentTypeSelected; final void Function(int? id)? onStoragePathSelected; + final double maxItemExtent; bool get showLoadingPlaceholder => (!hasLoaded && isLoading); const AdaptiveDocumentsView({ @@ -41,6 +42,7 @@ abstract class AdaptiveDocumentsView extends StatelessWidget { required this.isLoading, required this.hasLoaded, this.enableHeroAnimation = true, + required this.maxItemExtent, }); } @@ -61,6 +63,7 @@ class SliverAdaptiveDocumentsView extends AdaptiveDocumentsView { super.enableHeroAnimation, required super.isLoading, required super.hasLoaded, + super.maxItemExtent = double.infinity, }); @override @@ -71,7 +74,7 @@ class SliverAdaptiveDocumentsView extends AdaptiveDocumentsView { case ViewType.list: return _buildListView(); case ViewType.detailed: - return _buildFullView(); + return _buildFullView(context); } } @@ -104,18 +107,19 @@ class SliverAdaptiveDocumentsView extends AdaptiveDocumentsView { ); } - Widget _buildFullView() { + Widget _buildFullView(BuildContext context) { if (showLoadingPlaceholder) { //TODO: Build detailed loading animation return DocumentsListLoadingWidget.sliver(); } - return SliverList( + return SliverFixedExtentList( + itemExtent: maxItemExtent, delegate: SliverChildBuilderDelegate( childCount: documents.length, (context, index) { final document = documents.elementAt(index); return LabelRepositoriesProvider( - child: DocumentDetailedItem( + child: DocumentGridItem( isLabelClickable: isLabelClickable, document: document, onTap: onTap, @@ -185,6 +189,7 @@ class DefaultAdaptiveDocumentsView extends AdaptiveDocumentsView { super.selectedDocumentIds, super.viewType, super.enableHeroAnimation = true, + super.maxItemExtent = double.infinity, }); @override diff --git a/lib/features/documents/view/widgets/items/document_detailed_item.dart b/lib/features/documents/view/widgets/items/document_detailed_item.dart index 2ab6115..e22677b 100644 --- a/lib/features/documents/view/widgets/items/document_detailed_item.dart +++ b/lib/features/documents/view/widgets/items/document_detailed_item.dart @@ -1,4 +1,3 @@ - import 'package:flutter/material.dart'; import 'package:paperless_mobile/features/documents/view/widgets/document_preview.dart'; import 'package:paperless_mobile/features/documents/view/widgets/items/document_item.dart';