diff --git a/lib/ui/device_folder_page.dart b/lib/ui/device_folder_page.dart index 6e06c828a..f632395fb 100644 --- a/lib/ui/device_folder_page.dart +++ b/lib/ui/device_folder_page.dart @@ -47,8 +47,8 @@ class _DeviceFolderPageState extends State { }, ), body: Gallery( - _getFilteredPhotos(PhotoRepository.instance.photos), - _selectedPhotos, + () => Future.value(_getFilteredPhotos(PhotoRepository.instance.photos)), + selectedPhotos: _selectedPhotos, photoSelectionChangeCallback: (Set selectedPhotos) { setState(() { _selectedPhotos = selectedPhotos; diff --git a/lib/ui/face_search_results_page.dart b/lib/ui/face_search_results_page.dart index d9ad03f2b..abd40b9a0 100644 --- a/lib/ui/face_search_results_page.dart +++ b/lib/ui/face_search_results_page.dart @@ -2,10 +2,8 @@ import 'package:flutter/material.dart'; import 'package:photos/core/configuration.dart'; import 'package:photos/face_search_manager.dart'; import 'package:photos/models/face.dart'; -import 'package:photos/models/photo.dart'; import 'package:photos/ui/circular_network_image_widget.dart'; import 'package:photos/ui/gallery.dart'; -import 'package:photos/ui/loading_widget.dart'; class FaceSearchResultsPage extends StatelessWidget { final FaceSearchManager _faceSearchManager = FaceSearchManager.instance; @@ -27,24 +25,10 @@ class FaceSearchResultsPage extends StatelessWidget { ], ), body: Container( - child: _getBody(), + child: Gallery( + () => _faceSearchManager.getFaceSearchResults(face), + ), ), ); } - - FutureBuilder> _getBody() { - return FutureBuilder>( - future: _faceSearchManager.getFaceSearchResults(face), - builder: (context, snapshot) { - if (snapshot.hasData) { - return Gallery( - snapshot.data, - Set(), - ); - } else { - return Center(child: loadWidget); - } - }, - ); - } } diff --git a/lib/ui/gallery.dart b/lib/ui/gallery.dart index 4d1476ce2..43aa905ad 100644 --- a/lib/ui/gallery.dart +++ b/lib/ui/gallery.dart @@ -8,18 +8,23 @@ import 'package:photos/core/event_bus.dart'; import 'package:photos/events/photo_opened_event.dart'; import 'package:photos/models/photo.dart'; import 'package:photos/ui/detail_page.dart'; +import 'package:photos/ui/loading_widget.dart'; import 'package:photos/ui/thumbnail_widget.dart'; import 'package:photos/utils/date_time_util.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; class Gallery extends StatefulWidget { - final List photos; + final Future> Function() loadFunction; final Set selectedPhotos; final Function(Set) photoSelectionChangeCallback; final Future Function() syncFunction; - Gallery(this.photos, this.selectedPhotos, - {this.photoSelectionChangeCallback, this.syncFunction}); + Gallery( + this.loadFunction, { + this.selectedPhotos, + this.photoSelectionChangeCallback, + this.syncFunction, + }); @override _GalleryState createState() { @@ -55,8 +60,26 @@ class _GalleryState extends State { @override Widget build(BuildContext context) { // TODO: Investigate reason for multiple rebuilds on selection change - _photos = widget.photos; - _selectedPhotos = widget.selectedPhotos; + 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); + } + }, + ); + } + + Widget _onDataLoaded(AsyncSnapshot> snapshot) { + if (snapshot.data.isEmpty) { + return Center(child: Text("Nothing to see here.")); + } + _photos = snapshot.data; + _selectedPhotos = widget.selectedPhotos ?? Set(); _collatePhotos(); final list = ListView.builder( itemCount: _collatedPhotos.length, @@ -76,8 +99,9 @@ class _GalleryState extends State { failedText: "Sync unsuccessful.", ), onRefresh: () { - widget.syncFunction().then((value) { + widget.syncFunction().then((_) { _refreshController.refreshCompleted(); + widget.loadFunction().then((_) => setState(() {})); }).catchError((e) { _refreshController.refreshFailed(); }); diff --git a/lib/ui/home_widget.dart b/lib/ui/home_widget.dart index daa8798b0..a2ead4db8 100644 --- a/lib/ui/home_widget.dart +++ b/lib/ui/home_widget.dart @@ -106,8 +106,8 @@ class _HomeWidgetState extends State { Gallery _getMainGalleryWidget() { return Gallery( - _getFilteredPhotos(PhotoRepository.instance.photos), - _selectedPhotos, + () => Future.value(_getFilteredPhotos(PhotoRepository.instance.photos)), + selectedPhotos: _selectedPhotos, photoSelectionChangeCallback: (Set selectedPhotos) { setState(() { _selectedPhotos = selectedPhotos; diff --git a/lib/ui/location_search_results_page.dart b/lib/ui/location_search_results_page.dart index 37b6ad068..42eb71ed9 100644 --- a/lib/ui/location_search_results_page.dart +++ b/lib/ui/location_search_results_page.dart @@ -38,32 +38,13 @@ class _LocationSearchResultsPageState extends State { title: Text(widget.name), ), body: Container( - child: _getBody(), + child: Gallery( + () => _getResult(), + ), ), ); } - FutureBuilder> _getBody() { - return FutureBuilder>( - future: _getResult(), - builder: (context, snapshot) { - if (snapshot.hasData) { - if (snapshot.data.isEmpty) { - return Center(child: Text("Nothing to see here.")); - } - return Gallery( - snapshot.data, - Set(), - ); - } else if (snapshot.hasError) { - return Center(child: Text(snapshot.error.toString())); - } else { - return Center(child: loadWidget); - } - }, - ); - } - FutureOr> _getResult() async { final photos = PhotoRepository.instance.photos; final args = Map(); diff --git a/lib/ui/remote_folder_page.dart b/lib/ui/remote_folder_page.dart index d713c0f78..4672a6487 100644 --- a/lib/ui/remote_folder_page.dart +++ b/lib/ui/remote_folder_page.dart @@ -4,12 +4,12 @@ import 'package:flutter/material.dart'; import 'package:photos/core/event_bus.dart'; import 'package:photos/db/photo_db.dart'; import 'package:photos/events/remote_sync_event.dart'; +import 'package:photos/folder_service.dart'; import 'package:photos/models/folder.dart'; import 'package:photos/models/photo.dart'; import 'package:photos/ui/gallery.dart'; import 'package:photos/ui/gallery_app_bar_widget.dart'; import 'package:logging/logging.dart'; -import 'package:photos/ui/loading_widget.dart'; class RemoteFolderPage extends StatefulWidget { final Folder folder; @@ -49,24 +49,18 @@ class _RemoteFolderPageState extends State { }); }, ), - body: FutureBuilder>( - future: PhotoDB.instance.getAllPhotosInFolder(widget.folder.id), - builder: (context, snapshot) { - if (snapshot.hasData) { - return Gallery(snapshot.data, _selectedPhotos, - photoSelectionChangeCallback: (Set selectedPhotos) { - setState(() { + body: Gallery( + () => PhotoDB.instance.getAllPhotosInFolder(widget.folder.id), + syncFunction: () => + FolderSharingService.instance.syncDiff(widget.folder), + selectedPhotos: _selectedPhotos, + photoSelectionChangeCallback: (Set selectedPhotos) { + setState( + () { _selectedPhotos = selectedPhotos; - }); - }); - } else if (snapshot.hasError) { - _logger.shout(snapshot.error); - return Text(snapshot.error.toString()); - } else { - return loadWidget; - } - }, - ), + }, + ); + }), ); }