Optimize the startup time further

This commit is contained in:
Vishnu Mohandas 2020-10-31 04:22:22 +05:30
parent ef06cfbea0
commit d4e1754ca4
3 changed files with 42 additions and 31 deletions

View file

@ -15,7 +15,32 @@ class FileRepository {
return _files;
}
bool _hasLoadedFiles = false;
bool get hasLoadedFiles {
return _hasLoadedFiles;
}
Future<List<File>> _cachedFuture;
Future<List<File>> loadFiles() async {
if (_cachedFuture == null) {
_cachedFuture = _loadFiles().then((value) {
_hasLoadedFiles = true;
_cachedFuture = null;
return value;
});
}
return _cachedFuture;
}
Future<void> reloadFiles() async {
_logger.info("Reloading...");
await loadFiles();
Bus.instance.fire(LocalPhotosUpdatedEvent());
}
Future<List<File>> _loadFiles() async {
final files = await FilesDB.instance.getFiles();
final deduplicatedFiles = List<File>();
for (int index = 0; index < files.length; index++) {
@ -34,10 +59,4 @@ class FileRepository {
_files.addAll(deduplicatedFiles);
return _files;
}
Future<void> reloadFiles() async {
_logger.info("Reloading...");
await loadFiles();
Bus.instance.fire(LocalPhotosUpdatedEvent());
}
}

View file

@ -107,23 +107,26 @@ class _CollectionsGalleryWidgetState extends State<CollectionsGalleryWidget> {
Future<CollectionItems> _getCollections() async {
final filesDB = FilesDB.instance;
final filesRepo = FileRepository.instance;
final collectionsService = CollectionsService.instance;
final userID = Configuration.instance.getUserID();
// Query takes ~3 seconds, find out why
final paths = await filesDB.getLocalPaths();
final folders = List<DeviceFolder>();
for (final path in paths) {
final files = List<File>();
for (File file in FileRepository.instance.files) {
if ((file.ownerID == null || file.ownerID == userID) &&
file.deviceFolder == path) {
files.add(file);
}
final files = filesRepo.hasLoadedFiles
? filesRepo.files
: await filesRepo.loadFiles();
final filePathMap = Map<String, List<File>>();
for (final file in files) {
final path = file.deviceFolder;
if (filePathMap[path] == null) {
filePathMap[path] = List<File>();
}
final folderName = p.basename(path);
folders.add(DeviceFolder(folderName, path, () => files, files[0]));
filePathMap[path].add(file);
}
for (final path in filePathMap.keys) {
final folderName = p.basename(path);
folders.add(DeviceFolder(
folderName, path, () => filePathMap[path], filePathMap[path][0]));
}
folders.sort((first, second) {
return second.thumbnail.creationTime
.compareTo(first.thumbnail.creationTime);
@ -132,9 +135,7 @@ class _CollectionsGalleryWidgetState extends State<CollectionsGalleryWidget> {
final collections = collectionsService.getCollections();
final ownedCollectionIDs = List<int>();
for (final c in collections) {
if (c.ownerID != userID) {
continue;
} else {
if (c.ownerID == userID) {
ownedCollectionIDs.add(c.id);
}
}

View file

@ -43,16 +43,10 @@ class _HomeWidgetState extends State<HomeWidget> {
final _memoriesWidget = MemoriesWidget();
int _selectedNavBarItem = 0;
StreamSubscription<LocalPhotosUpdatedEvent>
_localPhotosUpdatedEventSubscription;
StreamSubscription<TabChangedEvent> _tabChangedEventSubscription;
@override
void initState() {
_localPhotosUpdatedEventSubscription =
Bus.instance.on<LocalPhotosUpdatedEvent>().listen((event) {
setState(() {});
});
_tabChangedEventSubscription =
Bus.instance.on<TabChangedEvent>().listen((event) {
setState(() {
@ -143,9 +137,7 @@ class _HomeWidgetState extends State<HomeWidget> {
Widget _getMainGalleryWidget() {
return FutureBuilder(
future: FileRepository.instance.loadFiles().then((files) {
return _getFilteredPhotos(files);
}),
future: FileRepository.instance.loadFiles(),
builder: (context, snapshot) {
if (snapshot.hasData) {
return Gallery(
@ -207,7 +199,6 @@ class _HomeWidgetState extends State<HomeWidget> {
@override
void dispose() {
_localPhotosUpdatedEventSubscription.cancel();
_tabChangedEventSubscription.cancel();
super.dispose();
}