diff --git a/lib/ui/gallery.dart b/lib/ui/gallery.dart index 43aa905ad..608c80cc1 100644 --- a/lib/ui/gallery.dart +++ b/lib/ui/gallery.dart @@ -35,6 +35,9 @@ class Gallery extends StatefulWidget { class _GalleryState extends State { final ScrollController _scrollController = ScrollController(); final List> _collatedPhotos = List>(); + + bool _requiresLoad = false; + AsyncSnapshot> _lastSnapshot; Set _selectedPhotos = HashSet(); List _photos; RefreshController _refreshController = RefreshController(); @@ -43,6 +46,7 @@ class _GalleryState extends State { @override void initState() { + _requiresLoad = true; _subscription = Bus.instance.on().listen((event) { setState(() { _openedPhoto = event.photo; @@ -59,26 +63,34 @@ class _GalleryState extends State { @override Widget build(BuildContext context) { - // TODO: Investigate reason for multiple rebuilds on selection change + if (!_requiresLoad) { + return _onSnapshotAvailable(_lastSnapshot); + } return FutureBuilder>( future: widget.loadFunction(), builder: (context, snapshot) { - if (snapshot.hasData) { - return _onDataLoaded(snapshot); - } else if (snapshot.hasError) { - return Center(child: Text(snapshot.error.toString())); - } else { - return Center(child: loadWidget); - } + _requiresLoad = false; + _lastSnapshot = snapshot; + return _onSnapshotAvailable(snapshot); }, ); } - Widget _onDataLoaded(AsyncSnapshot> snapshot) { - if (snapshot.data.isEmpty) { + Widget _onSnapshotAvailable(AsyncSnapshot> snapshot) { + if (snapshot.hasData) { + return _onDataLoaded(snapshot.data); + } else if (snapshot.hasError) { + return Center(child: Text(snapshot.error.toString())); + } else { + return Center(child: loadWidget); + } + } + + Widget _onDataLoaded(List photos) { + _photos = photos; + if (_photos.isEmpty) { return Center(child: Text("Nothing to see here.")); } - _photos = snapshot.data; _selectedPhotos = widget.selectedPhotos ?? Set(); _collatePhotos(); final list = ListView.builder( @@ -101,7 +113,9 @@ class _GalleryState extends State { onRefresh: () { widget.syncFunction().then((_) { _refreshController.refreshCompleted(); - widget.loadFunction().then((_) => setState(() {})); + widget.loadFunction().then((_) => setState(() { + _requiresLoad = true; + })); }).catchError((e) { _refreshController.refreshFailed(); });