fix(gallery): groups in gallery show old state when scrolling back to them after updation

This commit is contained in:
ashilkn 2023-10-05 18:53:43 +05:30
parent 0762f50815
commit f44013349f
2 changed files with 20 additions and 12 deletions

View file

@ -137,10 +137,18 @@ class _LazyGroupGalleryState extends State<LazyGroupGallery> {
dayStartTime.microsecondsSinceEpoch + microSecondsInDay - 1,
asc: GalleryContextState.of(context)!.sortOrderAsc,
);
if (mounted) {
setState(() {
_files = result.files;
});
//When items are updated in a LazyGroupGallery, only it rebuilds with the
//new state of _files which is a state variable in it's state object.
//widget.files does not change as the Widget itself is immutable. So
//to create a new Widget of LazyLoadingGallery with the updated
//widget.files, we have to call setState from an ancestor state object.
//[galleryState] will never be null except when LazyLoadingGallery is
//used without Gallery as an ancestor.
final galleryState = context.findAncestorStateOfType<GalleryState>();
if (galleryState?.mounted ?? false) {
galleryState!.setState(() {});
_files = result.files;
}
} else if (kDebugMode) {
debugPrint("Unexpected event ${event.type.name}");

View file

@ -83,15 +83,15 @@ class Gallery extends StatefulWidget {
@override
State<Gallery> createState() {
return _GalleryState();
return GalleryState();
}
}
class _GalleryState extends State<Gallery> {
class GalleryState extends State<Gallery> {
static const int kInitialLoadLimit = 100;
late Logger _logger;
List<List<EnteFile>> _currentGroupedFiles = [];
List<List<EnteFile>> currentGroupedFiles = [];
bool _hasLoadedFiles = false;
late ItemScrollController _itemScroller;
StreamSubscription<FilesUpdatedEvent>? _reloadEventSubscription;
@ -197,17 +197,17 @@ class _GalleryState extends State<Gallery> {
bool _onFilesLoaded(List<EnteFile> files) {
final updatedGroupedFiles =
widget.enableFileGrouping ? _groupFiles(files) : [files];
if (_currentGroupedFiles.length != updatedGroupedFiles.length ||
_currentGroupedFiles.isEmpty) {
if (currentGroupedFiles.length != updatedGroupedFiles.length ||
currentGroupedFiles.isEmpty) {
if (mounted) {
setState(() {
_hasLoadedFiles = true;
_currentGroupedFiles = updatedGroupedFiles;
currentGroupedFiles = updatedGroupedFiles;
});
}
return true;
} else {
_currentGroupedFiles = updatedGroupedFiles;
currentGroupedFiles = updatedGroupedFiles;
return false;
}
}
@ -233,7 +233,7 @@ class _GalleryState extends State<Gallery> {
inSelectionMode: widget.inSelectionMode,
child: MultipleGroupsGalleryView(
itemScroller: _itemScroller,
groupedFiles: _currentGroupedFiles,
groupedFiles: currentGroupedFiles,
disableScroll: widget.disableScroll,
emptyState: widget.emptyState,
asyncLoader: widget.asyncLoader,